基于AWS ECR,ECS的部署:nginx:在/etc/nginx/conf.d/default.conf:2的上游“ app:9000”中找不到[emerg]主机

时间:2020-03-10 03:11:33

标签: amazon-web-services docker nginx docker-compose amazon-ecs

我正在努力配置AWS ECS任务定义以运行简单的基于PHP-FPM和基于Nginx的容器。

我的“ app”容器在app:9000端口运行,而Nginx在80端口运行。 Nginx正在通过fastcgi_pass app-upstream;

将请求转发到应用容器

所有这些都在本地完美运行。相同的配置在DigitalOcean Docker实例中运行完美,但在AWS ECS中失败。

我正在猜测一些任务定义配置问题,但找不到。

错误日志:

我从 Nginx容器

获取此日志
nginx: [emerg] host not found in upstream "app:9000" in /etc/nginx/conf.d/default.conf:2

enter image description here

,该日志来自 App (PHP-FPM)容器

enter image description here

ECS

我用T2 Small实例创建了一个简单的集群,该集群运行良好。

Dockerfile

在此Github存储库中,我添加了Dockerfile用于App,Nginx图像,docker-compose.yml文件和task-defination.json文件,以供docker文件中有任何错误的参考。

Github中的源代码回购:https://github.com/arifulhb/docker-ecr-sample

3 个答案:

答案 0 :(得分:2)

您的问题与nginx配置中提到的错误上游路径有关。

做以下事情进行调查,如果不需要的话,还避免在docker-compose文件中使用自定义容器名称:-

快速解决方案是:-

  1. 从docker-compose文件中删除容器名称。
  2. 在docker-compose文件中提到的服务密钥名称(例如:test_app)会被自动视为容器名称,因此可以使用。
  3. 进行上述更改后,正确的上游路径应为 test_app:9000

构建docker-compose文件的正确和推荐方法:-

  1. 假设名称为“ Intranet”,创建一个自定义的 docker网络
  2. 在您在docker-compose文件中创建的每个服务中提及此网络“内部网”。
  3. 遵循快速解决方案
  4. 中提到的步骤

这如何帮助您?您可以检查创建的该网络,确定容器是否正确连接,并标识用于连接的名称

Command : docker network inspect <network_name>

NOTE : Docker treats container names as host names by default for internal connections.

答案 1 :(得分:1)

使用多个容器时,容器名称对于提供内部连接非常重要。

当我看到您的Docker组成文件时,容器名称应与nginx conf中使用的名称匹配。

version: '3'
services:
  test_app:
      container_name: app # not test_app_1
      volumes:
        - test-app-data:/var/www/app
  test_nginx:
      image: "xxxxxx.dkr.ecr.xx-xx-1.amazonaws.com/test-nginx"
      build:
        context: ./docker/nginx
        dockerfile: Dockerfile
      container_name: nginx
      ports:
        - "80:80"
        - "443:443"
      volumes:
        - test-app-data:/var/www/app
        - test-nginx-log:/var/log/nginx
      external_links:
        - app # not test_app_1
      depends_on:
        - test_app
volumes:
  test-app-data:
  test-nginx-log:

答案 2 :(得分:1)

我也遇到了同样的问题。我的“博客”容器在 blog:8000 端口运行,而“nginx”容器在 80 端口运行。 “nginx”容器正在将请求转发到“blog”容器。

enter image description here

因为我根本没有在“网络设置”中为“nginx”容器设置“链接”。

enter image description here

所以我把后端容器的名称“blog”放在前端容器“nginx”中(“nginx”容器的“NETWORK SETTINGS”中的“Links”)。

enter image description here

然后,“blog”和“nginx”容器都可以正常运行了。

因此,在您的情况下,将后端容器“app”的名称放在前端容器“nginx”中(“nginx”容器的“网络设置”中的“链接”)。它会起作用。我使用了 Adiii's solution

enter image description here

不要忘记将“CMD-SHELL, curl -f http://localhost:9000/ || exit 1”放在“应用程序”容器的“HEALTHCHECK”中的“Command”中。

enter image description here

此外,不要忘记在“Container name”中输入“app”,并在“nginx”容器的“STARTUP DEPENDENCY ORDERING”中的“Condition”中选择“HEALTHY”。

enter image description here