为什么要用Docker部署博客?

之前我部署博客,要先装Nginx、PHP、MySQL,还要一堆配置,折腾一天都搞不定。

用Docker,10分钟搞定,而且:

  • 一键部署,不用配置环境
  • 随时备份,移动服务器只需打包一个compose文件
  • 多个博客互不干扰(一个容器一个博客)
  • 版本升级安全,不会影响系统

准备工作

1. 服务器要求

  • 至少1GB内存(WordPress+MySQL需要至少512MB)
  • 20GB磁盘空间
  • Ubuntu 20.04+ 或 CentOS 7+

2. 安装Docker和Compose

1
2
3
4
5
6
7
8
9
# Ubuntu
apt update
apt install -y docker.io docker-compose
systemctl start docker
systemctl enable docker

# 验证
docker --version
docker-compose --version

3. 防火墙放行

1
2
3
4
5
6
7
8
9
# Ubuntu
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

# CentOS
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

创建WordPress项目

1. 创建项目目录

1
2
mkdir -p ~/myblog
cd ~/myblog

2. 创建docker-compose.yml

编辑 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
version: '3.8'

services:
# WordPress容器
wordpress:
image: wordpress:latest
container_name: myblog-wordpress
restart: unless-stopped
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db # 数据库服务名
WORDPRESS_DB_USER: wordpress # 数据库用户
WORDPRESS_DB_PASSWORD: StrongPassword123!
WORDPRESS_DB_NAME: wordpressdb
volumes:
- wordpress_data:/var/www/html # 持久化WordPress文件
depends_on:
- db

# MySQL容器
db:
image: mysql:5.7
container_name: myblog-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: RootPassword123!
MYSQL_DATABASE: wordpressdb
MYSQL_USER: wordpress
MYSQL_PASSWORD: StrongPassword123!
volumes:
- mysql_data:/var/lib/mysql # 持久化MySQL数据

# phpMyAdmin(可选,方便管理数据库)
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: myblog-phpmyadmin
restart: unless-stopped
ports:
- "8080:80"
environment:
PMA_HOST: db
depends_on:
- db

volumes:
wordpress_data:
mysql_data:

密码安全提示

  • 千万不要用我给的示例密码,改成复杂的!
  • 至少16位,包含大小写、数字、符号

启动博客

1
2
3
4
5
6
7
8
# 启动所有服务
docker-compose up -d

# 查看运行状态
docker-compose ps

# 查看日志
docker-compose logs -f

等待1-2分钟,服务就会启动完成。


初始化WordPress

1. 访问网站

打开浏览器,访问 http://服务器IP

2. 选择语言

选择”简体中文”,点Continue

3. 填写网站信息

  • 站点标题:你的博客名称(如”我的技术博客”)
  • 用户名:后台登录用户名
  • 密码:后台登录密码(记好!)
  • 邮箱:你的邮箱
  • 点”安装WordPress”

4. 登录

安装完成后,点”登录”,用刚才设置的用户名密码登录。


数据库管理(可选)

访问 http://服务器IP:8080 进入phpMyAdmin:

  • 用户名:wordpress
  • 密码:StrongPassword123!(compose.yml里设置的)

域名绑定

1. 准备域名

假设你已购买域名,如 blog.example.com

2. 修改compose.yml

把ports改成:

1
2
3
ports:
- "80:80"
- "443:443" # 添加HTTPS端口

3. 配置域名DNS

在域名服务商后台,添加A记录:

1
blog.example.com  →  你的服务器IP

等待DNS生效(10分钟到24小时)

4. 用域名访问

访问 http://blog.example.com


配置SSL证书(HTTPS)

方法1:使用Nginx反向代理 + Let’s Encrypt

创建Nginx配置

1
2
# 安装Nginx
apt install -y nginx

编辑 /etc/nginx/sites-available/blog.conf

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name blog.example.com;

