Docker 构建php web开发环境
需要构建的环境镜像有 Nginx、php,通过docker-compose用来编排两个镜像
注意:建议生产环境将软件开发环境与中间件区分在不同镜像中,例如php开发环境,不与nginx、mysql、redis在同一个镜像中构建,那怕是php中的CGI需要nginx代理,也不存放在同一个镜像中,方便维护
目录结构
- app
- index.html
- index.php
- conf
- nginx
- market.conf
- php
- conf
- php.ini
- Dockerfile
- docker-compose.yml
php目录为 php、fpm的镜像配置,使用本地的php.ini
conf 目录为所有的配置文件
nginx镜像没多少自定义东西,直接在docker-compose.yml里声明了
配置说明
php的镜像Dockerfile内容如下
FROM php:7.2-fpm
RUN apt-get update && \
pecl install -n channel://pecl.php.net/ev-1.1.5 && \
pecl install -n channel://pecl.php.net/redis-6.1.0RC1 && \
pecl install -n channel://pecl.php.net/swoole-4.8.13 && \
pecl install -n channel://pecl.php.net/protobuf-3.13.0.1 && \
pecl install apcu && \
docker-php-ext-install opcache && \
docker-php-ext-enable opcache
ADD conf/php.ini /usr/local/etc/php/
EXPOSE 9000
这里我们使用的是dockerhub上的 php.7.2镜像,做一些扩展安装、配置设置
php的pecl命令,通过pecl搜索出的扩展大多是一些适配php高版本的扩展,这里我们通过pecl官网按照指定的扩展版本,例如
ev
扩展1.1.5版本适用于php7.2以上,安装命令就是pecl install channel://pecl.php.net/ev-1.1.5
Dockerfile中的命令,默认会跳过需要二次确认的命令,例如 yum -y install vim
,其中-y
参数不添加,也会自动跳过
docker-compose.yml
配置如下
version: '3'
services:
php:
build:
context: ./php
restart: always
ports:
- "9000:9000"
environment:
- HOST_ID=market_node1
- ENV=test
volumes:
- "D:/site/prodphp/app:/home/www"
nginx:
container_name: nginx
image: nginx:latest
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "80:80"
depends_on:
- "php"
volumes:
- "D:/site/prodphp/app:/home/www"
- "D:/site/docker/nginx/logs:/var/log/nginx"
- "D:/site/prodphp/conf/nginx:/etc/nginx/conf.d"
通过命令 docker-compose up -d
便可启动php nginx两个镜像所构建的容器
我们这里将本地的 D:/site/prodphp/ap
目录作为nginx中配置的web工作目录
相关知识点
-
docker-commpose.yml
中volumes
修改,docker-compose restart
可能不生效,需要先docker-compose stop
再执行docker-compose up -d
,或者先删除容器,重新启动 - windows中,
docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp php:8.2-cli php your-script.php
,$PWD
命令可能不生效,注意操作系统差异、目录分隔符($PWD 当前目录) - 根据
Dockerfile
文件,启动容器
3.1 构建镜像docker build -t my1029:1 .
根据当前目录下的Dockerfile文件,构建名为my1029
,tag
为1
的镜像
3.2 根据指定image启动容器docker run -it --rm --name your-container-name your-image-name:tag
--rm
参数为进程退出自动删除容器 - docker hub官方的php镜像里,自带了一些默认(非第三方)扩展,例如
GD库
等,并且配置了专门安装扩展的命令docker-php-ext-install
,例如docker-php-ext-install gd
,docker-php-ext-enable gd
的作用就是省去手动去php.ini添加xxxx.so
操作 - Dockefile中的
COPY
ADD
与docker-compoer.yml中的volumes
,都是用来文件映射用,COPY
ADD
是在构建
镜像时执行的,而volumes
是在运行容器时配置的。COPY 将文件复制到镜像中,使得文件随镜像一起分发,但不持久化;volumes 用于数据持久化,即使容器被删除,数据仍然存在 - Dockefile中的
EXPOSE
与docker-compoer.yml中的ports
,EXPOSE
指令仅声明容器应该监听的端口,是一个注释作用,没有实质效果,而ports
配置项实际将容器端口映射到宿主机端口,使得外部可以访问。 -
COPY
和ADD
命令不能拷贝上下文之外的本地文件,如果要把本地的文件拷贝到镜像中,那么本地的文件必须是在上下文目录中的文件,就好比是你Dockerfile所在目录,或者工作目录 - 遇到
nginx
处理php
请求,CGI报错 Access denied (403) see security.limit_extensions,可修改php.ini
中cgi.fix_pathinfo
或者security.limit_extensions
配置,大多是由于nginx中代理转发fpm的.sock
和端口9000
方式不兼容导致 - docker-compose.yml中,关联
Dockerfile
的方式
php:
build:
context: ./php
context: ./php
就会php目录下默认的Dockerfile
镜像配置