本文目录导读:

- 基础项目结构
- 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等)调整配置。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播