> 用Docker一键部署WordPress:10分钟建好站

为什么用Docker部署WordPress

传统方式部署WordPress要安装PHP、MySQL、Nginx,配一堆东西。用Docker?一个docker-compose.yml文件,一条命令,全部搞定。

而且迁移超方便——复制一下compose文件和数据目录,新服务器上直接docker compose up就能跑起来。

准备工作

确保已安装Docker和Docker Compose:

1
2
3
4
5
6
7
8
$ docker --version
Docker version 24.0.7, build afdd53b

$ docker compose version
Docker Compose version v2.21.0

# 如果没安装,一键安装
$ curl -fsSL https://get.docker.com | sh

快速部署

创建项目目录

1
$ mkdir -p /opt/wordpress && cd /opt/wordpress

编写docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# docker-compose.yml
version: "3.8"

services:
  wordpress:
    image: wordpress:6.4-php8.2-fpm
    container_name: wordpress-app
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wp_secure_password_2026
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    container_name: wordpress-db
    restart: always
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wp_secure_password_2026
      MYSQL_ROOT_PASSWORD: root_secure_password_2026
    volumes:
      - db_data:/var/lib/mysql
    command: '--default-authentication-plugin=mysql_native_password'

  nginx:
    image: nginx:1.24-alpine
    container_name: wordpress-nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - wordpress_data:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - wordpress

volumes:
  wordpress_data:
  db_data:

创建Nginx配置

1
$ mkdir -p nginx/conf.d nginx/ssl
1
$ vim nginx/conf.d/wordpress.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/html;
    index index.php index.html;

    # 上传文件大小限制
    client_max_body_size 64m;

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

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

    # 静态文件缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 禁止访问敏感文件
    location ~ /\.(ht|git) {
        deny all;
    }
}

启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ docker compose up -d
[+] Running 4/4
 ✔ Network wordpress_default  Created
 ✔ Container wordpress-db     Started
 ✔ Container wordpress-app    Started
 ✔ Container wordpress-nginx  Started

$ docker compose ps
NAME               IMAGE                        STATUS         PORTS
wordpress-app      wordpress:6.4-php8.2-fpm     Up 30 seconds  9000/tcp
wordpress-db       mysql:8.0                     Up 30 seconds  3306/tcp
wordpress-nginx    nginx:1.24-alpine             Up 30 seconds  0.0.0.0:80->80/tcp

打开浏览器访问http://你的服务器IP,就能看到WordPress安装界面了!

1
2
3
4
5
6
7
WordPress安装步骤:
1. 选择语言(简体中文)
2. 填写站点标题
3. 设置管理员用户名和密码
4. 填写邮箱
5. 点击"安装WordPress"
完成!

添加SSL证书

安装Certbot

1
$ sudo apt install -y certbot

申请证书

1
2
3
4
5
6
7
8
# 先临时停止nginx容器(释放80端口)
$ docker compose stop nginx

# 申请证书
$ sudo certbot certonly --standalone -d example.com -d www.example.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem

配置HTTPS

更新docker-compose.yml中的nginx volumes:

1
2
3
4
5
  nginx:
    volumes:
      - wordpress_data:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - /etc/letsencrypt:/etc/letsencrypt:ro

更新Nginx配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    root /var/www/html;
    index index.php index.html;
    client_max_body_size 64m;

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

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

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location ~ /\.(ht|git) {
        deny all;
    }
}
1
$ docker compose up -d

数据备份

备份脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# backup_wordpress.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/wordpress"
PROJECT_DIR="/opt/wordpress"

mkdir -p $BACKUP_DIR

# 备份数据库
docker exec wordpress-db mysqldump -u wordpress -p'wp_secure_password_2026' wordpress | gzip > $BACKUP_DIR/db_$DATE.sql.gz

# 备份WordPress文件
docker run --rm -v wordpress_wordpress_data:/data -v $BACKUP_DIR:/backup alpine tar -czf /backup/files_$DATE.tar.gz -C /data .

# 备份配置文件
cp -r $PROJECT_DIR/nginx $BACKUP_DIR/nginx_$DATE
cp $PROJECT_DIR/docker-compose.yml $BACKUP_DIR/docker-compose_$DATE.yml

# 清理7天前的备份
find $BACKUP_DIR -mtime +7 -delete

echo "[$(date)] WordPress备份完成"
1
2
3
4
5
$ chmod +x backup_wordpress.sh

# 添加定时任务
$ crontab -e
0 3 * * * /opt/wordpress/backup_wordpress.sh >> /var/log/wp-backup.log 2>&1

恢复数据

1
2
3
4
5
# 恢复数据库
$ gunzip < /backup/wordpress/db_20260215.sql.gz | docker exec -i wordpress-db mysql -u wordpress -p'wp_secure_password_2026' wordpress

# 恢复文件
$ docker run --rm -v wordpress_wordpress_data:/data -v /backup/wordpress:/backup alpine sh -c "cd /data && tar -xzf /backup/files_20260215.tar.gz"

WordPress性能优化

php配置优化

创建自定义php配置:

1
2
$ mkdir -p php
$ vim php/uploads.ini
1
2
3
4
5
file_uploads = On
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300

在docker-compose.yml中挂载:

1
2
3
4
  wordpress:
    volumes:
      - wordpress_data:/var/www/html
      - ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini

添加Redis缓存

1
2
3
4
5
6
  redis:
    image: redis:7-alpine
    container_name: wordpress-redis
    restart: always
    volumes:
      - redis_data:/data

然后在WordPress后台安装"Redis Object Cache"插件并启用。

常用维护命令

操作命令
查看状态docker compose ps
查看日志docker compose logs -f
重启所有服务docker compose restart
更新WordPressdocker compose pull && docker compose up -d
进入WordPress容器docker compose exec wordpress bash
进入MySQLdocker compose exec db mysql -u wordpress -p
1
2
3
4
5
6
7
8
# 更新WordPress到最新版本
$ docker compose pull
Pulling wordpress ... done
$ docker compose up -d
[+] Running 3/3
 ✔ Container wordpress-db     Running
 ✔ Container wordpress-app    Started (recreated)
 ✔ Container wordpress-nginx  Running

常见问题

上传文件报错

1
"上传的文件尺寸超过 php.ini 中定义的 upload_max_filesize 值"

解决:按上面的php配置优化调整upload_max_filesize

数据库连接失败

1
2
3
# 检查数据库容器是否运行
$ docker compose logs db
# 确认环境变量中的密码一致

总结

用Docker部署WordPress,整个过程不到10分钟。核心就是一个docker-compose.yml文件加一个Nginx配置。别忘了配备份脚本和SSL证书。

Docker基础操作参考Docker入门教程。Docker Compose的更多用法看Docker Compose实战

Docker WordPress 建站
cd ..