扣丁学堂PHP培训我爱编程

扣丁学堂PHP培训简述如何用Docker搭建自己的PHP开发环境

2018-07-11  本文已影响29人  994d14631d16

本篇文章扣丁学堂PHP培训小编和大家分享一下如何用Docker搭建自己的PHP开发环境,文章中会有代码列出供大家参考。对PHP感兴趣的小伙伴现在就随扣丁学堂的小编一起来了解一下吧。

扣丁学堂PHP培训

首先,我们来看一下,我创建的这个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拓展等。

总的来说,我们做这件事有三个流程:编写好各个软件的Dockerfile;编写好配置文件;通过docker-compose处理所有的Dockerfile,包括将配置配置文件扔进去Dockerfile文件将构建的镜像中。

编写Dockerfile文件

PHP

下面是PHP的Dockerfile:

FROM php:7.2-fpm

MAINTAINER goozp "gzp@goozp.com"设置时区

ENV TZ=Asia/Shanghai

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

安装第三方拓展,这里是 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但是在非Linux系统,比如Windows中运行时,我们不能取到/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

下面是Nginx的Dockerfile:

FROM nginx:1.12set timezome

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

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

当然,我们需要修改配置文件,只要事先写好配置文件就行,最后在 docker-compose.yml 文件中,将配置文件扔进去,这个下面会讲,包括PHP的配置文件,MySQL的配置文件,都是一样的。

 MySQL

下面是 MySQL 的 Dockerfile:

FROM mysql:5.7set timezome

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

MySQL也没有什么特别之处,直接使用官方的镜像。

Redis

下面是 Redis 的,也直接使用官方镜像:

FROM redis:3.2set timezome

ENV 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程序放的位置到这个路径。

编写 docker-compose.yml

在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

以上就是扣丁学堂PHP在线学习小编给大家分享的如何用Docker搭建自己的PHP开发环境,希望对小伙伴们有所帮助。想要了解更多内容的小伙伴可以登录扣丁学堂官网咨询,扣丁学堂是专业的PHP培训机构,不仅有专业的老师和与时俱进的课程体系,还有大量的PHP在线视频供学员观看学习。喜欢PHP开发想要学习的小伙伴快快行动吧。

上一篇下一篇

猜你喜欢

热点阅读