← 返回首页

WordPress Docker生产环境部署避坑完整指南

DockerWordPress建站容器化Nginx

为什么选择Docker而不是宝塔或Lnmp

2026年的WordPress托管已经不只是「装个面板」那么简单了。我用过宝塔、Lnmp、手动编译lnmp,最终切到Docker,原因只有一个:环境一致性

当你有3台服务器、都要迁移WordPress时,宝塔的版本差异会让你崩溃。而docker-compose up -d一个文件,3台机器跑出完全相同的环境。

但Docker部署WordPress有一系列独特的坑,本文说透7个我实际踩过的。

我的docker-compose.yml配置(2026年最新)

这是我在2026年测试过能正常运行的完整配置,包含Nginx+PHP-FPM+MySQL+Redis:

version: '3.8'

services:
  nginx:
    image: nginx:1.25-alpine
    container_name: wp_nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./wordpress:/var/www/html:ro
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php
    restart: unless-stopped

  php:
    image: php:8.3-fpm-alpine
    container_name: wp_php
    volumes:
      - ./wordpress:/var/www/html
    depends_on:
      - db
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=wp_user
      - WORDPRESS_DB_PASSWORD=your_strong_password
    restart: unless-stopped

  db:
    image: mysql:8.0
    container_name: wp_mysql
    volumes:
      - db_data:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wp_user
      - MYSQL_PASSWORD=your_strong_password
      - MYSQL_ROOT_PASSWORD=root_strong_password
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    container_name: wp_redis
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
    volumes:
      - redis_data:/data
    restart: unless-stopped

volumes:
  db_data:
  redis_data:

关键版本确认(2026年5月)

坑1:UID 1000权限问题——插件无法更新的根源

症状:WordPress后台提示「无法写入文件」,插件更新失败,媒体上传报错。

原因:Docker容器内运行的用户通常是www-data(UID 33)或自定义用户,而宿主机挂载卷的文件属于你的用户账号(UID 1000)。两边UID不匹配。

解决方案:在docker-compose.yml中统一PHP容器内用户UID:

php:
  image: php:8.3-fpm-alpine
  user: "1000:1000"  # 匹配宿主机用户
  volumes:
    - ./wordpress:/var/www/html

但这又会造成新问题——如果宿主机是root运行的容器,UID 1000可能不存在。更好的方案是用PGID 1000:

php:
  image: php:8.3-fpm-alpine
  user: "1000:82"  # 1000=你的用户,82=www-data组

**验证方法**:在宿主机运行 ls -ln wordpress/ 确认文件所有权,然后进入容器检查:

docker exec -it wp_php sh -c "id"
# 应该显示 uid=1000 gid=82

坑2:Nginx无法读取WordPress文件——卷挂载路径问题

症状:访问网站显示「File not found」,但容器日志显示PHP-FPM正常运行。

**原因**:官方WordPress镜像把文件放在/var/www/html,但你的宿主机目录挂载到了错误路径。

正确的nginx配置(必须写在nginx/default.conf):

server {
    listen 80;
    server_name yourdomain.com;
    root /var/www/html;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires max;
        log_not_found off;
    }
}

**注意**:fastcgi_pass php:9000; 中的php是docker-compose服务名,不是localhost。

坑3:MySQL数据持久化失效——volume挂载常见错误

症状:重启容器后数据库清空,所有WordPress内容丢失。

原因:没有正确使用Docker volume,导致数据存在容器可写层(容器删除则数据丢失)。

正确配置(已在上面的docker-compose.yml中展示):

volumes:
  db_data:  # 命名volume,由Docker管理

# 而不是:
# volumes:
#   - /var/lib/mysql  # 宿主机路径,可能权限问题

验证持久化是否生效

docker volume ls | grep wp
# 应该看到 wp_db_data

docker inspect wp_mysql | grep -A5 Mounts
# 应该看到 Destination: /var/lib/mysql 类型为 volume

