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

时间:2018-01-18 18:39:19

标签: laravel amazon-web-services 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:

这是我的Web容器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;
    }
}

3 个答案:

答案 0 :(得分:0)

来自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。

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

fastcgi_pass <private_ip>:9000;

答案 1 :(得分:0)

对于其他可能遇到的问题,我在连接两个在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

答案 2 :(得分:0)

解决方案是:

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

上面提到了第二部分,但并未明确指出两个容器必须处于同一任务中。

更多信息,请点击此处:https://github.com/aws-samples/amazon-ecs-fargate-aspnetcore/blob/master/README.md