1.准备工作
- 创建Dockerfile文件
- 当前目录下创建配置文件
目录文件结构
|-- config
|-- php
| |-- php-fpm.conf #进程服务的配置文件
| |-- php.ini #运行核心配置文件
| |-- www.conf #进程服务的扩展配置文件
|-- supervisord
| |-- supervisord.conf #进程服务的配置文件,需手动修改部分参数
| |-- php-worker.ini #php守护进程
|-- Dockerfile
2.目录下各个文件配置
supervisord.conf 需要改动的地方
[supervisord]
nodaemon=true #nodaemon必须设置成true,docker会将CMD中的第一个前台进程作为pid=1的进程
php-worker.ini
[program:php-worker]
process_name=%(program_name)s_%(process_num)02d
command=/opt/remi/php73/root/usr/sbin/php-fpm --nodaemonize
autostart=true
autorestart=true
redirect_stderr=true
priority=10 #进程启动优先级,默认999,值小的优先启动
php-fpm.conf 需要改动的地方
[supervisord]
listen = 0.0.0.0:9000 #修改本机访问为所有ip访问
;listen.allowed_clients = 127.0.0.1 #需禁用此项 ,在前面加";",允许所有ip访问
Dockerfile
FROM centos:7
MAINTAINER eason_fly
ENV TZ=Asia/Shanghai
RUN yum -y install epel-release --nogpgcheck && \
yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm && \
yum -y install git && yum -y install supervisor && \
yum install -y php73 php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-xml php73-php-pecl-redis5 php73-php-pecl-mongodb php73-php-pecl-zip && \
cp /usr/bin/php73 /usr/bin/php && \
ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo '$TZ' > /etc/timezone && \
php -r "readfile('https://getcomposer.org/installer');" | php && \
mv composer.phar /usr/local/bin/composer && yum clean all
COPY config/php/php.ini /etc/opt/remi/php73/php.ini
COPY config/php/php-fpm.conf /etc/opt/remi/php73/php-fpm.conf
COPY config/php/www.conf /etc/opt/remi/php73/php-fpm.d/www.conf
COPY config/supervisor/supervisord.conf /etc/supervisord.conf
COPY config/supervisor/php-worker.ini /etc/supervisord.d/php-worker.ini
WORKDIR /var/www/html
EXPOSE 9000
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
3.构建镜像
执行命令
docker build -t fly/php-fpm:7.3 .
构建成功
Removing intermediate container adf1f8fec081
---> 1ff256606f91
Step 12/12 : CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
---> Running in abcf9bdcf867
Removing intermediate container abcf9bdcf867
---> f06c038cd419
Successfully built f06c038cd419
Successfully tagged fly/php-fpm:7.3
查看镜像
Mac:php73 mac$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fly/php-fpm 7.3 b4a0f8bbd738 45 hours ago 411MB
4.通过镜像创建容器
- docker命令启动
Mac:php73 mac$ docker run -it -d --name php_73 fly/php-fpm:7.3
e01f6e3e9eaf1ec3aa5ccc851163c5c3422b7fb1be851c42efcad58da7bb6feb
- docker-compose启动
version: '3'
services:
php_73:
container_name: php_73
image: fly/php-fpm:7.3
restart: always
expose:
- "9000"
volumes:
- ./:/var/www/html
nginx_php:
container_name: nginx_php
image: nginx
restart: always
ports:
- "8090:80"
volumes:
- ./:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/log:/var/log/nginx
depends_on:
- php_73
links:
- php_73
5.进入容器,查看进程是否启动
Mac:php73 mac$ docker exec -it php_73 bash
[root@e01f6e3e9eaf /]# ps -ef|grep php
root 10 1 0 12:40 ? 00:00:00 php-fpm: master process (/etc/opt/remi/php73/php-fpm.conf)
apache 11 10 0 12:40 ? 00:00:00 php-fpm: pool www
apache 12 10 0 12:40 ? 00:00:00 php-fpm: pool www
apache 13 10 0 12:40 ? 00:00:00 php-fpm: pool www
apache 14 10 0 12:40 ? 00:00:00 php-fpm: pool www
apache 15 10 0 12:40 ? 00:00:00 php-fpm: pool www
apache 41 10 0 13:36 ? 00:00:00 php-fpm: pool www
[root@5fcbff4e4a1b html]# ps -ef|grep sup
root 1 0 0 12:40 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
6.需要注意的点
- docker会将CMD中的第一个前台进程作为pid=1的进程,第一个进程必须是前台启动的,所以
supervisord.conf
配置文件中,nodaemon
必须设置为true
-
supervisor
只能监控到前台运行的进程,若设为后台运行后则无法监控到进程状态而导致守护进程功能失效,所以supervisord.conf
中配置PHP进程时,必须设置PHP以前台模式运行command=/opt/remi/php73/root/usr/sbin/php-fpm --nodaemonize