1. 为什么选择容器化部署WordPress?
在传统服务器环境中部署WordPress需要处理大量依赖关系:PHP版本、MySQL配置、Apache/Nginx设置等。我曾在阿里云CentOS 7上手动部署WordPress时,就遇到过PHP扩展缺失导致白屏的问题,花了整整两天才定位到是gd库未安装。而容器化部署通过Docker镜像将运行环境标准化,彻底解决了"在我机器上能跑"的经典问题。
阿里云CentOS Stream作为滚动更新的Linux发行版,其软件仓库始终保持最新状态,与Docker的兼容性经过充分验证。实测在4核8G的ECS实例上,容器化WordPress的冷启动时间比传统部署快40%,这是因为Docker利用了联合文件系统(OverlayFS)的特性,避免了重复依赖加载。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 阿里云ECS实例选择
建议选择计算型c7实例系列,性价比最优。具体配置:
- 最低配置:2核4G(突发性能实例t5不推荐)
- 系统盘:40GB ESSD云盘
- 网络:按量付费100Mbps带宽
注意:必须开启安全组的80/443端口,如果使用SSH管理还需开放22端口。我曾遇到过因安全组配置错误导致容器内服务无法访问的案例。
2.2 CentOS Stream基础环境配置
bash复制# 更新系统
sudo dnf update -y
# 安装必要工具
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker CE仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
CentOS Stream 9默认使用firewalld而非iptables,需要特别处理:
bash复制# 允许防火墙转发
sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
sudo firewall-cmd --reload
3. Docker与Docker Compose安装
3.1 Docker引擎安装
bash复制# 安装Docker CE
sudo dnf install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl enable --now docker
# 验证安装
sudo docker run hello-world
3.2 Docker Compose部署
虽然可以通过pip安装,但推荐使用官方二进制:
bash复制sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证版本:
bash复制docker-compose --version
# 应输出:Docker Compose version v2.20.3
4. WordPress容器化部署实战
4.1 编写docker-compose.yml
创建项目目录并编写配置文件:
bash复制mkdir wordpress && cd wordpress
nano docker-compose.yml
配置文件内容:
yaml复制version: '3.8'
services:
db:
image: mysql:8.0
container_name: wp_db
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
networks:
- wp_network
restart: unless-stopped
wordpress:
image: wordpress:latest
container_name: wp_app
depends_on:
- db
volumes:
- wp_data:/var/www/html
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
networks:
- wp_network
restart: unless-stopped
volumes:
db_data:
wp_data:
networks:
wp_network:
driver: bridge
4.2 启动WordPress服务
bash复制docker-compose up -d
首次启动需要下载约600MB的镜像,具体耗时取决于网络状况。启动完成后可以通过docker ps查看运行状态:
bash复制CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 wordpress:latest "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp wp_app
x1y2z3a4b5c6 mysql:8.0 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp wp_db
5. 高级配置与优化
5.1 持久化存储验证
通过docker volume inspect命令确认数据卷位置:
bash复制docker volume inspect wordpress_db_data
docker volume inspect wordpress_wp_data
在阿里云环境中,建议将数据卷挂载到云盘而非本地磁盘:
yaml复制volumes:
db_data:
driver: local
driver_opts:
type: none
device: /mnt/cloud_disk/mysql
o: bind
wp_data:
driver: local
driver_opts:
type: none
device: /mnt/cloud_disk/wordpress
o: bind
5.2 性能调优参数
在docker-compose.yml中增加资源限制:
yaml复制services:
db:
deploy:
resources:
limits:
cpus: '1'
memory: 1G
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
wordpress:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
interval: 30s
timeout: 10s
retries: 3
5.3 HTTPS配置
使用Let's Encrypt证书的推荐方案:
- 修改wordpress服务端口映射:
yaml复制ports:
- "443:443"
- "80:80"
- 使用Nginx反向代理方案(推荐):
yaml复制services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
depends_on:
- wordpress
6. 常见问题排查
6.1 数据库连接失败
典型错误日志:
code复制WordPress数据库连接错误:建立数据库连接时出错
排查步骤:
- 检查db容器是否运行:
docker ps -f name=wp_db - 进入容器测试连接:
bash复制docker exec -it wp_db mysql -uwordpress -p
# 输入密码wordpress
- 验证网络连通性:
bash复制docker exec wp_app ping db
6.2 文件权限问题
WordPress需要写权限的目录:
code复制/var/www/html/wp-content/uploads
/var/www/html/wp-content/cache
解决方案:
bash复制docker exec wp_app chown -R www-data:www-data /var/www/html/wp-content
6.3 内存不足导致容器崩溃
典型症状:容器频繁重启,查看日志显示"Killed"。
解决方法:
- 调整docker-compose资源限制
- 增加SWAP空间(临时方案):
bash复制sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
7. 备份与迁移方案
7.1 完整备份流程
- 停止服务:
bash复制docker-compose down
- 备份数据卷:
bash复制docker run --rm -v wordpress_wp_data:/source -v $(pwd):/backup alpine tar czf /backup/wp_backup_$(date +%Y%m%d).tar.gz -C /source .
docker run --rm -v wordpress_db_data:/source -v $(pwd):/backup alpine tar czf /backup/db_backup_$(date +%Y%m%d).tar.gz -C /source .
- 备份docker-compose.yml:
bash复制cp docker-compose.yml docker-compose.backup.yml
7.2 迁移到新服务器
- 在新服务器恢复数据卷:
bash复制docker run --rm -v wordpress_wp_data:/target -v $(pwd):/backup alpine sh -c "rm -rf /target/* && tar xzf /backup/wp_backup_20230801.tar.gz -C /target"
- 启动服务:
bash复制docker-compose up -d
8. 监控与维护
8.1 基础监控方案
安装cAdvisor+Prometheus+Grafana组合:
yaml复制services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.0
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
restart: unless-stopped
8.2 日志管理
查看实时日志:
bash复制docker-compose logs -f wordpress
日志轮转配置:
bash复制docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3
8.3 定期维护任务
- 更新镜像:
bash复制docker-compose pull
docker-compose up -d --force-recreate
- 清理旧镜像:
bash复制docker image prune -a --filter "until=168h"
