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

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

以下是实现这一目标的完整逻辑与步骤:

核心架构设计

  1. Web 服务器层:使用 Nginx 容器作为统一入口。它监听 80/443 端口,根据请求的 Host 头(域名)将流量转发给对应的内部服务。
  2. 应用层:每个网站运行在一个独立的 Docker 容器中(可以是 Node.js、PHP、Python 或静态文件)。
  3. 网络层:所有容器连接到一个自定义的 Docker 网络,确保它们可以互相通信,但对外只暴露 Nginx 的端口。
  4. 存储层:使用 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

第五步:部署与启动

  1. 上传代码:将你的网站代码上传到 site-asite-b 文件夹中。
  2. 启动服务
    docker compose up -d
  3. 检查状态
    docker compose ps

第六步:阿里云安全组与 DNS 解析

这是最容易被忽略的一步,否则外部无法访问。

  1. 配置 DNS
    去你的域名服务商(如阿里云云解析 DNS),将 www.site-a.comwww.site-b.com 的 A 记录都指向你的阿里云服务器公网 IP。

  2. 配置安全组
    登录阿里云控制台 -> 云服务器 ECS -> 实例详情 -> 安全组

    • 确保入方向规则允许 TCP 80TCP 443 端口开放。
    • 如果有其他业务端口,请按需添加。

进阶优化建议

  1. HTTPS 证书自动化
    生产环境强烈建议使用 HTTPS。可以在 Nginx 容器中集成 certbot,或者在宿主机生成证书后挂载进去。

    • 简单方案:在 docker-compose.yml 中增加一个 certbot 服务定期刷新证书,并将生成的证书挂载到 Nginx。
  2. 静态资源分离
    如果网站包含大量图片、CSS/JS,可以将 Nginx 直接作为静态服务器(不经过后端应用),仅将 API 请求转发给后端容器,以提高性能。

  3. 数据持久化
    务必使用 volumes 挂载数据库(如 MySQL/Redis)的数据目录,避免容器删除导致数据丢失。

  4. 日志管理
    如果容器日志过多,建议在 docker-compose.yml 中配置 logging 驱动(如 json-file 限制大小,或对接 fluentd),防止磁盘写满。

总结

通过 Nginx 反向X_X + Docker Compose 编排,你可以在一台阿里云服务器上轻松隔离并运行无数个网站。这种方案不仅节省成本,还具备极高的可维护性和扩展性。只要处理好 DNS 解析和安全组端口放行,即可立即上线。

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