在阿里云服务器上通过 Docker 部署多个网站是完全可行的,也是目前非常主流且高效的架构方案。核心思路是利用 Docker Compose 进行编排,配合 Nginx(作为反向X_X) 来统一管理域名解析和流量分发。
以下是实现这一目标的完整逻辑与操作指南:
1. 核心架构设计
不要为每个网站单独开启一个 Nginx 容器,而是采用 “单入口 + 多后端” 的模式:
- Nginx 容器:作为唯一的对外入口,负责监听 80/443 端口,根据用户访问的域名(如
site-a.com或site-b.com)将请求转发到对应的后端容器。 - 应用容器:每个网站运行在自己的独立容器中,只暴露内部端口(不直接暴露给公网)。
- 网络隔离:使用 Docker 自定义网络,确保各容器间可以互相通信,但外部无法直接访问应用容器。
2. 具体实施步骤
第一步:准备阿里云环境
- 购买与初始化:登录阿里云控制台,创建 ECS 实例(推荐 Ubuntu 20.04+ 或 CentOS 7.9+),安装 Docker 和 Docker Compose。
- 安全组配置:在阿里云控制台的“安全组”规则中,仅开放以下端口:
80(HTTP)443(HTTPS)22(SSH,用于远程管理)- 注意:不要直接开放应用容器的端口(如 8080, 3000 等),避免安全隐患。
第二步:编写 Docker Compose 文件
在项目目录下创建 docker-compose.yml,定义所有服务和网络。
version: '3.8'
services:
# 网站 A (例如 WordPress)
site-a:
image: wordpress:latest
container_name: site-a
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: password123
WORDPRESS_DB_NAME: wp_site_a
volumes:
- ./data/site-a/html:/var/www/html
networks:
- web-net
restart: always
# 网站 B (例如 Node.js 应用)
site-b:
image: node:18-alpine
container_name: site-b
command: npm start
volumes:
- ./data/site-b/app:/app
networks:
- web-net
restart: always
# 数据库 (共享或独立,视情况而定)
db:
image: mysql:5.7
container_name: db
environment:
MYSQL_ROOT_PASSWORD: password123
MYSQL_DATABASE: wp_site_a
volumes:
- ./data/db:/var/lib/mysql
networks:
- web-net
restart: always
# Nginx 反向X_X (核心枢纽)
nginx-proxy:
image: nginx:alpine
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
depends_on:
- site-a
- site-b
networks:
- web-net
restart: always
networks:
web-net:
driver: bridge
第三步:配置 Nginx 虚拟主机
在 ./nginx/conf.d/ 目录下创建配置文件(例如 default.conf),利用 server_name 区分不同域名。
# /etc/nginx/conf.d/default.conf
# 网站 A 的配置
server {
listen 80;
server_name site-a.com www.site-a.com;
location / {
proxy_pass http://site-a:80; # 指向 docker-compose 中的服务名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 网站 B 的配置
server {
listen 80;
server_name site-b.com www.site-b.com;
location / {
proxy_pass http://site-b:3000; # 假设 Node 应用在 3000 端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
关键点:
proxy_pass中的site-a和site-b必须与docker-compose.yml中的service名称完全一致,Docker 会自动解析这些名称。
第四步:域名解析与 SSL 证书
- DNS 解析:在阿里云云解析 DNS 控制台,将
site-a.com和site-b.com的 A 记录均指向你的阿里云服务器公网 IP。 - SSL 证书:
- 申请免费证书(如 Let’s Encrypt)。
- 推荐使用 Certbot 插件自动生成并配置到 Nginx 容器中。
- 或者手动将
.crt和.key文件挂载到/etc/nginx/ssl目录,并在 Nginx 配置中启用 HTTPS。
第五步:启动服务
在项目根目录执行:
docker-compose up -d
查看日志确认无报错:
docker-compose logs -f nginx-proxy
3. 进阶优化建议
- 持久化数据:务必使用
volumes将数据卷映射到宿主机(如./data目录),防止容器删除导致数据丢失。 - 自动重启:在
docker-compose.yml中设置restart: always,确保服务器重启后服务自动拉起。 - 监控与备份:结合 Prometheus + Grafana 监控资源使用情况,定期脚本备份
./data目录到 OSS 对象存储。 - 多租户隔离:如果网站涉及敏感数据,可以为不同网站分配不同的 Docker 网络或使用 Linux Namespace 进行更严格的隔离。
总结
通过 Docker Compose 统一管理,你只需要维护一套基础设施(Nginx + 网络),即可轻松支撑数十个甚至上百个网站的并发访问。这种架构不仅节省资源,还极大地简化了运维复杂度。如果在配置过程中遇到具体的报错(如 Nginx 无法连接后端、权限问题等),可以提供具体错误信息以便进一步排查。
云服务器