【问题标题】:AWS ECR, ECS based deployment: nginx: [emerg] host not found in upstream "app:9000" in /etc/nginx/conf.d/default.conf:2AWS ECR,基于 ECS 的部署:nginx:[emerg] 主机在 /etc/nginx/conf.d/default.conf:2 的上游“app:9000”中找不到
【发布时间】:2021-04-12 09:30:17
【问题描述】:

我正在努力配置 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

以及来自 App (PHP-FPM) 容器的日志

ECS

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

Dockerfile

在这个 Github Repo 中,我添加了 Dockerfile for App、Nginx 镜像、docker-compose.yml 文件和 task-defination.json 文件以供 docker 文件有任何错误时参考。

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

【问题讨论】:

  • 嗨 Ariful。快速提醒一下,我们更喜欢这里没有感谢、签名、评论何时有人可能会回答等的帖子。请尽可能坚持技术写作,谢谢!

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


【解决方案1】:

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

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

快速解决方法是:-

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

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

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

这对您有什么帮助?您可以检查您创建的这个网络,确定您的容器是否正确连接并识别用于连接的名称

Command : docker network inspect <network_name>

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

【讨论】:

    【解决方案2】:

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

    当我看到您的 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:
    

    【讨论】:

    • 嗨,兄弟,现在将对此进行测试,并让您知道。
    【解决方案3】:

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

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

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

    然后,“blog”和“nginx”两个容器都正常运行成功了。

    因此,在您的情况下,将后容器“app”的名称放在前容器“nginx”中(“nginx”容器的“NETWORK SETTINGS”中的“Links”)。它会起作用的。我用Adiii's solution

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

    此外,不要忘记将“app”放在“容器名称”中,并在“nginx”容器的“STARTUP DEPENDENCY ORDERING”中的“Condition”中选择“HEALTHY”。

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 2020-11-09
      • 2020-12-22
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      相关资源
      最近更新 更多