在阿里云服务器上通过 Docker 部署多个网站是完全可行的,也是现代 Web 架构中非常主流的做法。核心思路是利用 Docker Compose 编排服务,配合 Nginx 作为反向X_X来区分不同域名,并让每个网站运行在独立的容器中。
以下是实现这一目标的完整逻辑和步骤:
1. 核心架构设计
为了实现多站点隔离和统一管理,建议采用以下架构:
- Web 应用层:每个网站(如 WordPress、Node.js 项目、Vue 前端)都打包成独立的 Docker 镜像或容器。
- 反向X_X层:使用一个 Nginx 容器作为统一入口。它根据请求的
Host头(域名)将流量转发到对应的后端容器。 - 网络层:所有容器加入同一个自定义 Docker 网络,确保内部通信畅通。
- 数据层:利用 Docker Volume 挂载持久化数据,防止容器重启后数据丢失。
2. 准备工作
在开始之前,请确保你的阿里云 ECS 实例已完成以下操作:
- 安装 Docker 和 Docker Compose。
- 在阿里云控制台的安全组中,放行 80 (HTTP) 和 443 (HTTPS) 端口。
- 购买并配置好域名,将域名的 A 记录解析到服务器公网 IP。
3. 具体实施步骤
第一步:规划目录结构
建议在 /opt/docker-sites 下创建一个主目录,为每个网站建立子目录:
mkdir -p /opt/docker-sites/{site-a, site-b}
cd /opt/docker-sites
第二步:编写 Docker Compose 文件
在主目录下创建 docker-compose.yml。这个文件将定义 Nginx 反向X_X和各个网站服务。
假设你有两个网站:example.com (基于 Node.js) 和 blog.example.com (基于 Python/Flask)。
version: '3.8'
services:
# 1. Nginx 反向X_X
nginx:
image: nginx:alpine
container_name: multi-site-proxy
ports:
- "80:80"
- "443:443" # 如果有 SSL
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro # 存放证书
depends_on:
- site-a
- site-b
networks:
- app-network
# 2. 网站 A (例如 Node.js)
site-a:
build: ./site-a
container_name: node-app
environment:
- NODE_ENV=production
networks:
- app-network
# 3. 网站 B (例如 Flask)
site-b:
build: ./site-b
container_name: flask-app
networks:
- app-network
networks:
app-network:
driver: bridge
第三步:配置 Nginx 反向X_X规则
在 ./nginx/ 目录下创建 nginx.conf。这是实现“一个入口对应多个网站”的关键。你需要根据域名将请求转发到不同的内部容器名称。
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://site-a:3000; # 转发到 site-a 容器的 3000 端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://site-b:5000; # 转发到 site-b 容器的 5000 端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 可选:SSL 配置示例
# 需配合 certbot 自动申请 Let's Encrypt 证书
}
注意:proxy_pass 中的 site-a 和 site-b 必须与 docker-compose.yml 中定义的 service name 完全一致。
第四步:构建并启动
在项目根目录执行:
docker-compose up -d --build
此时,Docker 会自动拉取镜像、构建应用、启动容器,并连接它们到 app-network。
第五步:验证与优化
- 访问测试:在浏览器输入
http://example.com和http://blog.example.com,检查是否分别显示了正确的网站内容。 - HTTPS 支持:生产环境强烈建议使用 HTTPS。可以使用
certbot插件自动申请 Let’s Encrypt 证书,并在 Nginx 配置中启用 SSL 监听。 - 日志管理:Docker 默认会将日志输出到 stdout/stderr。可以通过配置
docker-compose.yml中的logging驱动或使用journalctl查看特定容器日志。 - 阿里云特性结合:
- 如果使用了阿里云负载均衡(SLB),可以将 SLB 指向 ECS 的 80/443 端口,由 SLB 做更高级的流量分发。
- 定期备份 Docker Volume 中的数据(数据库文件、上传的图片等)。
常见问题与建议
- 端口冲突:确保每个后端应用(如 Node.js 的 3000 端口、Flask 的 5000 端口)在容器内部不冲突,且不需要映射到宿主机端口(宿主机只开放 80/443)。
- 动态域名:如果域名经常变动,可以引入
Traefik代替 Nginx,它支持通过标签自动发现新容器并更新路由。 - 资源限制:在
docker-compose.yml中可以为每个服务添加deploy.resources.limits限制 CPU 和内存,防止某个网站占满服务器资源导致其他网站宕机。
通过这种方式,你不仅实现了多站点部署,还获得了容器化的隔离性、易迁移性和快速扩容能力。
云知识CLOUD