本文目录导读:

我来为您提供一份完整的ThinkPHP项目Docker环境配置方案。
项目结构
thinkphp-docker/
├── docker/
│ ├── php/
│ │ └── Dockerfile
│ ├── nginx/
│ │ ├── Dockerfile
│ │ └── conf.d/
│ │ └── default.conf
│ └── mysql/
│ └── conf/
│ └── my.cnf
├── docker-compose.yml
├── .env
└── .dockerignore
Docker Compose 配置
docker-compose.yml
version: '3.8'
services:
# PHP-FPM 服务
php:
build:
context: ./docker/php
dockerfile: Dockerfile
container_name: tp_php
restart: always
working_dir: /var/www/html
volumes:
- ./source:/var/www/html
- ./docker/php/php.ini:/usr/local/etc/php/conf.d/php.ini
- ./docker/php/www.conf:/usr/local/etc/php-fpm.d/www.conf
environment:
- PHP_IDE_CONFIG=serverName=ThinkPHP
networks:
- tp_network
depends_on:
- mysql
- redis
# Nginx 服务
nginx:
image: nginx:latest
container_name: tp_nginx
restart: always
ports:
- "${NGINX_PORT:-80}:80"
- "${NGINX_HTTPS_PORT:-443}:443"
volumes:
- ./source:/var/www/html
- ./docker/nginx/conf.d:/etc/nginx/conf.d
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/logs:/var/log/nginx
networks:
- tp_network
depends_on:
- php
# MySQL 服务
mysql:
image: mysql:8.0
container_name: tp_mysql
restart: always
ports:
- "${MYSQL_PORT:-3306}: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/conf:/etc/mysql/conf.d
- ./docker/mysql/init:/docker-entrypoint-initdb.d
networks:
- tp_network
# Redis 服务
redis:
image: redis:7-alpine
container_name: tp_redis
restart: always
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
- ./docker/redis/conf:/usr/local/etc/redis
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- tp_network
# Composer 服务(编译用)
composer:
image: composer:2
container_name: tp_composer
restart: "no"
volumes:
- ./source:/app
working_dir: /app
networks:
- tp_network
command: install --prefer-dist --no-dev
# PHPMyAdmin(开发环境可选)
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: tp_phpmyadmin
restart: always
ports:
- "${PMA_PORT:-8080}:80"
environment:
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=${MYSQL_ROOT_PASSWORD}
networks:
- tp_network
depends_on:
- mysql
profiles:
- dev
networks:
tp_network:
driver: bridge
volumes:
mysql_data:
redis_data:
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 \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libcurl4-openssl-dev \
libssl-dev \
openssl \
zip \
unzip \
nodejs \
npm \
build-essential \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) \
pdo \
pdo_mysql \
mysqli \
gd \
mbstring \
xml \
exif \
pcntl \
bcmath \
zip \
opcache \
&& pecl install redis-5.3.7 \
&& docker-php-ext-enable redis \
&& pecl install swoole \
&& docker-php-ext-enable swoole \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 安装 Composer
COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer
# 安装 Xdebug(开发环境)
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
# 设置工作目录
WORKDIR /var/www/html
# 复制配置文件
COPY ./php.ini /usr/local/etc/php/conf.d/
COPY ./www.conf /usr/local/etc/php-fpm.d/
# 启动 php-fpm
CMD ["php-fpm"]
EXPOSE 9000
docker/php/php.ini
; 时区设置 date.timezone = Asia/Shanghai ; 内存限制 memory_limit = 512M ; 上传限制 upload_max_filesize = 100M post_max_size = 100M ; 错误显示(开发环境) 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 = 4000 opcache.validate_timestamps = 1 opcache.revalidate_freq = 0 ; Xdebug 配置 xdebug.mode = debug xdebug.start_with_request = yes xdebug.idekey = PHPSTORM xdebug.client_host = host.docker.internal xdebug.client_port = 9000 ; Swoole 配置 swoole.use_shortname = 'Off'
docker/php/www.conf
[www] user = www-data group = www-data listen = 127.0.0.1:9000 listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = dynamic pm.max_children = 20 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 15 pm.max_requests = 500 request_terminate_timeout = 60 request_slowlog_timeout = 10 slowlog = /var/log/php/slow.log catch_workers_output = yes
Nginx 配置
docker/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html/public;
index index.php index.html index.htm;
# 访问日志
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 静态文件缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
# ThinkPHP 路由配置
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
# PHP 请求处理
location ~ ^/index\.php(/|$) {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# ThinkPHP 相关参数
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PHP_VALUE "auto_prepend_file=/var/www/html/public/index.php";
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_read_timeout 600;
}
# 禁止访问其他 PHP 文件
location ~ \.php$ {
deny all;
return 403;
}
# 静态资源目录
location /static/ {
alias /var/www/html/public/static/;
expires 30d;
}
# 上传目录
location /uploads/ {
alias /var/www/html/public/uploads/;
expires 7d;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
return 404;
}
# 错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
docker/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
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;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# 性能优化
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 100m;
large_client_header_buffers 2 1k;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
# gzip 压缩
gzip on;
gzip_vary on;
gzip_disable "msie6";
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css text/javascript
application/json application/javascript
application/xml application/xml+rss
image/svg+xml application/x-font-ttf;
include /etc/nginx/conf.d/*.conf;
}
MySQL 配置
docker/mysql/conf/my.cnf
[mysqld] # 字符集 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 时区 default-time-zone='+08:00' # 性能优化 innodb_buffer_pool_size = 256M innodb_log_file_size = 100M innodb_flush_method = O_DIRECT innodb_file_per_table = 1 # 连接数 max_connections = 200 max_allowed_packet = 64M # 日志 slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 2 [client] default-character-set=utf8mb4
Redis 配置
docker/redis/conf/redis.conf
# 网络
bind 0.0.0.0
port 6379
protected-mode yes
# 持久化
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
# 内存管理
maxmemory 256mb
maxmemory-policy allkeys-lru
# 安全
requirepass ${REDIS_PASSWORD:-}
# 日志
loglevel notice
logfile ""
# 快照配置
save 900 1
save 300 10
save 60 10000
环境变量文件 (.env)
# === NGINX === NGINX_PORT=80 NGINX_HTTPS_PORT=443 # === MySQL === MYSQL_PORT=3306 MYSQL_ROOT_PASSWORD=root123456 MYSQL_DATABASE=thinkphp MYSQL_USER=thinkphp MYSQL_PASSWORD=thinkphp123 # === Redis === REDIS_PORT=6379 REDIS_PASSWORD=redis123 # === PHPMyAdmin === PMA_PORT=8080 # === PHP 配置 === PHP_VERSION=8.2
.dockerignore
.git
.gitignore
.idea
.vscode
node_modules
vendor
runtime
*.log
.env
使用说明
启动服务
# 构建并启动服务 docker-compose up -d # 启动特定服务 docker-compose up -d php nginx mysql # 查看日志 docker-compose logs -f php # 停止服务 docker-compose down # 重启服务 docker-compose restart
运行 Composer
# 安装依赖 docker-compose run --rm composer install # 更新依赖 docker-compose run --rm composer update # 执行特定命令 docker-compose run --rm composer dump-autoload
常用命令
# 进入 PHP 容器 docker-compose exec php bash # 进入 MySQL 容器 docker-compose exec mysql mysql -u root -p # 进入 Redis 容器 docker-compose exec redis redis-cli # 查看所有容器状态 docker-compose ps # 查看资源使用情况 docker stats
ThinkPHP 配置示例
// config/database.php
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => 'mysql', // 服务名
'database' => 'thinkphp',
'username' => 'thinkphp',
'password' => 'thinkphp123',
'hostport' => '3306',
'charset' => 'utf8mb4',
'prefix' => '',
'debug' => true,
],
'redis' => [
'type' => 'redis',
'host' => 'redis', // 服务名
'port' => 6379,
'password' => 'redis123',
'select' => 0,
'timeout' => 0,
'persistent' => false,
],
],
];
常见问题解决
权限问题
# 设置目录权限 chmod -R 777 source/runtime chmod -R 777 source/public/uploads
连接数据库超时
# 检查 MySQL 健康状态 docker-compose exec mysql mysqladmin ping -h localhost
Xdebug 调试配置
在 PHPStorm 中配置:
- Server Name: ThinkPHP
- Host: localhost
- Port: 80
- Debugger: Xdebug
- 映射路径: 项目路径
这样配置可以确保您的ThinkPHP项目在Docker环境中顺畅运行,并方便开发和调试,如有特殊需求,可根据实际情况调整配置。