如何使用Fargate在AWS ECS上配置基于Laravel的应用程序?

Fre*_*ger 17 amazon-web-services laravel docker aws-fargate

编辑:我的第一个问题是"如何使用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(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:
Run Code Online (Sandbox Code Playgroud)

这是我的web容器Dockerfile:

FROM nginx:1.10

ADD vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www
Run Code Online (Sandbox Code Playgroud)

我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

pol*_*dek 5

解决办法是:

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

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

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


blu*_*res 1

来自 vhost.conf:

fastcgi_pass app:9000;

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

Fargate 没有此功能,因此“app”无法解析。

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


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

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

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

fastcgi_pass <private_ip>:9000;