location / {
proxy_pass http://localhost:8080; # 转发到WordPress(改端口避免冲突)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

修改compose.yml,WordPress端口改为8080:

1
2
ports:
- "127.0.0.1:8080:80" # 只监听本地,通过Nginx对外

启动Nginx:

1
2
3
ln -s /etc/nginx/sites-available/blog.conf /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

申请Let’s Encrypt证书

1
2
3
4
5
# 安装certbot
apt install -y certbot python3-certbot-nginx

# 自动配置HTTPS
certbot --nginx -d blog.example.com

按照提示输入邮箱,同意服务条款。

访问 https://blog.example.com,应该能看到小锁图标了!


备份和恢复

备份

1
2
3
4
5
6
# 备份docker-compose配置
tar -czf backup_$(date +%Y%m%d).tar.gz compose.yml

# 备份数据卷(WordPress和MySQL)
docker run --rm -v myblog_wordpress_data:/data -v $(pwd):/backup alpine tar czf /backup/wordpress_data.tar.gz /data
docker run --rm -v myblog_mysql_data:/data -v $(pwd):/backup alpine tar czf /backup/mysql_data.tar.gz /data

定时备份(添加到crontab):

1
2
# 每天凌晨3点备份
0 3 * * * cd /root/myblog && docker run --rm -v myblog_wordpress_data:/data -v /root/backups:/backup alpine tar czf /backup/wordpress_$(date +\%Y\%m\%d).tar.gz /data

恢复

1
2
3
4
5
6
7
# 在新服务器上恢复
cd ~/myblog
docker-compose up -d

# 恢复数据
docker run --rm -v myblog_wordpress_data:/data -v $(pwd):/backup alpine tar xzf /backup/wordpress_data.tar.gz -C /
docker run --rm -v myblog_mysql_data:/data -v $(pwd):/backup alpine tar xzf /backup/mysql_data.tar.gz -C /

常用维护命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f wordpress
docker-compose logs -f mysql

# 重启服务
docker-compose restart
docker-compose restart wordpress # 只重启WordPress

# 停止服务
docker-compose stop

# 启动服务
docker-compose start

# 删除服务(数据不会丢失)
docker-compose down

# 删除所有(包括数据卷!慎用)
docker-compose down -v

性能优化

1. 启用WordPress缓存

安装插件:

  • WP Rocket(收费)
  • W3 Total Cache(免费)
  • Autoptimize(免费)

2. MySQL优化

在compose.yml的db环境变量中添加:

1
2
3
4
environment:
...
MYSQL_INNODB_BUFFER_POOL_SIZE: 256M
MYSQL_INNODB_LOG_FILE_SIZE: 64M

3. 内存限制

添加到WordPress容器:

1
2
3
wordpress:
...
mem_limit: 512m # 限制内存使用

踩坑经验

坑1:上传文件大小限制

WordPress默认只允许2MB,修改php.ini:

在compose.yml添加:

1
2
3
4
5
6
7
wordpress:
...
environment:
WORDPRESS_CONFIG_EXTRA: |
define('WP_MEMORY_LIMIT', '256M');
@ini_set('upload_max_filesize', '100M');
@ini_set('post_max_size', '100M');

坑2:主题/插件自动更新失败

权限问题:

1
docker exec -it myblog-wordpress chown -R www-data:www-data /var/www/html

坑3:SSL证书续期

Let’s Encrypt证书90天到期,添加定时任务:

1
2
# 每月1号凌晨3点续期
0 3 1 * * certbot renew --quiet && systemctl reload nginx

坑4:更换域名后无法访问

在WordPress后台设置→常规修改URL,或直接修改数据库:

1
docker exec -it myblog-mysql mysql -uroot -p wordpressdb

执行:

1
UPDATE wp_options SET option_value='https://blog.example.com' WHERE option_name='siteurl' OR option_name='home';

扩展:多站点部署

要部署多个博客,创建不同目录:

1
2
mkdir -p ~/blog2 ~/blog3
# 复制compose.yml,修改端口号和数据卷名

总结

  • 准备工作:安装Docker和Compose,放行防火墙
  • compose.yml:定义WordPress、MySQL、phpMyAdmin
  • 一键启动docker-compose up -d
  • 初始化:访问网站,填写信息,完成安装
  • 域名绑定:DNS添加A记录,等待生效
  • SSL证书:用Nginx反向代理 + Let’s Encrypt
  • 备份:定期备份数据卷和compose文件
  • 维护:用docker-compose管理服务,查看日志、重启等
  • 优化:安装缓存插件,调整MySQL参数,限制内存
  • 坑挺多,耐心解决,WordPress部署一次,终身受益

下一篇:自动备份脚本实战。