Code前端首页关于Code前端联系我们

使用Docker徒手搭建自己的PHP开发环境

terry 2年前 (2023-09-25) 阅读数 48 #后端开发

1.1 为什么使用Docker?

有这样的场景吗?你有一个项目,在本地开发的时候需要你搭建环境,放到线上的时候也需要搭建环境。到了公司,想要暗中玩,就需要搭建一个环境。如果它们不匹配,那是不够的。因为你有相当多的环境依赖。如果此时你有 Docker,只需在机器上安装 Docker 并放入写入的 Dickerfile。这将通过一行命令自动完成。它实用且高效。那不是很好吗?

1.2 准备工作

接下来,本文介绍如何搭建PHP开发环境。我们将使用 zPhal-docker files 作为示例。这是我为我的博客系统准备的一套Dockerfile。

现在无论是windows、mac还是linux,docker都可以很好的支持,包括windows系统。 win10系统下的Docker for Windows其实还不错,但是占用内存比较多。

通过Docker命令行我们可以做很多事情,拉取镜像、运行容器、执行容器中的命令等等,但是现在我们需要一种更简单粗暴的方式来编写docker文件,那就使用docker-compose管理好这些文件,简化操作流程。

什么是 Dockerfile?
Dockerfile 是由一系列命令和参数组成的脚本。这些命令应用于提取的基础映像并最终创建一个新映像。通过Dockerfile我们可以创建一个你需要的镜像,其中包含你想要安装的信息。该软件相当于提前定制了要安装的扩展、要执行的命令等,然后一键执行,大大简化了操作流程。

要按照本文搭建环境,你需要:

  • 首先了解 Docker 以及 Docker 的一些基本特性以及 docker-compose 是什么。
  • 然后你需要安装Docker和docker-compose,我将使用docker-compose来管理我的docker-files。

注意,编写docker文件是一个活的东西,而不是一个死的东西。每个人写的Dockerfile都会不一样,看你的需求。

Docker的官方文档说得很清楚。虽然是英文的,但是几乎什么都有。如果您有疑问,翻译该文档是非常明智的:Docker Documentation

2。开始输入

下一步是 zPhal- Docker files 就是一个例子。您可以点击链接查看完整版本。以下只是一个片段。 ? 在这个项目中我使用了PHP、MySQL、Nginx、Redis;以及Composer、Phalcon扩展等。

一般来说,我们有三个流程来做到这一点:为每个软件编写docker文件;编写配置文件;通过 docker-compose 处理所有 docker 文件,包括将配置配置文件拖放到将要构建镜像的 dockerfile 文件中。 ?有一个维护者。

接下来,定义时区。该语句定义在每个docker文件中,主要是为了同步所有容器与主机的时间。其实我们可以在docker-composer.yml文件中这样定义:

services:
  php-fpm:
    volumes:
      - /etc/localtime:/etc/localtime:ro

但是当我们运行在非linux系统中,比如Windows时,我们无法获取/etc/localtime。为了更好的兼容所有平台,我将时间同步写入了docker文件中。

然后安装一些扩展。事实上,安装扩展的过程与我们在Linux中徒手安装PHP扩展的过程类似。值得一提的是作曲家。我直接在 php-fpm 镜像中安装了 Composer。事实上,Composer的官方镜像也提供了。拉取composer镜像并执行也可以达到目的,因为我们只是使用composer来执行composer命令来管理我们的包。如果composer是一个单独的容器的话,我们也可以在不使用的时候关闭该容器;但是这里我直接在 php-fpm 镜像中安装了composer,主要是因为我的项目安装了一些PHP扩展,并且在编写composer.json之后,当我编写文件时,我定义了扩展的依赖项,所以当composer执行时会检查环境是否有安装了这些依赖项。所以如果我直接使用composer镜像的话,我还得安装我在镜像中使用的扩展,这比较麻烦,所以我直接在php镜像中这样做了。其实没有什么区别,就看你怎么使用了。

2.2.2 Nginx

以下是Nginx的docker文件:

FROM nginx:1.12

# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

这个就简单多了,我只设置了一个时间。因为我不需要安装其他东西,直接使用官方镜像就可以了。

当然我们需要修改配置文件。只要提前写好配置文件就可以了。最后,在 docker-compose.yml 文件中,放入配置文件。下面会讲到,包括PHP配置文件和MySQL配置文件。 , 全部都一样。

2.2.3 MySQL

以下是MySQL的docker文件:

FROM mysql:5.7

# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

MySQL没有什么特别的,直接使用官方镜像即可。 ? PHP文件夹中,Nginx配置放在Nginx文件夹下。是否新建子文件夹视情况而定,如conf.d文件夹。

下面以Nginx配置文件为例。首先,nginx目录是这样的:

nginx/
    conf.d/
        default.conf
        zphal.conf
    Dockerfile
    nginx.conf

除了nginx.conf之外,还有一个子文件夹conf.d,用于存放Linux下构建的所有域名配置文件。熟悉PHP环境的人应该很熟悉。这些配置文件就是我们当时传输到容器中的文件。我们不会在主机上使用这些文件。

所以最需要注意的是,配置文件中显示的路径是容器中环境的路径,而不是主机的路径。每个容器都有一个运行环境,这是一个小系统,这些路径都是容器内的路径。我们可以使用来挂载来与容器通信来同步文件。在命令行启动容器还需要挂载文件路径。现在我们也使用docker-compose来解决这一步。

