AWS ECR, развертывание на основе ECS: nginx: хост [emerg] не найден в вышестоящем "app: 9000" в /etc/nginx/conf.d/default.conf:2 - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь настроить определение задачи 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

и этот журнал из Приложение (PHP -FPM) контейнер

enter image description here

ECS

Я создал простой кластер с T2 Small, который отлично работает.

Dockerfile

В этом репозитории Github я добавил Dockerfile для приложения, Nginx изображение , docker-compose.yml файл и task-defination.json файл для справки, если есть ошибка в docker файлах.

Исходный код в Github репо: https://github.com/arifulhb/docker-ecr-sample

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Ваша проблема связана с неверным восходящим путем, указанным в конфигурации nginx.

Выполните следующие действия, чтобы исследовать, также избегайте использования имен пользовательских контейнеров в docker -создать файлы, если они специально не нужны: -

Быстрое разрешение будет: -

  1. Удалите имена контейнеров из docker -композиционных файлов.
  2. Имя служебного ключа (например, test_app), указанное в docker -композитном файле, автоматически обрабатывается как имя контейнера, поэтому используйте его.
  3. Правильный восходящий путь после внесения вышеуказанных изменений должен быть test_app: 9000

Правильный и рекомендуемый способ создания docker -композитных файлов: -

  1. Создание пользовательской docker сети Предположим, с именем "intr anet"
  2. Упомяните эту сеть "intr anet" в каждой службе, которую вы создаете в своем docker -компонентный файл.
  3. Выполните шаги, указанные в быстрое разрешение

Как это поможет вам? У вас есть возможность проверить созданную вами сеть, выяснить, правильно ли подключены ваши контейнеры, и определить имена , используемые для подключения.

Command : docker network inspect <network_name>

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

1 голос
/ 10 марта 2020

При использовании нескольких контейнеров имя контейнера очень важно для обеспечения внутренней связи.

Поскольку я вижу ваш 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:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...