【问题标题】:ECS multi container setupECS 多容器设置
【发布时间】:2022-01-02 19:53:07
【问题描述】:

我需要以下情况的帮助。我有三个容器需要在前面有 alb 的 ECS 上运行。我有 nginx-frontend、php、nginx-backend。两个 nginx 容器都依赖于 php 容器。我只想公开前端容器。我怎样才能将它们绑在一起而不在每个前面添加 alb?

我使用 terraform 配置所有部分,包括(ALB、ECR、ECS、...)我想知道如何连接容器而不让每个容器前面都有一个 alb。

本地我使用 docker-compose 运行它们。

【问题讨论】:

    标签: docker amazon-ecs


    【解决方案1】:

    Nginx 和 PHP 可以并行运行。 ECS 中的任务定义可以包含这两个容器,其中 nginx 容器公开端口 80,而 PHP 容器公开 9000(可能使用 PHP-FPM)。 Nginx 可以作为代理路由请求到 PHP 进程。

    示例task definition(简化值以演示多容器设置):

    {
      "containerDefinitions": [
        {
          "portMappings": [
            {
              "hostPort": 9000,
              "protocol": "tcp",
              "containerPort": 9000
            }
          ],
          "command": [
            "php-fpm"
          ],
          "image": "image-url-for-php:latest",
          "name": "php-fpm"
        },
        {
          "portMappings": [
            {
              "hostPort": 80,
              "protocol": "tcp",
              "containerPort": 80
            }
          ],
          "image": "image-url-for-nginx:latest",
          "dependsOn": [
            {
              "containerName": "php-fpm",
              "condition": "START"
            }
          ],
          "essential": true,
          "name": "nginx"
        }
      ]
    }
    

    nginx 配置如下所示:

    server {
        listen 80;
        index index.php index.html;
        root /var/www/html/public; # change this to application files path
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass localhost:9000; # PHP container accessible via localhost:9000 if running side by side
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }
    }
    

    然后可以使用此任务定义创建 ELB 可以用作目标组的服务(路由到端口 80 用于 nginx)。从那里所有请求都将被代理到 PHP 容器。

    就 nginx-backend 而言,可以使用相同的设置。但是,如果此服务不会暴露于公共流量,您将需要使用内部 ELB 或Service Discovery。然而,这个想法是 PHP 容器本身不需要专用的 ELB。

    【讨论】:

    • 如果我理解你是正确的,我将所有容器添加到一个任务定义中,并将“公共”ALB 附加到 nginx,并将“非公共”ALB 附加到 nginx.backend。
    • 你能解释一下 nginx-backend 是什么吗?那是一个API吗?如果是这样,您将需要为前端服务(nginx-frontend,PHP)定义一个任务,为后端服务(nginx-backend,PHP)定义另一个。前端使用面向外部的 ELB,后端使用面向内部的 ELB。但是,如上所述,您也可以将 Service Discovery 用于后端而不是 ALB。
    【解决方案2】:

    这是一个有点宽泛的问题,但我会尝试给出一个答案,引导您朝着正确的方向前进。

    您可以尝试使用基础架构即代码 (IaC) 来快速完成工作并锻炼您需要和不需要的部分。您可以查看部署的内容以了解如何构建功能性 ECS 基础架构,它通常涉及 VPC、NAT、安全组、Internet 网关、ALB、ECR 和更多部分。看到所有这些部分得到部署和连接可以进一步帮助您了解您的需求。

    IaC 运行 ECS 的一些示例: https://www.pulumi.com/docs/guides/crosswalk/aws/ecs/ https://registry.terraform.io/modules/cn-terraform/ecs-fargate/aws/latest

    要回答有关 ALB 的更具体问题,您只需将前端连接到具有目标组的 ALB。连接容器的方法有多种,服务发现是为每个容器创建主机名的一种方法一个专用网络。然后,您可以像使用 docker-compose 一样从前端调用后端。

    https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html

    【讨论】:

    • 你说得对,我错过了一些信息。我使用 terraform 来配置所有部分,包括(ALB、ECR、ECS、...)我想知道如何在不让每个容器前面都有一个 alb 的情况下连接容器。我听说可以使用 ecs-params.yml 与 docker-compose 文件类似的配置。但没有找到任何有用的信息。
    • 我明白了。您可以使用这些说明来编辑您的问题。如果您将容器部署在同一个集群中,它们可以像在同一个网络上一样相互通信。
    • 我的问题是如何从另一个容器中的一个容器访问资源。 Localy 我可以定义一个网络并从一个容器访问 ip:port 到另一个容器。如何在 ECS 中实现这一点?
    • 你在运行什么任务网络? awsvpc、网桥、主机还是没有?
    • 目前我已配置为使用 awsvpc
    【解决方案3】:

    如果您有一个 docker compose 文件,最简单的方法可能是在 docker 中创建一个 ECS 上下文并使用 docker compose up 部署您的 compose 文件。你可以阅读更多here

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多