坑4:WordPress无法连接Redis——容器间通信DNS问题

症状:安装了Redis Object Cache插件,但连接失败,网站仍然很慢。

**原因**:WordPress容器内连接Redis时,主机名应该是redis(docker-compose服务名),不是localhost127.0.0.1

在wp-config.php中配置Redis

define('WP_REDIS_HOST', 'redis');
define('WP_REDIS_PORT', '6379');
define('WP_REDIS_TIMEOUT', '2.5');
define('WP_REDIS_READ_TIMEOUT', '2.5');
define('WP_REDIS_DATABASE', '0');

验证Redis是否可达

docker exec -it wp_php sh -c "nc -zv redis 6379"
# 成功输出:redis (172.x.x.x:6379) open

坑5:WordPress升级后502 Bad Gateway——PHP-FPM进程崩溃

症状:WordPress后台升级主题或插件后,网站立即显示502错误。

原因:PHP-FPM默认进程数配置过低,高并发或插件执行超时时进程全部挂掉。

在docker-compose.yml中调整PHP-FPM配置

php:
  image: php:8.3-fpm-alpine
  volumes:
    - ./wordpress:/var/www/html
    - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini:ro

php/local.ini配置内容

memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 64M
post_max_size = 64M

[www]
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500

坑6:HTTP协议问题——网站打开是空白页或重定向循环

症状:访问网站后跳转到HTTPS,或者页面空白但无报错。

原因:Docker内Nginx不知道外部是否用了代理/CDN,需要在wp-config.php中强制正确协议。

在wp-config.php中添加

// 强制HTTP_HOST正确
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_HOST'] ?? 'yourdomain.com';

// 如果用了反向代理/负载均衡
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

Nginx的proxy_headers配置(如果有外部代理):

proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

坑7:docker-compose down后网站打不开——网络cleanup问题

症状:执行docker-compose down后再up,网站无法访问,但容器看起来都正常运行。

原因:Docker网络被清理但没有正确重建,容器间无法解析彼此的主机名。

解决方案:使用docker-compose down --remove-orphans而不是直接down:

# 停止并清理(推荐)
docker-compose down --remove-orphans

# 完全重启(彻底解决网络问题)
docker-compose down -v  # -v会删除volume,慎用!
docker-compose up -d

日常维护命令

# 查看所有容器状态
docker-compose ps

# 查看日志
docker-compose logs -f nginx

# 重启单个服务
docker-compose restart php

# 完整重载配置
docker-compose down && docker-compose up -d

总结:Docker部署WordPress的核心原则

1. UID匹配:宿主机用户UID和容器内用户UID必须一致,否则所有文件操作都会遇到权限问题

2. 使用命名volume:MySQL和Redis数据必须用Docker管理的命名volume,不用宿主机路径

3. 服务名即主机名:容器间通信用docker-compose服务名(php、db、redis),不是localhost

4. PHP-FPM配置要主动:默认配置太低,WordPress插件执行时容易崩溃

5. 网络重建用--remove-orphans:避免down/up后网络不通

如果你是第一次用Docker部署WordPress,建议先在本地VM测试完整流程,再迁移到生产服务器。

👉 立即体验:https://platform.minimaxi.com/subscribe/token-plan?code=E5yur9NOub&source=link

📌 This article was AI-assisted generated and human-reviewed | TechPassive — An AI-driven content testing site focused on real tool reviews

🔗 Recommended Tools

These are carefully selected tools. Using our affiliate links supports us to keep producing quality content:

☁️ DigitalOcean Cloud ⚡ Vultr VPS 📚 WordPress Books 🔍 WordPress SEO Books 🌐 Web Hosting Books 🐳 Docker Books 🐧 Linux Books 🐍 Python Books 💰 Affiliate Marketing 💵 Passive Income Books 🖥️ Server Books ☁️ Cloud Computing Books 🚀 DevOps Books ⭐ MiniMax Token Plan
← 返回首页