奋斗
努力

阿里云服务器docker部署多个网站?

云计算

在阿里云服务器上通过 Docker 部署多个网站是完全可行的,也是目前非常主流且高效的架构方案。核心思路是利用 Docker Compose 进行编排,配合 Nginx(作为反向X_X) 来统一管理域名解析和流量分发。

以下是实现这一目标的完整逻辑与操作指南:

1. 核心架构设计

不要为每个网站单独开启一个 Nginx 容器,而是采用 “单入口 + 多后端” 的模式:

  • Nginx 容器:作为唯一的对外入口,负责监听 80/443 端口,根据用户访问的域名(如 site-a.comsite-b.com)将请求转发到对应的后端容器。
  • 应用容器:每个网站运行在自己的独立容器中,只暴露内部端口(不直接暴露给公网)。
  • 网络隔离:使用 Docker 自定义网络,确保各容器间可以互相通信,但外部无法直接访问应用容器。

2. 具体实施步骤

第一步:准备阿里云环境

  1. 购买与初始化:登录阿里云控制台,创建 ECS 实例(推荐 Ubuntu 20.04+ 或 CentOS 7.9+),安装 Docker 和 Docker Compose。
  2. 安全组配置:在阿里云控制台的“安全组”规则中,仅开放以下端口:
    • 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-asite-b 必须与 docker-compose.yml 中的 service 名称完全一致,Docker 会自动解析这些名称。

第四步:域名解析与 SSL 证书

  1. DNS 解析:在阿里云云解析 DNS 控制台,将 site-a.comsite-b.com 的 A 记录均指向你的阿里云服务器公网 IP。
  2. 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 无法连接后端、权限问题等),可以提供具体错误信息以便进一步排查。

未经允许不得转载:云服务器 » 阿里云服务器docker部署多个网站?