编写nginx+php的Dockerfile,包括安装PHP扩展

完整代码及目录结构:

nginx_php.zip


nginx_php

--nginx_conf  存放nginx的配置文件

--php_extension_file 存放php相关扩展,composer等

--project_code 代码目录

--s6-overlay 守护进程

--Dockerfile dockerfile文件


如何启动:

1.进入nginx_php目录,编译镜像

docker build -t nginx_php .

2.启动镜像

 
docker run -d --name=nginx_php -v 本机nginx_conf的绝对路径:/etc/nginx/conf.d -v 本机project_code的绝对路径:/home/www -p 81:81 nginx_php

3.在浏览器访问ip:81即可看到效果了(这里是用的81端口做测试,实际运用中还是需要映射80端口)


如何添加新项目:

  1. 进入nginx_conf目录,复制一个新的conf文件,修改文件里面的server

  2. 将项目代码放到project_code下,跟上面的nginx的配置文件中对应的root路径要一样

  3. 重启容器

docker restart nginx_php


遇到的问题:

1.访问php时出现File not found

 把这一行的$document_root换成项目所在容器里面的绝对路径
 #fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param  SCRIPT_FILENAME /home/www/test$fastcgi_script_name;

2./bin/bash没有

    该镜像是基于php官方镜像编译,使用的是alpine系统 ,没有/bin/bash,应该是sh

docker exec -it nginx_php sh



Dockerfile:

#
#--------------------------------------------------------------------------
# 构建PHP+NGINX镜像
#--------------------------------------------------------------------------
FROM php:7.2.5-fpm-alpine
# 修改apk 源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
# 设置环境变量
ENV NGINX_CONF_PATH="/etc/nginx/conf.d/"\
    CODE_PATH="/home/www/" 
# 安装扩展所需的依赖
RUN apk update \
    && apk add autoconf gcc g++ automake libtool make libstdc++
# init PHP
# 通过ext安装自带的扩展
RUN docker-php-ext-install pdo_mysql \
    && docker-php-ext-install mysqli
## 安装Redis,mongodb && 和所需依赖
RUN pecl install Igbinary \
    && pecl install redis-4.2.0 \
    && pecl install mongodb \
    && docker-php-ext-enable redis \
    && docker-php-ext-enable mongodb
## 安装Swoole
RUN apk add openssl \
    && pecl install swoole-4.2.12 \
    && docker-php-ext-enable swoole
# 安装GD和图像处理相关的
RUN apk add libjpeg libpng libpng-dev freetype freetype-dev \
    && docker-php-ext-install gd
## 安装composer
COPY ./php_extension_file/composer.phar /home/extension_file/composer.phar
RUN mv /home/extension_file/composer.phar /usr/local/bin/composer \
    && chmod u+x /usr/local/bin/composer
#init Nginx
RUN apk add nginx \
    && cd /run \
    && mkdir nginx \
    && touch nginx.pid
COPY ./nginx_conf/* ${NGINX_CONF_PATH}
#init project_code
COPY ./project_code/* ${CODE_PATH}
# 指定挂载点, nginx的配置文件和代码目录
VOLUME ["${NGINX_CONF_PATH}" , "${CODE_PATH}"]
# 指定暴露的端口 
#EXPOSE 80 443 9000
# init 守护进程模块
COPY ./s6-overlay/*tar.gz /tmp/
COPY ./s6-overlay/service /etc/s6/
RUN tar -xzf /tmp/s6-overlay-amd64.tar.gz -C /tmp/ \
    && mv /tmp/bin/* /usr/bin/ \
    && rm /tmp/s6-overlay-amd64.tar.gz \
    && rm -rf /tmp/* \
    #直接返回0状态码(finish情况一般是 docker run -i -t 进入容器手动执行/usr/bin/s6-svscan /etc/s6 守护进程才会发生),
    #以后有什么优化操作,可以在重新映射这两个脚本来做特殊操作
    && mkdir -p /etc/s6/.s6-svscan \
    #当s6进程关闭时,finish脚本会被调用
    && ln -s /bin/true /etc/s6/.s6-svscan/finish  \
    #当s6所管理的应用由于错误终结时,crash脚本会被调用
    && ln -s /bin/true /etc/s6/.s6-svscan/crash \
    # 给s6-overlay二进制文件设置权限
    && chmod -R 755 /usr/bin \
    && chmod -R 755 /etc/s6
#清理一些扩展包
RUN apk del autoconf \
    && apk del gcc \
    && apk del g++ \
    && apk del automake \
    && apk del libtool \
    && apk del make
#日志挂载
#重启PHP命令
WORKDIR /home/www/
#s6-overlay 守护进程模式
ENTRYPOINT ["/usr/bin/s6-svscan","/etc/s6"]
#supervisord 守护进程模式
#RUN apk add supervisor
#COPY ./supervisor_conf/supervisord.conf /etc/supervisord.conf
#COPY ./supervisor_conf/supervisor.d/*  /etc/supervisor.d/
#CMD ['/usr/bin/supervisord','-c /etc/supervisord.conf']