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

在阿里云服务器上通过 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-asite-b 必须与 docker-compose.yml 中定义的 service name 完全一致。

第四步:构建并启动

在项目根目录执行:

docker-compose up -d --build

此时,Docker 会自动拉取镜像、构建应用、启动容器,并连接它们到 app-network

第五步:验证与优化

  1. 访问测试:在浏览器输入 http://example.comhttp://blog.example.com,检查是否分别显示了正确的网站内容。
  2. HTTPS 支持:生产环境强烈建议使用 HTTPS。可以使用 certbot 插件自动申请 Let’s Encrypt 证书,并在 Nginx 配置中启用 SSL 监听。
  3. 日志管理:Docker 默认会将日志输出到 stdout/stderr。可以通过配置 docker-compose.yml 中的 logging 驱动或使用 journalctl 查看特定容器日志。
  4. 阿里云特性结合
    • 如果使用了阿里云负载均衡(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 » 阿里云服务器docker部署多个网站?