裸机装 LNMP 的痛点会在某个深夜集中爆发:升 PHP 版本牵动全站、换服务器要按《网站搬家不宕机:从旧服务器到新服务器的完整迁移动线》的流程重新装一遍环境、本地和线上环境不一致导致“我这明明是好的”。Docker 对建站的改变就一句话:环境变成可声明的。Nginx 什么版本、PHP 带哪些扩展、MySQL 多少内存,全部写在一个 docker-compose.yml 里,任何一台装了 Docker 的机器上跑一下,环境就原样复活。这篇带你用 compose 把 WordPress 站点容器化跑起来,顺便把容器的日常运维讲透。
先装 Docker(官方脚本一条命令),然后写核心的 compose 文件:
# 安装Docker(Ubuntu/Debian)
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker
# 项目目录结构
# /opt/mysite/
# ├── docker-compose.yml
# ├── nginx/default.conf
# └── data/ # 数据库和WP文件都挂这里
compose 文件声明三个服务:Nginx 做入口、PHP-FPM 跑 WP、MySQL 存数据:
# /opt/mysite/docker-compose.yml
services:
nginx:
image: nginx:1.27-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./data/wordpress:/var/www/html:ro
depends_on:
- wordpress
restart: unless-stopped
wordpress:
image: wordpress:php8.3-fpm
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wp
volumes:
- ./data/wordpress:/var/www/html
depends_on:
- db
restart: unless-stopped
db:
image: mysql:8.4
environment:
MYSQL_DATABASE: wp
MYSQL_USER: wp
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- ./data/mysql:/var/lib/mysql
restart: unless-stopped
几个设计要点说一下。密码用 ${DB_PASSWORD} 环境变量占位,明文写在同目录的 .env 文件里并把它加进 .gitignore——密码进代码库是运维大忌。数据全挂载在宿主机的 ./data 目录:数据库文件和 WP 文件都不在容器里,容器随时可以删掉重建,数据纹丝不动——这就是“换服务器就是换个目录”的底气:把整个 /opt/mysite 打包 rsync 到新机器,docker compose up -d,全站复活。restart: unless-stopped 保证机器重启后服务自愈,不写这行服务器一重启网站就消失,是 Docker 建站最高频的翻车点。
Nginx 配置里 PHP 的 fastcgi_pass 要指向容器名(compose 网络里服务名就是主机名):
# /opt/mysite/nginx/default.conf
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php;
# 伪静态(《固定链接一改文章页全 404:Nginx 伪静态一次配对》的try_files原样搬进来)
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
# 关键区别:指向容器服务名 wordpress,9000端口
fastcgi_pass wordpress:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
启动与验证:
cd /opt/mysite
docker compose up -d
docker compose ps # 三个服务都应该是running/healthy
curl -I http://127.0.0.1 # 通了就是nginx到php到db整条链路活了
# 日常运维三板斧
docker compose logs -f wordpress # 看日志(替代tail)
docker compose exec wordpress bash # 进容器排查
docker compose pull && docker compose up -d # 升级镜像
docker image prune -f # 清理旧镜像(配logrotate式定期跑)
说清楚几个进阶注意点。第一,防火墙和之前不一样:容器端口映射会绕过 UFW 的部分规则(Docker 直接改 iptables),《UFW防火墙十分钟入门:先立规则再开门,别把自己锁外面》配的防火墙对容器端口要单独验证——nc 从外部测一遍为准。第二,《WordPress页面缓存怎么选:插件格局2026盘点,附Nginx原生方案》的页面缓存、《netdata一键装监控:每秒级仪表盘配告警,出事先于用户知道》的监控在容器里照样能用,netdata 有容器自动识别,能按容器粒度看资源。第三,现有裸机站点想迁移过来,路径就是《网站搬家不宕机:从旧服务器到新服务器的完整迁移动线》的流程加一个环节:rsync 文件进 ./data/wordpress、mysqldump 导进容器里的 MySQL,其余照旧。Docker 不是必须的,但当你第二台机器、第三个站点出现时,它的复利就开始体现了——环境即代码,重装不再是灾难片。
相关阅读:容器化是运营段的进阶选项。《从零建站第一步:技术栈选型总纲,别一上来就纠结框架》路线图里,本篇给想换赛道的老站点一条新路,总纲新旧两条线都有篇目支撑。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
