Docker Compose PHP环境部署指南
1. 项目结构
php-docker/
├── docker-compose.yml
├── .env
├── nginx/
│ ├── Dockerfile
│ ├── nginx.conf
│ └── conf.d/
│ └── default.conf
├── php/
│ ├── Dockerfile
│ └── php.ini
├── mysql/
│ └── my.cnf
├── redis/
│ └── redis.conf
└── www/
└── index.php
2. 基础配置文件
2.1 环境变量配置 (.env)
# PHP版本
PHP_VERSION=8.2
# MySQL配置
MYSQL_VERSION=8.0
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_DATABASE=your_database
MYSQL_USER=your_user
MYSQL_PASSWORD=your_password
# Redis配置
REDIS_VERSION=7.0
REDIS_PASSWORD=your_redis_password
# 项目配置
PROJECT_NAME=myapp
TIMEZONE=Asia/Shanghai
2.2 Docker Compose配置
version: '3.8'
services:
nginx:
build:
context: ./nginx
args:
- TIMEZONE=${TIMEZONE}
container_name: ${PROJECT_NAME}-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./www:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
- ./logs/nginx:/var/log/nginx
depends_on:
- php
networks:
- app-network
php:
build:
context: ./php
args:
- PHP_VERSION=${PHP_VERSION}
- TIMEZONE=${TIMEZONE}
container_name: ${PROJECT_NAME}-php
volumes:
- ./www:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
- ./logs/php:/var/log/php
environment:
- TZ=${TIMEZONE}
networks:
- app-network
mysql:
image: mysql:${MYSQL_VERSION}
container_name: ${PROJECT_NAME}-mysql
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./logs/mysql:/var/log/mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- TZ=${TIMEZONE}
networks:
- app-network
redis:
image: redis:${REDIS_VERSION}
container_name: ${PROJECT_NAME}-redis
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf --requirepass ${REDIS_PASSWORD}
networks:
- app-network
networks:
app-network:
driver: bridge
3. 服务配置文件
3.1 Nginx配置
# nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3.2 PHP配置
# php/Dockerfile
ARG PHP_VERSION
FROM php:${PHP_VERSION}-fpm
# 安装PHP扩展
RUN apt-get update && apt-get install -y \
libzip-dev \
zip \
&& docker-php-ext-install \
pdo_mysql \
mysqli \
zip
# 安装Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# 配置时区
ARG TIMEZONE
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone
# 清理
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
3.3 MySQL配置
# mysql/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone = '+8:00'
max_connections = 1000
max_allowed_packet = 16M
# InnoDB配置
innodb_buffer_pool_size = 1G
innodb_log_buffer_size = 16M
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
3.4 Redis配置
# redis/redis.conf
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
4. 部署和使用
4.1 启动服务
# 构建并启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs -f
4.2 测试环境
// www/index.php
<?php
phpinfo();
5. 常见问题处理
5.1 权限问题
# 修改目录权限
chmod -R 777 logs/
chmod -R 777 www/
# 修改文件所有者
chown -R www-data:www-data www/
5.2 性能优化
# docker-compose.yml中添加资源限制
services:
php:
deploy:
resources:
limits:
cpus: '1'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
5.3 开发调试
# php/php.ini
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = /var/log/php/error.log
xdebug.mode = debug
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003