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

在阿里云服务器上通过 Docker 部署多个网站是完全可行的,而且是目前非常主流且高效的方案。核心思路是利用 Docker Compose 进行容器编排,配合 Nginx 作为反向X_X服务器,将不同的域名请求转发到对应的后端应用容器中。

以下是完整的实施逻辑和步骤指南:

1. 架构设计

为了实现多站点隔离与统一入口,通常采用以下架构:

  • 前端入口:一个 Nginx 容器,负责监听 80/443 端口,根据 Host 头(域名)将流量分发到不同容器。
  • 业务容器:每个网站独立运行在自己的 Docker 容器中(可以是 Node.js, PHP, Python, Go 等),互不干扰。
  • 网络层:使用自定义的 Docker 网络,让 Nginx 和业务容器互相通信。
  • 数据持久化:利用 Docker Volume 挂载数据卷,防止容器重启后数据丢失。

2. 准备工作

确保你的阿里云 ECS 已安装 Docker 和 Docker Compose,并开放了安全组中的 80 (HTTP)443 (HTTPS) 端口。

# 检查安装
docker --version
docker compose version

3. 具体实施步骤

第一步:创建项目目录结构

假设我们要部署两个网站:site-a.comsite-b.com

mkdir -p /opt/docker-multi-site/{nginx,site-a,site-b}
cd /opt/docker-multi-site

第二步:编写 Nginx 配置文件

nginx/conf.d/default.conf 中定义虚拟主机规则。这是实现多站点的核心。

# /opt/docker-multi-site/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; # 这里的 site-a 是容器名称
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# 网站 B
server {
    listen 80;
    server_name site-b.com www.site-b.com;

    location / {
        proxy_pass http://site-b:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

注意:proxy_pass 中的 site-asite-b 必须与 docker-compose.yml 中定义的 service 名称一致。

第三步:编写 docker-compose.yml

在这个文件中定义所有服务、网络和存储卷。

version: '3.8'

services:
  # 1. Nginx 反向X_X
  nginx:
    image: nginx:alpine
    container_name: multi-site-nginx
    ports:
      - "80:80"
      - "443:443" # 如果配置了 HTTPS
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/logs:/var/log/nginx
    depends_on:
      - site-a
      - site-b
    networks:
      - app-network

  # 2. 网站 A (示例:Node.js)
  site-a:
    image: node:18-alpine
    container_name: site-a-app
    working_dir: /app
    volumes:
      - ./site-a:/app
    command: npm start
    networks:
      - app-network

  # 3. 网站 B (示例:Python Flask)
  site-b:
    image: python:3.9-slim
    container_name: site-b-app
    working_dir: /app
    volumes:
      - ./site-b:/app
    command: python app.py
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

第四步:启动服务

在项目根目录下执行:

docker compose up -d

此时,Nginx 会启动并监听 80 端口,同时根据你的域名配置将请求转发给对应的业务容器。

4. 关键注意事项

  1. 域名解析 (DNS)
    在阿里云控制台或 DNS 服务商处,将 site-a.comsite-b.com 的 A 记录都指向你的 阿里云服务器公网 IP

  2. 阿里云安全组
    务必登录阿里云 ECS 控制台 -> 安全组 -> 配置规则,确保入方向允许 TCP 80TCP 443 端口。否则外部无法访问。

  3. HTTPS 证书管理
    生产环境强烈建议使用 HTTPS。可以在 Nginx 容器中集成 Let’s Encrypt (Certbot) 自动申请证书,或者在宿主机生成证书后挂载进 Nginx 容器。
    简单做法:使用 nginx-proxy-acme 镜像可以自动化处理证书续期,无需手动干预。

  4. 资源隔离
    如果某个网站(如 site-a)内存占用过高导致 OOM,可以通过 deploy.resources.limits 限制单个容器的 CPU 和内存,避免影响其他网站。

  5. 日志查看
    如果遇到问题,可以使用以下命令查看特定容器日志:

    docker logs multi-site-nginx
    docker logs site-a-app

通过以上步骤,你就可以在一个阿里云服务器上低成本、高可用地运行多个独立的网站了。如果需要更复杂的负载均衡或微服务架构,还可以进一步引入 Kubernetes (ACK)。

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