以下是配置文件的示例:

server {
    listen   80 default;
    index index.html index.htm;
    server_name localhost docker;

    root /data/www;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~ \.php {
        include fastcgi_params;
        fastcgi_pass   php-fpm:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /data/www/$fastcgi_script_name;
    }
}

并且在 root /data/www/data/gin中,并且是位于 ♷nx 处的容器的路径时间,而不是当前的时间。运行主机的路径,所以到时候我们会将Web应用程序的位置挂载到这个路径上。

2.4 编写docker-compose.yml

与php、nginx等文件夹同级,我们创建一个docker-compose.yml。当我们执行docker-compose相关命令时,会自动找到这个文件并根据里面的内容执行。

继续上面的nginx例子,我们先来说说挂载,因为这是最重要的一步。在docker-compose.yml中,nginx部分:

nginx:
    build: ./nginx
    depends_on:
      - php-fpm
    links:
      - php-fpm:php-fpm
    volumes:
      - ../app:/data/www:rw
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ../logs/nginx:/var/log/nginx
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    restart: always
    command: nginx -g 'daemon off;'

有一个volume参数。这里是我们要挂载的文件夹的相关配置。在第一点中,我们将 ../app 挂载到 /data/www 也是我们的配置文件中定义的默认侦听器根目录,而 app 目录是我们主机中的一个文件夹。通过这种方式挂载,我们就可以直接放我们的工程文件了。对于应用程序,docker会帮助您将其转移到容器中的/data/www文件夹中。

其他参数:

  • build 定义您的 docker 文件所在的位置。如果不写docker文件,就不需要构建。可以使用image参数定义官方镜像,如image:mysql:5.7
  • depends_on 表示它将依赖于其他图像。例如,nginx依赖于php-fpm。没有它,nginx就玩不了;
  • 链接定义连接。例如连接php-fpm容器,就是 php-fpm:php-fpm ,后面跟一个别名;
  • ports 表示端口映射,80:80 表示将 80 端口映射到主机上的 80 端口
  • reboot、reboot❀automatic:
  • 命令是自动执行的命令 ......

参数很多。更多信息请参考官方文档。

以下是完整的docker-compose.yml文件:

version: '3.2'
services:
  php-fpm:
    build: ./php/
    ports:
      - "9000:9000"
    links:
      - mysql-db:mysql-db
      - redis-db:redis-db
    volumes:
      - ../app:/data/www:rw
      - ./php/php-dev.ini:/usr/local/etc/php/php.ini:ro
      - ./php/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
      - ../logs/php-fpm:/var/log/php-fpm:rw
    restart: always
    command: php-fpm

  nginx:
    build: ./nginx
    depends_on:
      - php-fpm
    links:
      - php-fpm:php-fpm
    volumes:
      - ../app:/data/www:rw
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ../logs/nginx:/var/log/nginx
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    restart: always
    command: nginx -g 'daemon off;'

  mysql-db:
      build: ./mysql
      ports:
        - "3306:3306"
      volumes:
        - ../data/mysql:/var/lib/mysql:rw
        - ../logs/mysql:/var/lib/mysql-logs:rw
        - ./mysql/conf.d:/etc/mysql/conf.d:ro
      environment:
        MYSQL_ROOT_PASSWORD: 123456
        MYSQL_DATABASE: zphaldb
        MYSQL_USER: zphal
        MYSQL_PASSWORD: zphal123
      restart: always
      command: "--character-set-server=utf8"

  redis-db:
      build: ./redis
      ports:
        - "6379:6379"
      volumes:
        - ../data/redis:/data
      restart: always

3。写成

,我们该如何使用呢?

3.1 使用构建环境

  1. 首先进入Project Doctor files 的图书馆。这是 files 库:
    cd zPhal-dockerfiles/files
    
    wget https://pecl.php.net/get/redis-3.1.6.tgz -O php/pkg/redis.tgz
    wget https://codeload.github.com/phalcon/cphalcon/tar.gz/v3.3.1 -O php/pkg/cphalcon.tar.gz

    接下来,下载我们将使用的 PHP 扩展包。

  2. 执行命令:
    docker-compose up

    docker会通过编写的docker-compose.yml内容自动构建镜像并启动容器。如果没有问题,下次启动时可以以守护进程模式启用,所有容器都会在后台运行:

    docker-compose up -d
  3. 关闭容器。您可以关闭容器并删除服务,如下所示:
    docker-compose down

使用 docker-compose。基本上就是这么简单,使用 stop、start 等这些命令来操作容器服务。更多的工作在于编写 dockerfile 和 docker-compose.yml 文件。

3.2 使用composer

当我们想要使用composer时应该怎么做?我们已经在 php-fpm 中安装了 Composer。

使用docker-compose进行操作:

docker-compose run --rm -w /data/www/zPhal php-fpm composer update

-w /data/www/zPhal在php-fpm的工作空间中,zPhal项目也挂载在其中,所以我们可以直接在容器中运行composer 。

或者进入宿主应用目录,使用docker命令:

cd zPhal-dockerfiles/app

docker run -it --rm -v `pwd`:/data/www/ -w /data/www/zPhal files_php-fpm composer update

4。注意事项

  • 注意挂载路径
  • 构建失败时,注意容器是否报错
  • 加速镜像。如果下载镜像的过程很慢,可以使用国内的加速镜像服务,比如阿里云、Daocloud。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门