ThinkPHP项目Docker环境配置

wen PHP项目 3

本文目录导读:

ThinkPHP项目Docker环境配置

  1. 项目结构
  2. Docker Compose 配置
  3. PHP Dockerfile
  4. Nginx 配置
  5. MySQL 配置
  6. Redis 配置
  7. 环境变量文件 (.env)
  8. .dockerignore
  9. 使用说明
  10. 常见问题解决

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

抱歉,评论功能暂时关闭!