在阿里云服务器上通过 Docker 部署多个网站是完全可行的,而且是非常主流且高效的方案。核心思路是利用 Docker Compose 编排多个服务容器,配合 Nginx(作为反向X_X)来根据域名将流量分发到不同的后端应用容器。
以下是实现这一目标的完整逻辑与步骤:
核心架构设计
- Web 服务器层:使用 Nginx 容器作为统一入口。它监听 80/443 端口,根据请求的
Host头(域名)将流量转发给对应的内部服务。 - 应用层:每个网站运行在一个独立的 Docker 容器中(可以是 Node.js、PHP、Python 或静态文件)。
- 网络层:所有容器连接到一个自定义的 Docker 网络,确保它们可以互相通信,但对外只暴露 Nginx 的端口。
- 存储层:使用 Docker Volume 挂载配置文件和数据,防止容器重启后配置丢失。
具体实施步骤
第一步:准备基础环境
登录阿里云 ECS 实例,安装 Docker 和 Docker Compose(如果尚未安装):
# 更新系统并安装 Docker (以 Ubuntu/CentOS 为例)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable docker && systemctl start docker
# 安装 Docker Compose (新版 Docker 已内置 compose 插件,直接使用 docker compose)
docker compose version
第二步:规划目录结构
为了方便管理,建议在 /opt/docker 下创建项目目录:
mkdir -p /opt/docker/{nginx,site-a,site-b}
cd /opt/docker
nginx: 存放 Nginx 配置文件。site-a,site-b: 分别存放两个网站的代码或静态文件。
第三步:编写 Nginx 配置文件
在 /opt/docker/nginx/conf.d/default.conf 中配置虚拟主机。这是实现“多站点”的关键。
# /opt/docker/nginx/conf.d/default.conf
server {
listen 80;
server_name www.site-a.com site-a.com; # 第一个网站的域名
location / {
proxy_pass http://site-a:80; # 转发到名为 site-a 的容器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name www.site-b.com site-b.com; # 第二个网站的域名
location / {
proxy_pass http://site-b:80; # 转发到名为 site-b 的容器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
注意:如果你的网站是静态 HTML,可以直接用 Nginx 的
root指令;如果是动态应用(如 Java/Go/Node),则使用proxy_pass。
第四步:编写 Docker Compose 文件
在项目根目录创建 docker-compose.yml:
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: web-proxy
ports:
- "80:80"
- "443:443" # 如果需要 HTTPS,需在此处映射
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/logs:/var/log/nginx
networks:
- app-network
depends_on:
- site-a
- site-b
site-a:
image: node:18-alpine # 示例:使用 Node.js 镜像
container_name: site-a-app
working_dir: /app
volumes:
- ./site-a:/app
command: npm start # 启动命令视具体应用而定
networks:
- app-network
site-b:
image: php:8.2-fpm # 示例:使用 PHP 镜像
container_name: site-b-app
working_dir: /var/www/html
volumes:
- ./site-b:/var/www/html
networks:
- app-network
networks:
app-network:
driver: bridge
第五步:部署与启动
- 上传代码:将你的网站代码上传到
site-a和site-b文件夹中。 - 启动服务:
docker compose up -d - 检查状态:
docker compose ps
第六步:阿里云安全组与 DNS 解析
这是最容易被忽略的一步,否则外部无法访问。
-
配置 DNS:
去你的域名服务商(如阿里云云解析 DNS),将www.site-a.com和www.site-b.com的 A 记录都指向你的阿里云服务器公网 IP。 -
配置安全组:
登录阿里云控制台 -> 云服务器 ECS -> 实例详情 -> 安全组。- 确保入方向规则允许 TCP 80 和 TCP 443 端口开放。
- 如果有其他业务端口,请按需添加。
进阶优化建议
-
HTTPS 证书自动化:
生产环境强烈建议使用 HTTPS。可以在 Nginx 容器中集成certbot,或者在宿主机生成证书后挂载进去。- 简单方案:在
docker-compose.yml中增加一个certbot服务定期刷新证书,并将生成的证书挂载到 Nginx。
- 简单方案:在
-
静态资源分离:
如果网站包含大量图片、CSS/JS,可以将 Nginx 直接作为静态服务器(不经过后端应用),仅将 API 请求转发给后端容器,以提高性能。 -
数据持久化:
务必使用volumes挂载数据库(如 MySQL/Redis)的数据目录,避免容器删除导致数据丢失。 -
日志管理:
如果容器日志过多,建议在docker-compose.yml中配置logging驱动(如json-file限制大小,或对接fluentd),防止磁盘写满。
总结
通过 Nginx 反向X_X + Docker Compose 编排,你可以在一台阿里云服务器上轻松隔离并运行无数个网站。这种方案不仅节省成本,还具备极高的可维护性和扩展性。只要处理好 DNS 解析和安全组端口放行,即可立即上线。
CLOUD云枢