20

编辑:我的第一个问题是“如何使用 Fargate 在 AWS ECS 上的任务定义中链接容器?” 但是,可能我从一开始就错了,所以我改变了我的问题并保留以下内容:

我正在尝试通过 ECS 在 AWS 上部署一个简单的基于 Laravel 的应用程序。我的服务使用 docker-compose-yml 文件在本地按预期工作。

但在 AWS 上,我得到:"nginx: [emerg] host not found in upstream "app" in /etc/nginx/conf.d/default.conf:12"来自我的 Web 容器日志。

这里是我服务的容器:web (nginx)、app (Laravel)、数据库 (MySQL) 和缓存 (redis)。

我知道任务描述的所有容器共享相同的命名空间,因此不需要链接容器(我们无论如何都不能将链接属性与 Fargate 一起使用)。

你能帮我在这里找到问题吗?我瞎了。

这是我工作的本地 docker-compose.yml 文件:

version: '2'
services:

  #  The Application
  app:
    image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-
maison/tribe-migrate
    volumes:
      - /var/www/storage
    env_file: '.env'
    environment:
      - "DB_HOST=database"
      - "REDIS_HOST=cache"

  # The Web Server
  web:
    image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-maison/laravel-web
    ports:
      - 80:80

  # The Database
  database:
    image: mysql:5.6
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - "MYSQL_DATABASE=homestead"
      - "MYSQL_USER=homestead"
      - "MYSQL_PASSWORD=secret"
      - "MYSQL_ROOT_PASSWORD=secret"

  # redis
  cache:
    image: redis:3.0-alpine

volumes:
  dbdata:

这是我的网络容器 Dockerfile:

FROM nginx:1.10

ADD vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www

还有我的 vhost.conf:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
4

3 回答 3

5

解决方案是:

  1. 确保两个容器都定义在同一个任务中,例如 nginx-php
  2. 使用 localhost:port 例如 localhost:9000 用于 php-fpm

上面提到了第二部分,但没有明确说明两个容器必须在同一个任务中。

您可以在此处找到更多信息:https ://github.com/aws-samples/amazon-ecs-fargate-aspnetcore/blob/master/README.md

于 2019-02-20T09:34:05.990 回答
1

从 vhost.conf :

fastcgi_pass app:9000;

主机名“app”适用于 docker-compose,因为这是您在 docker-compose.yml 中命名的服务。docker-compose 为其必须管理的容器创建一个新网络,该网络使容器能够通过主机名相互引用,而无需进一步配置。

Fargate 没有此功能,因此“应用程序”无法解析。

Fargate 当前允许您使用的唯一联网模式是一种称为awsvpc的特殊 AWS 模式。Fargate 中运行的每个任务都有自己的弹性网络接口 (ENI),这意味着每个任务都有自己的私有 IP 地址。您还可以将 ENI 配置为具有公共 IP 地址,就像在 EC2 实例上使用 ENI 一样。


如何从 nginx 容器中解析您的应用程序容器

在 Fargate 中,深入了解应用服务器的运行任务定义(集群 > 任务选项卡 > 单击应用服务器任务列中的容器 ID)。网络部分将具有专用 IP。

在你的 conf 中用这个 ip 替换主机名“app”:

fastcgi_pass <private_ip>:9000;

于 2018-01-26T14:44:38.917 回答
1

对于可能遇到此问题的其他人,我在连接在 aws ecs fargate 上的同一任务中运行的两个容器时遇到了同样的问题,发现我必须在 vhost.conf 中将“app”替换为“localhost”,并且它有效。(在另一个答案的一些评论中提到了这一点)所以 vhost.conf 看起来像:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass localhost:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

我还确保端口 9000 已映射并暴露在应用程序容器上(可能没有必要)

#  The Application
app:
  image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-maison/tribe-migrate
  volumes:
    - /var/www/storage
  env_file: '.env'
  environment:
    - "DB_HOST=database"
    - "REDIS_HOST=cache"
  ports:
    - 9000:9000
于 2018-09-13T20:27:25.193 回答