赞
踩
如果使用docker去部署一套php的运行环境,我们需要构建出nginx、php-fpm两个容器,nginx通过fast_cgi协议去转发php-fpm中的端口,从而实现web server的搭建,接下来以php的laravel框架为演示例子。
./Dockerfile
- #根据你自身业务需求来选择官方的php基础镜像
- FROM php:7.4-fpm-alpine
-
- # 设置时区
- ENV TZ Asia/Shanghai
-
- # 创建supervisor进程管理器相关数据存在的文件夹
- RUN mkdir -p "/var/log/supervisor" && mkdir -p "/var/run"
-
- # 设置源,提高下载效率
- RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
-
- # 安装系统依赖
- RUN apk update && apk --no-cache add \
- autoconf \
- g++ \
- make \
- openssl-dev \
- libzip-dev \
- unzip \
- tzdata \
- supervisor
-
- # 安装Redis扩展
- RUN pecl install redis && docker-php-ext-enable redis
-
- # 安装PDO MySQL扩展
- RUN docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql
-
- # 安装opcache扩展
- RUN docker-php-ext-install opcache && docker-php-ext-enable opcache
-
- # 安装Composer
- RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
-
- #工作目录
- WORKDIR /app
-
- # 定义容器启动时运行的命令
- CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]

./cronJob
* * * * * /usr/local/bin/php /app/www/laravel8/artisan schedule:run >> /var/log/laravel8-crontab-task.log 2>&1
./supervisord/supervisord.conf
- ; supervisor config file
-
- [unix_http_server]
- file=/var/run/supervisor.sock ; (the path to the socket file)
- chmod=0700 ; sockef file mode (default 0700)
-
- [supervisord]
- logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
- pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
- childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
-
- ; the below section must remain in the config file for RPC
- ; (supervisorctl/web interface) to work, additional interfaces may be
- ; added by defining them in separate rpcinterface: sections
- [rpcinterface:supervisor]
- supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
-
- [supervisorctl]
- serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
-
- ; The [include] section can just contain the "files" setting. This
- ; setting can list multiple files (separated by whitespace or
- ; newlines). It can also contain wildcards. The filenames are
- ; interpreted as relative to this file. Included files *cannot*
- ; include files themselves.
-
- [include]
- files = /etc/supervisor/conf.d/*.conf

supervisord/conf.d/supervisord.conf
- [supervisord]
- nodaemon=true
-
- [program:php-fpm]
- command=/usr/local/sbin/php-fpm -F
- autostart=true
- autorestart=true
- startretries=3
- priority=1
- stdout_logfile=/var/log/php-fpm.log
- redirect_stderr=true
-
- [program:crond]
- command=/usr/sbin/crond -f
- autostart=true
- autorestart=true
- stdout_logfile=/var/log/crond.log
- redirect_stderr=true
- priority=2

docker-compose.yml
- version: '3.8'
-
- services:
- php7.4fpm:
- build:
- dockerfile: Dockerfile
- image: php7.4fpm
- container_name: php7.4fpm
- restart: always
- volumes:
-
- # 映射应用程序目录
- - /Users/king/Code/laravel8:/app/www/laravel8
-
- # 映射Crontab定时任务配置
- - ./cronJob:/etc/crontabs/root
-
- # 映射supervisor配置文件
- - ./supervisord:/etc/supervisor
-
- # 映射php扩展配置 ps:首次构建时需要注释,否则容器内该目录会为空
- #- ./extensions:/usr/local/etc/php/conf.d
-
-
- # 映射fpm配置文件 ps:首次构建时需要注释,否则容器内该目录会为空
- #- ./fpm-conf:/usr/local/etc/php-fpm.d
- networks:
- default:
- external: true
- name: frontend

docker pull php:7.4-fpm-alpine
docker network create frontend
docker-compose up -d --build
同步文件
- #同步php扩展配置文件夹,后续可以直接在宿主机变更相关参数配置
- docker cp php7.4fpm:/usr/local/etc/php/conf.d ./extensions
-
- #同步fpm配置文件夹,后续可以直接在宿主机变更相关参数配置
- docker cp php7.4fpm:/usr/local/etc/php-fpm.d ./fpm-conf
查看当前目录结构
./Dockerfile
- FROM nginx:alpine
-
- # 安装时区工具
- RUN set -ex \
- && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
- && apk --update add tzdata \
- && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
- EXPOSE 80 443
-
- # 定义容器启动时运行的命令
- CMD ["nginx", "-g", "daemon off;"]
./nginx.conf
- user nginx;
- worker_processes auto;
-
- error_log /var/log/nginx/error.log notice;
- pid /var/run/nginx.pid;
-
- events {
- worker_connections 1024;
- }
-
-
- http {
-
- include /etc/nginx/mime.types;
-
- default_type application/octet-stream;
-
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
-
- access_log /var/log/nginx/access.log main;
- sendfile on;
- keepalive_timeout 65;
-
- #压缩配置
- gzip on;
- gzip_comp_level 5;
- gzip_min_length 1k;
- gzip_buffers 4 16k;
- gzip_proxied any;
- gzip_vary on;
- gzip_types
- application/javascript
- application/x-javascript
- text/javascript
- text/css
- text/xml
- application/xhtml+xml
- application/xml
- application/atom+xml
- application/rdf+xml
- application/rss+xml
- application/geo+json
- application/json
- application/ld+json
- application/manifest+json
- application/x-web-app-manifest+json
- image/svg+xml
- text/x-cross-domain-policy;
- gzip_static on;
- gzip_disable "MSIE [1-6]\.";
-
- include /etc/nginx/conf.d/*.conf;
- }

./conf.d/default.conf
- server {
-
- listen 80;
-
- server_name localhost;
-
- root /app/www/laravel8/public;
- index index.php index.html;
-
- location / {
- try_files $uri $uri/ /index.php?$query_string;
- }
-
- location ~ \.php$ {
- include fastcgi_params;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- fastcgi_pass php7.4fpm:9000; # PHP-FPM 容器的地址和端口
- fastcgi_index index.php;
- }
-
- location ~ /\.ht {
- deny all;
- }
-
- error_log /var/log/nginx/error-php7.4fpm.log;
- access_log /var/log/nginx/access-php7.4fpm.log;
- }

./docker-compose.yml
- version: '3.8'
-
- services:
- nginx:
- build:
- dockerfile: Dockerfile
- image: nginx
- container_name: nginx
- volumes:
- - ./nginx.conf:/etc/nginx/nginx.conf
- - ./conf.d:/etc/nginx/conf.d
- - ./log:/var/log/nginx
- restart: always
- ports:
- - "80:80"
- networks:
- default:
- external: true
- name: frontend

docker pull nginx:alpine
docker-compose up -d --build
如果以上步骤顺利操作,浏览器访问 http://127.0.0.1或http://localhost看响应结果。
大功告成!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。