买了台 VPS,只跑一个博客太浪费了。能不能同一台机器跑 3 个 WordPress、1 个静态站、再加个个人网盘?
能。用 Docker + Nginx Proxy Manager,一台 $18.29/年的 RackNerd VPS 能轻松带起 5+ 个网站,而且互不干扰,坏一个站点不影响其他。
本文手把手教你从零搭建(不需要懂 Docker)。
为什么用 Docker?
| 传统方式(裸机装) | Docker 方式 |
|---|---|
| 多个网站共用一套 PHP/MySQL → 版本冲突 | 每个站独立容器,互不影响 |
| 装 Nginx 配置虚拟主机 → 容易配错 | Nginx Proxy Manager 图形化管理 |
| 迁移服务器 → 重新部署所有环境 | 导出容器 → 在新机一键恢复 |
| 某站被黑 → 可能影响整台机器 | 容器隔离,一个站被黑不影响其他 |
简单说:Docker 让你的 VPS 变成一台"迷你服务器集群",每个网站独立运行,管理比裸机简单十倍。
准备清单
| 需要什么 | 推荐 | 花费 |
|---|---|---|
| VPS | 2GB 内存以上 | $18.29/年起 |
| 系统 | Ubuntu 22.04 或 Debian 12 | 免费 |
| 域名 | 支持泛解析(*.yourdomain.com) | ~$10/年 |
| 时间 | 45 分钟 | 免费 |
还没有 VPS? 推荐 RackNerd 2GB 款 $18.29/年,性价比最高。要更好的性能选 Hostinger KVM 2(8GB/100GB NVMe)$8.99/月。
第一步:安装 Docker 和 Docker Compose
SSH 连上 VPS 后,执行:
# 一键安装 Docker
curl -fsSL https://get.docker.com | bash
# 安装 Docker Compose
apt update && apt install -y docker-compose-plugin
# 验证安装
docker --version
docker compose version
看到版本号就说明装好了。
第二步:安装 Portainer(Docker 可视化管理面板)
虽然命令行也能管理 Docker,但对新手来说 Portainer 的网页界面友好得多:
docker volume create portainer_data
docker run -d \
--name portainer \
--restart=always \
-p 9443:9443 \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
安装完成后,浏览器打开 https://你的IP:9443,创建管理员账号。
第三步:安装 Nginx Proxy Manager(反向代理神器)
这是整个方案的核心。Nginx Proxy Manager(简称 NPM)是一个带网页界面的 Nginx 反向代理工具,能:
- 自动申请和续期 SSL 证书(Let’s Encrypt)
- 图形化管理域名和端口映射
- 支持 WebSocket、HTTP/2
- 一键 301 重定向、访问控制
3.1 创建 docker-compose.yml
在 VPS 上创建一个目录:
mkdir -p ~/docker/npm && cd ~/docker/npm
用任意编辑器创建 docker-compose.yml(宝塔面板里可以用文件管理器,或者在终端用 nano/vim):
version: '3.8'
services:
npm:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
3.2 启动 NPM
docker compose up -d
启动后访问 http://你的IP:81:
- 默认邮箱:
[email protected] - 默认密码:
changeme
登录后立即修改密码。
第四步:部署第一个 WordPress 站点
我们用 Docker 跑一个 WordPress 容器,然后通过 NPM 把域名指向它。
4.1 创建 WordPress 的 docker-compose
mkdir -p ~/docker/site1 && cd ~/docker/site1
创建 docker-compose.yml:
version: '3.8'
services:
wordpress:
image: wordpress:latest
restart: always
ports:
- "8081:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass123
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wp-content:/var/www/html/wp-content
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass123
MYSQL_ROOT_PASSWORD: rootpass456
volumes:
- ./db:/var/lib/mysql
启动:
docker compose up -d
现在 WordPress 跑在 http://你的IP:8081。
4.2 用 NPM 绑定域名 + SSL
- 先把域名 DNS 解析到 VPS 的 IP(A 记录)
- 打开 NPM 面板(
http://IP:81) - 点 Proxy Hosts → Add Proxy Host
- 填写:
| 字段 | 值 |
|---|---|
| Domain Names | yoursite.com |
| Forward Hostname/IP | 你的VPS内网IP(通常是docker网关172.x.x.x,或用172.17.0.1) |
| Forward Port | 8081 |
| SSL | 选 “Request a new SSL Certificate”,勾选 Force SSL |
- 点 Save
等 30 秒,访问 https://yoursite.com,WordPress 就出来了,而且自带 SSL 绿锁!
第五步:添加第二个、第三个网站
要加新站,只需要:
- 创建新的 docker-compose 目录(如
~/docker/site2),改一下端口(如 8082) - 启动 Docker 容器
- 在 NPM 里加一条 Proxy Host 规则
每个站之间完全独立——WordPress 版本可以不一样,PHP 版本可以不一样,甚至可以用完全不同的程序(Nextcloud、Matomo、Ghost 博客等),互不干扰。
常用 Docker 镜像推荐
| 用途 | Docker 镜像 | 推荐端口 |
|---|---|---|
| WordPress | wordpress:latest | 8081, 8082… |
| 静态站 | nginx:alpine | 8091, 8092… |
| 文件管理 | filebrowser/filebrowser | 8080 |
| 数据库管理 | phpmyadmin:latest | 8085 |
| 个人网盘 | nextcloud:latest | 8090 |
| 统计 | matomo:latest | 8088 |
第六步:日常维护
查看所有运行中的容器
docker ps
更新容器
cd ~/docker/site1
docker compose pull # 拉取最新镜像
docker compose up -d # 重新创建容器
备份
Docker 的数据都存在 ~/docker/ 目录下,直接打包这个目录就是完整备份:
tar -czf backup-$(date +%Y%m%d).tar.gz ~/docker/
配合上一篇的 VPS 自动备份教程,设置每天自动备份到另一台 VPS。
性能实测
我在一台 RackNerd 2GB 款 上同时跑了:
- 3 个 WordPress 站点(日访问量合计 ~500 IP)
- 1 个 Nginx Proxy Manager
- 1 个 Portainer
- 1 个 FileBrowser
内存使用约 1.4GB/2GB,CPU 空闲 70%+,完全够用。如果你需要跑更多站点,建议上 4GB 内存。
常见问题
Q: Docker 容器和宝塔面板有什么区别? A: 宝塔面板是一个"系统级"管理工具,在裸机上装 Nginx/MySQL/PHP。Docker 是"应用级"隔离,每个网站独立运行。两者可以共存,但如果追求隔离和可迁移性,Docker 更好。
Q: 1GB 内存能跑几个 Docker 网站? A: 1-2 个轻量 WordPress。Docker 本身不占太多额外内存,但 MySQL 容器每个约 300-500MB。建议 2GB 起。
Q: Nginx Proxy Manager 和宝塔的 Nginx 能同时用吗? A: 不建议。它们都占用 80/443 端口,会冲突。要么全用 Docker 方案,要么全用宝塔方案。
Q: 容器之间怎么通信?
A: 默认在同一台宿主机上,通过 Docker 网络通信。NPM 通过 172.17.0.1:端口号 转发请求到各个容器。
Disclaimer: Some links are affiliate links. We may earn a commission at no extra cost to you.
