本文目录导读:

- 基础项目结构
- PHP Dockerfile
- PHP配置文件
- docker-compose.yml(开发环境)
- docker-compose.prod.yml(生产环境)
- 生产环境Dockerfile
- 生产环境PHP配置
- Nginx配置
- 环境变量文件
- 常用命令
- .dockerignore文件
我来提供一个完整的PHP环境Docker化方案,包含开发环境和生产环境的配置。
基础项目结构
project/
├── docker/
│ ├── php/
│ │ ├── Dockerfile
│ │ └── php.ini
│ ├── nginx/
│ │ ├── nginx.conf
│ │ └── conf.d/
│ │ └── default.conf
│ └── mysql/
│ └── my.cnf
├── docker-compose.yml
├── docker-compose.prod.yml
├── .env
├── .env.example
└── src/
└── index.php
PHP Dockerfile
# docker/php/Dockerfile
FROM php:8.2-fpm
# 安装系统依赖
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
libzip-dev \
zip \
unzip \
libpq-dev \
libjpeg-dev \
libfreetype6-dev \
libssl-dev \
pkg-config \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install \
pdo_mysql \
mysqli \
mbstring \
exif \
pcntl \
bcmath \
gd \
zip \
intl \
opcache
# 安装Redis扩展
RUN pecl install redis && docker-php-ext-enable redis
# 安装Xdebug(开发环境)
RUN pecl install xdebug && docker-php-ext-enable xdebug
# 安装Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# 设置工作目录
WORKDIR /var/www/html
# 复制配置文件
COPY docker/php/php.ini /usr/local/etc/php/conf.d/custom.ini
# 清理缓存
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# 设置权限
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
EXPOSE 9000
CMD ["php-fpm"]
PHP配置文件
; docker/php/php.ini upload_max_filesize = 20M post_max_size = 20M max_execution_time = 300 memory_limit = 256M date.timezone = Asia/Shanghai ; 开发环境配置 display_errors = On error_reporting = E_ALL log_errors = On error_log = /var/log/php/error.log ; OpCache配置 opcache.enable = 1 opcache.memory_consumption = 128 opcache.interned_strings_buffer = 8 opcache.max_accelerated_files = 10000 opcache.revalidate_freq = 2 opcache.fast_shutdown = 1 ; Xdebug配置 xdebug.mode = debug xdebug.client_host = host.docker.internal xdebug.client_port = 9003 xdebug.start_with_request = yes
docker-compose.yml(开发环境)
version: '3.8'
services:
# PHP服务
php:
build:
context: .
dockerfile: docker/php/Dockerfile
container_name: ${PROJECT_NAME}_php
restart: unless-stopped
volumes:
- ./src:/var/www/html
- ./docker/php/php.ini:/usr/local/etc/php/conf.d/custom.ini
environment:
- PHP_IDE_CONFIG=serverName=Docker
networks:
- app-network
extra_hosts:
- "host.docker.internal:host-gateway"
# Nginx服务
nginx:
image: nginx:alpine
container_name: ${PROJECT_NAME}_nginx
restart: unless-stopped
ports:
- "${NGINX_PORT}:80"
volumes:
- ./src:/var/www/html
- ./docker/nginx/conf.d:/etc/nginx/conf.d
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./logs/nginx:/var/log/nginx
depends_on:
- php
networks:
- app-network
# MySQL服务
mysql:
image: mysql:8.0
container_name: ${PROJECT_NAME}_mysql
restart: unless-stopped
ports:
- "${MYSQL_PORT}:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
networks:
- app-network
# Redis服务
redis:
image: redis:7-alpine
container_name: ${PROJECT_NAME}_redis
restart: unless-stopped
ports:
- "${REDIS_PORT}:6379"
command: redis-server --appendonly yes
volumes:
- redis_data:/data
networks:
- app-network
# Adminer(数据库管理工具,可选)
adminer:
image: adminer:latest
container_name: ${PROJECT_NAME}_adminer
restart: unless-stopped
ports:
- "8080:8080"
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mysql_data:
redis_data:
docker-compose.prod.yml(生产环境)
version: '3.8'
services:
# PHP服务
php:
build:
context: .
dockerfile: docker/php/Dockerfile.prod
container_name: ${PROJECT_NAME}_php
restart: always
volumes:
- ./src:/var/www/html:ro
- ./storage:/var/www/html/storage
environment:
- APP_ENV=production
networks:
- app-network
# Nginx服务
nginx:
image: nginx:alpine
container_name: ${PROJECT_NAME}_nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./src:/var/www/html:ro
- ./docker/nginx/conf.d:/etc/nginx/conf.d:ro
- ./certbot/conf:/etc/nginx/ssl:ro
- ./certbot/www:/var/www/certbot
depends_on:
- php
networks:
- app-network
# MySQL服务
mysql:
image: mysql:8.0
container_name: ${PROJECT_NAME}_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network
# Redis服务
redis:
image: redis:7-alpine
container_name: ${PROJECT_NAME}_redis
restart: always
command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
volumes:
- redis_data:/data
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mysql_data:
redis_data:
生产环境Dockerfile
# docker/php/Dockerfile.prod
FROM php:8.2-fpm
# 安装系统依赖(精简)
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
libzip-dev \
libjpeg-dev \
libfreetype6-dev \
libssl-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install \
pdo_mysql \
mysqli \
mbstring \
exif \
pcntl \
bcmath \
gd \
zip \
intl \
opcache \
&& pecl install redis \
&& docker-php-ext-enable redis \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 安装Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
# 复制生产配置
COPY docker/php/php.prod.ini /usr/local/etc/php/conf.d/custom.ini
# 非root用户运行
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
USER www-data
EXPOSE 9000
CMD ["php-fpm"]
生产环境PHP配置
; docker/php/php.prod.ini upload_max_filesize = 20M post_max_size = 20M max_execution_time = 300 memory_limit = 256M date.timezone = Asia/Shanghai ; 生产环境配置 display_errors = Off log_errors = On error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT error_log = /var/log/php/error.log ; OpCache配置(生产优化) opcache.enable = 1 opcache.memory_consumption = 128 opcache.interned_strings_buffer = 16 opcache.max_accelerated_files = 10000 opcache.revalidate_freq = 60 opcache.fast_shutdown = 1 opcache.validate_timestamps = 0 ; 安全配置 expose_php = Off session.cookie_httponly = 1 session.use_strict_mode = 1
Nginx配置
# docker/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
# 日志配置
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
# PHP配置
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param APP_ENV development;
}
# 其他配置
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
环境变量文件
# .env.example # 项目配置 PROJECT_NAME=php_app # 端口配置 NGINX_PORT=8080 MYSQL_PORT=3306 REDIS_PORT=6379 # MySQL配置 MYSQL_ROOT_PASSWORD=root_password MYSQL_DATABASE=app_database MYSQL_USER=app_user MYSQL_PASSWORD=app_password # Redis配置 REDIS_PASSWORD=redis_password
常用命令
# 启动开发环境 docker-compose up -d # 查看状态 docker-compose ps # 查看日志 docker-compose logs -f # 进入PHP容器 docker-compose exec php bash # 运行Composer命令 docker-compose exec php composer install # 运行Artisan命令(Laravel) docker-compose exec php php artisan migrate # 停止服务 docker-compose stop # 重新构建 docker-compose up -d --build # 生产环境 docker-compose -f docker-compose.prod.yml up -d # 一键部署脚本 #!/bin/bash # deploy.sh echo "开始部署..." git pull origin main docker-compose -f docker-compose.prod.yml up -d --build docker-compose -f docker-compose.prod.yml exec php php artisan migrate --force docker-compose -f docker-compose.prod.yml exec php php artisan config:cache docker-compose -f docker-compose.prod.yml exec php php artisan route:cache docker-compose -f docker-compose.prod.yml exec php php artisan view:cache echo "部署完成!"
.dockerignore文件
.git
.gitignore
.env
.env.*
!.env.example
node_modules
vendor
storage
*.log
.DS_Store
docker-compose*.yml
这个方案提供了:
- 完整的开发环境(含Xdebug调试)
- 生产环境优化配置
- 多服务容器编排
- 数据持久化
- 环境变量管理
- 一键部署支持
你可以根据项目需求(Laravel、WordPress、ThinkPHP等)调整配置。