针对PHP项目所需的php、nginx、mysql、redis等等组件,介绍如何构建镜像,及部署容器等。
构建镜像
根据项目功能需要定制所需镜像,一般使用Dockerfile基于官方镜像定制构建。
PHP定制镜像
根据官方php镜像,定制安装所需扩展。
Dockerfile文件
FROM php:8.1.7-fpm-alpine3.16
LABEL MAINTAINER="hoopan108@gmail.com"
ENV TZ "Asia/Shanghai"
# 时区
RUN echo ${TZ} >/etc/timezone
# 配置阿里云镜像源,加快构建速度。
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories
# 创建www用户
RUN addgroup -g 1000 -S www && adduser -s /sbin/nologin -S -D -u 1000 -G www www
# 指定扩展版本
ENV PHPREDIS_VERSION 5.3.7
# PHPIZE_DEPS包含gcc g++等编译辅助类库,完成后删除;pecl安装扩展。
RUN apk add --no-cache $PHPIZE_DEPS \
&& apk add --no-cache libstdc++ libzip-dev vim\
&& apk add rabbitmq-c-dev \
&& apk update \
&& pecl install redis-$PHPREDIS_VERSION \
&& pecl install zip \
&& pecl install swoole \
&& pecl install mongodb \
&& pecl install amqp \
&& docker-php-ext-enable redis zip swoole mongodb amqp \
&& apk del $PHPIZE_DEPS
# docker-php-ext-install安装扩展。
RUN apk add --no-cache \
freetype \
libpng \
libjpeg-turbo \
freetype-dev \
libpng-dev \
jpeg-dev \
libjpeg \
libjpeg-turbo-dev \
libwebp \
libwebp-dev \
&& NUMPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) \
&& docker-php-ext-install -j${NUMPROC} gd \
&& docker-php-ext-install -j${NUMPROC} pdo_mysql \
&& docker-php-ext-install -j${NUMPROC} opcache \
&& docker-php-ext-install -j${NUMPROC} bcmath \
&& docker-php-ext-install -j${NUMPROC} mysqli
# 配置文件
COPY ./conf.d/ $PHP_INI_DIR/conf.d/
COPY www.conf /usr/local/etc/php-fpm.d/www.conf
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
www.conf文件
其中的进程数可以根据服务器情况调整
[www]
user = www
group = www
listen = 0.0.0.0:9000
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
date.ini文件
在conf.d目录增加date扩展的配置文件
date.timezone = Asia/Shanghai
opcode.ini文件
在conf.d目录增加opcode扩展的配置文件
opcache.enable= 0
opcache.enable_cli=0
opcache.revalidate_freq=60
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1
构建命令
docker build -t hoopan/php:8.1.7 .
构建完成后,docker images 可以查看。
部署容器
将项目所需镜像,部署容器运行,并考虑容器间通信。
MySQL容器
简单部署
docker run -itd -p 3307:3306 \
-v /data/www/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql8 \
mysql:8.0.29
自定义配置部署
将配置文件映射到宿主机,方便调整参数
docker run --name tmp-mysql-container -d mysql:8.0.29
sudo docker cp tmp-mysql-container:/etc/mysql/conf.d /data/www/etc/mysql/conf.d
docker rm -f tmp-mysql-container
docker run -itd -p 3307:3306 \
-v /data/www/mysql:/var/lib/mysql \
-v /data/www/etc/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql8 \
mysql:8.0.29
Redis容器
配置文件
先创建配置文件redis.conf,如创建/data/www/etc/redis/redis.conf,内容如下
# 注释bind,此值限制本地访问
#bind 127.0.0.1
# 保护模式关闭,此值限制本地访问
protected-mode no
# 设置密码
requirepass 123456
# 数据库数量(可选),默认12个,最多255
#databases 16
# 开启持久化,AOF
appendonly yes
# 日志
#logfile "/data/log/access.log"
部署容器
docker run -itd -p 6380:6379 \
-v /data/www/redis:/data \
-v /data/www/etc/redis:/etc/redis \
--name redis7 \
redis redis-server /etc/redis/redis.conf
PHP容器
由于PHP需要连接MySQL和redis服务,因此PHP容器需要link它们,以便访问其服务。
简单部署
docker run -itd -p 9001:9000 \
-v /data/www/html:/var/www/html \
--name php8 \
--link mysql8 \
--link redis7 \
hoopan/php:8.1.7
自定义配置部署
将配置文件映射到宿主机,方便调整参数
# 先获取原始配置内容,本地目录需要创建
docker run --name tmp-php-container -d hoopan/php:8.1.7
sudo docker cp tmp-php-container:/usr/local/etc/php /data/www/etc/
sudo docker cp tmp-php-container:/usr/local/etc/php-fpm.d /data/www/etc/
docker rm -f tmp-php-container
# 创建容器
docker run -itd -p 9001:9000 \
-v /data/www/html:/var/www/html \
-v /data/www/etc/php:/usr/local/etc/php \
-v /data/www/etc/php-fpm.d:/usr/local/etc/php-fpm.d \
--link mysql8 \
--link redis7 \
--name php8 \
hoopan/php:8.1.7
注意事项
- 进程池用户组及用户:www.conf里定义了user和group,但是/var/www/html映射到宿主机的文件权限可能跟这里定义的用户不一致,会造成读写权限缺失,因此需要在docker里查看/var/www/html目录下真实用户组和用户ID,然后再修改www.conf文件里的user和group。
Nginx容器
简单部署
docker run -d -p 8201:80 \
-v /data/www/html:/usr/share/nginx/html \
-v /data/www/nginx/conf/conf.d:/etc/nginx/conf.d \
--link php8 \
--name nginx \
nginx
自定义配置部署
# 先获取原始配置内容
docker run --name tmp-nginx-container -d nginx
sudo docker cp tmp-nginx-container:/etc/nginx/nginx.conf /data/www/etc/nginx/nginx.conf
docker rm -f tmp-nginx-container
#创建容器
docker run -d -p 8201:80 \
-v /data/www/html:/usr/share/nginx/html \
-v /data/www/etc/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/www/etc/nginx/conf.d:/etc/nginx/conf.d \
-v /data/www/log/nginx:/var/log/nginx \
--name nginx \
--link php8 \
nginx
配置nginx站点文件
vim /data/www/etc/nginx/conf.d/default.conf
配置内容如下
需在/data/www/html站点目录内创建 blog 项目目录
server {
listen 80;
root /usr/share/nginx/html/blog;
index index.html index.php;
location / {
# Redirect everything that isn't a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
# 注意用link的php容器名称,不能用127.0.0.1,端口使用容器内部9000
fastcgi_pass php8:9000;
fastcgi_index index.php;
# 脚本目录指定php容器的路径,与上面root的nginx路径不同
fastcgi_param SCRIPT_FILENAME /var/www/html/blog$fastcgi_script_name;
include fastcgi_params;
}
}
Compose 部署容器
上面是采用每个容器服务单独部署的方式,也可以使用compose一键部署。
创建compose模板
默认模板文件名称为 docker-compose.yml,格式为 YAML 格式。
注意:模板文件中的映射配置文件需要提前准备好
version: "3"
services:
nginx:
image: nginx
restart: always
volumes:
- ./html:/usr/share/nginx/html
- ./etc/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./etc/nginx/conf.d:/etc/nginx/conf.d
- ./log/nginx:/var/log/nginx
ports:
- 8202:80
php:
image: hoopan/php:8.1.7
restart: always
volumes:
- ./html:/var/www/html
- ./etc/php:/usr/local/etc/php
- ./etc/php-fpm.d:/usr/local/etc/php-fpm.d
mysql:
image: mysql:8.0.29
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: blog
MYSQL_USER: blog_user
MYSQL_PASSWORD: 123456
volumes:
- ./mysql:/var/lib/mysql
- ./etc/mysql/conf.d:/etc/mysql/conf.d
redis:
image: redis:7.0.2
restart: always
volumes:
- ./redis:/data
- ./etc/redis:/etc/redis
command:
redis-server /etc/redis/redis.conf
启动项目
在当前目录中执行以下命令
docker-compose up -d
项目仓库
以上镜像、代码等已构建上传到公共仓库,可以下载使用
- PHP定制镜像:https://hub.docker.com/r/hoopan/php
- Docker-compose文件:https://github.com/hoopan007/web-app