本文目录导读:

我来为您提供一份完整的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环境中顺畅运行,并方便开发和调试,如有特殊需求,可根据实际情况调整配置。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播