이 글에서는 docker에서 PHP 개발 환경을 구축하는 방법을 zPhal-dockerfiles를 예로 들어 설명하겠습니다. 필요한 친구는 이를 참고할 수 있습니다.
이러한 시나리오가 있나요? 프로젝트를 진행했는데, 로컬에서 개발할 때 환경을 설정해야 합니다. 회사에 갈 때도 환경을 설정해야 합니다. 비밀리에 놀고 싶다면 환경을 설정해야 합니다. 일치하지 않으면 충분하지 않습니다. 왜냐하면 환경 의존성이 상당히 많기 때문입니다. 이때 Docker가 있으면 머신에 Docker를 설치하고 작성된 Dockerfile만 넣으면 됩니다. 이 작업은 한 줄의 명령으로 자동으로 수행되므로 편리하고 효율적이지 않습니까?
다음으로, zPhal-dockerfiles를 예로 들어 PHP 개발 환경을 설정하는 방법을 소개합니다. 제가 블로그 시스템용으로 준비한 Dockerfile 세트입니다.
이제 Windows, Mac, Linux 등 Docker는 Windows 시스템을 포함하여 매우 잘 지원할 수 있습니다. Win 10 시스템에서 Windows용 Docker는 실제로 꽤 좋지만 더 많은 메모리를 소비합니다.
Docker 명령줄을 통해 이미지 가져오기, 컨테이너 실행, 컨테이너 내 명령 실행 등 많은 작업을 수행할 수 있지만 이제는 Dockerfile을 작성하고 관리하기 위해 더 간단하고 투박한 방법을 사용해야 합니다. docker-compose를 통해 이러한 문서는 작업 프로세스를 단순화합니다.
Dockerfile이란 무엇인가요?
Dockerfile은 일련의 명령과 매개변수로 구성된 스크립트입니다. 이러한 명령은 가져온 기본 이미지에 적용되고 최종적으로 Dockerfile을 통해 설치하려는 항목이 포함된 새 이미지를 생성할 수 있습니다. 소프트웨어는 설치할 확장 프로그램, 실행할 명령 등을 미리 사용자 정의한 다음 한 번의 클릭으로 실행하는 것과 동일하므로 작업 프로세스가 크게 단순화됩니다.
이 문서에 따라 환경을 설정하려면 다음을 수행해야 합니다.
먼저 Docker와 Docker의 일부 기본 작업, 그리고 docker-compose가 무엇인지 이해해야 합니다.
그런 다음 Docker와 docker-compose를 설치해야 합니다. 저는 docker-compose를 사용하여 Dockerfile을 관리하겠습니다.
Dockerfile을 작성하는 것은 죽은 것이 아니라 살아있는 것입니다. 모든 사람이 작성하는 Dockerfile은 필요에 따라 다를 수 있습니다.
Docker 공식 문서는 영어로 되어 있지만 기본적으로 모든 내용이 담겨 있습니다. 궁금한 점이 있으면 Docker Documentation 문서를 참조하는 것이 좋습니다.
다음은 zPhal-dockerfiles를 예로 들어 전체 파일을 볼 수 있습니다.
우선 제가 만든 Dockerfile 프로젝트를 살펴보겠습니다. 대략 다음과 같은 디렉터리로 나누어 놓았습니다. (물론 이것은 제가 직접 결정한 것이므로 꼭 이런 식으로 파일 형식을 지정할 필요는 없습니다.) :
zPhal-dockerfiles app/ index.php phpinfo.php data/ .gitignore files/ mysql/ conf.d/ mysql-file.cnf Dockerfile nginx/ conf.d/ default.conf zphal.conf Dockerfile nginx.conf php/ pkg/ .gitignore Dockerfile php.ini php-dev.ini php-fpm.conf redis/ Dockerfile docker-compose.yml logs/ .gitgnore README.md
이 프로젝트에서는 PHP, MySQL, Nginx, Redis, Composer, Phalcon Extensions 등을 사용했습니다.
일반적으로 이를 수행하는 세 가지 프로세스가 있습니다. 각 소프트웨어의 Dockerfile을 작성하고, 구성 파일을 작성하고, Dockerfile 파일이 중간에 빌드할 이미지에 구성 구성 파일을 던지는 것을 포함하여 모든 Dockerfile을 처리합니다.
다음은 PHP용 Dockerfile입니다.
FROM php:7.2-fpm
MAINTAINER goozp "gzp@goozp.com"
시간대 설정
ENV TZ =아시아/상하이
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
종속성 패키지 및 PHP 핵심 확장 업데이트 및 설치
RUN apt-get update && apt-get install -y \ git \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install zip \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install opcache \ && docker-php-ext-install mysqli \ && rm -r /var/lib/apt/lists/*
사전 다운로드됩니다. 호스트 시스템에서 확장 패키지를 복사합니다.
COPY ./pkg/redis.tgz /home/redis.tgz COPY ./pkg/cphalcon.tar.gz /home/cphalcon.tar.gz
PECL 확장을 설치합니다. 여기서 Redis를 설치합니다.
RUN pecl install /home/redis.tgz && echo "extension=redis.so" > /usr/ local/etc/php/conf.d/redis.ini
제3자 확장을 설치하세요. Phalcon 확장은 다음과 같습니다
RUN cd /home \ && tar -zxvf cphalcon.tar.gz \ && mv cphalcon-* phalcon \ && cd phalcon/build \ && ./install \ && echo "extension=phalcon.so" > /usr/local/etc/php/conf.d/phalcon.ini
Composer 설치
ENV COMPOSER_HOME /root/composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer ENV PATH $COMPOSER_HOME/vendor/bin:$PATH RUN rm -f /home/redis.tgz \ rm -f /home/cphalcon.tar.gz WORKDIR /data Write Permission RUN usermod -u 1000 www-data
첫 번째 줄 기본 이미지를 정의합니다. 여기서는 PHP 7.2의 fpm 버전을 사용하여 여기의 두 번째 줄에서 관리자를 정의합니다.
다음으로, 이 문장은 모든 Dockerfile에 정의되어 있으며, 주로 모든 컨테이너의 시간을 호스트와 동기화합니다. 실제로 docker-composer.yml 파일에서 다음과 같이 정의할 수 있습니다. services :
php-fpm:
volumes:
- /etc/localtime:/etc/localtime:ro
그러나 Windows와 같은 Linux가 아닌 시스템에서 실행할 때는 /etc/localtime을 얻을 수 없습니다. 모든 플랫폼과의 호환성을 높이기 위해 Dockerfile에 시간 동기화를 작성했습니다.接下来安装一些拓展,其实安装拓展的过程类似于我们徒手在Linux中安装PHP拓展,值得一提的是Composer。我将Composer直接安装在了php-fpm的镜像中,其实官方也提供了Composer的镜像,拉取Composer镜像执行也可以达到目的,因为我们使用Composer只是为了执行Composer命令来管理我们的包,如果Composer单独是一个容器的话,我们在不用时,还可以将容器关掉;但是在这里,我直接将Composer装进php-fpm镜像中,主要是我的项目安装了一些PHP拓展,在编写composer.json文件时,我定义了extension的依赖,这样Composer执行时会检查环境是否安装了这些依赖,所有如果我直接用Composer镜像的话,还需要把我用的拓展安装到镜像里,就麻烦多了,所以我直接在PHP镜像中就把这个事做了,其实没什么区别,取决于你怎么用。
下面是Nginx的Dockerfile:
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的配置文件,都是一样的。
下面是 MySQL 的 Dockerfile:
FROM mysql:5.7
set timezomeENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
MySQL也没有什么特别之处,直接使用官方的镜像。
下面是 Redis 的,也直接使用官方镜像:
FROM redis:3.2
set timezomeENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
如何处理配置文件呢,我将配置文件进行归类,PHP的配置文件放在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/www路径,是到时候Nginx容器的路径,而不是当前在操作的宿主机的路径,所以到时候我们要挂载Web程序放的位置到这个路径。
在PHP、Nginx等目录的同级,我们创建一个docker-compose.yml,我们在执行docker-compose相关命令时,会自动找到这个文件,并根据里面的内容来执行。
接上面Nginx的例子,我们先谈挂载,因为这是最重要的一步。在docker-compose.yml中,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;'
有一个volumes参数,这里就是我们要挂载的目录的相关配置,第一条我们将../app挂载到/data/www之中,也是我们配置文件中定义的默认监听的root,而APP目录是我们宿主机中的一个目录,通过这样挂载我们可以直接将我们的项目文件放到APP中,Docker会帮你传输到容器内的/data/www目录下。
其它的参数:
build定义了你的Dockerfile在哪里,如果没有写Dockerfile可以不用build,可以用images参数定义官方镜像,比如image:mysql:5.7;
depends_on表示将依赖其它镜像,比如Nginx依赖php-fpm,没有它我Nginx没法玩;
links定义连接,比如要连接到php-fpm容器,就是php-fpm:php-fpm,后面是别名;
ports表示端口映射,80:80表示将80端口映射到宿主机的80端口;
restart重启,restart: always表示将自动重启;
command是自动执行的命令;
……
参数很多,更多的可以参考官方文档。
下面是一个完整的 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
这一套编写下来,我们怎么用呢?
首先,进入项目Dockerfiles的目录下,这里是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拓展包。
执行命令:
docker-compose up
Docker会自动通过编写好的docker-compose.yml内容构建镜像,并且启动容器。
如果没问题,下次启动时可以以守护模式启用,所有容器将后台运行:
docker-compose up -d
关闭容器:
可以这样关闭容器并删除服务:
docker-compose down
使用 docker-compose 基本上就这么简单,用stop,start等这些命令来操纵容器服务。而更多的工作是在于编写Dockerfile和docker-compose.yml文件。
当我们要使用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。
或者进入宿主机APP目录下用Docker命令:
cd zPhal-dockerfiles/app
docker run -it --rm -v `pwd`:/data/www/ -w /data/www/zPhal files_php-fpm composer update
注意挂载路径。
构建失败时,注意容器内是否报错。
加速镜像。如果过程下载镜像很慢,可以使用国内的加速镜像服务。
相关推荐:
Docker 如何布置PHP开发环境,docker布置php开发
위 내용은 Docker는 자체 PHP 개발 환경을 구축합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!