Назад | Перейти на главную страницу

Многоконтейнерный докер на AWS - Nginx использует хост-машину / etc / hosts resolver

У меня есть многоконтейнерная среда докеров на Amazon Elastic Beanstalk со следующими Dockerrun.aws.json файл:

{ 
    "AWSEBDockerrunVersion": 2, 
    "containerDefinitions": [ 
      { 
        "name": "web", 
        "memoryReservation": 256, 
        "image": "my/nginx/repo/image",  
        "portMappings": [ 
          { 
            "hostPort": 80, 
            "containerPort": 80 
          } 
        ], 
        "links": [ 
          "api" 
        ], 
        "essential": true 
      }, 
      { 
        "name": "api", 
        "memoryReservation": 256, 
        "image": "my-api/repo", 
        "essential": true, 
        "portMappings": [ 
          { 
            "hostPort": 3000, 
            "containerPort": 80 
          } 
        ]
      } 
    ] 
  }

В конечном итоге я хочу, чтобы приложение узла, обслуживаемое nginx, разрешало запросы к именованным адресам из связанных контейнеров, поэтому в моем web изображение (приложение узла) Я хочу отправить запрос на http://api/some/resource и пусть nginx разрешит это в контейнере api.

Теперь, поскольку докер добавляет запись хоста для контейнера api из-за указанной ссылки, я хочу, чтобы сервер nginx разрешал адреса с хостов etc/hosts файл, однако, как я выяснил, nginx использует собственный преобразователь. Немного изучив проблему, я обнаружил, что в многоконтейнерных решениях, не относящихся к Elastic Beanstalk, и в пользовательских сетях распознаватель будет предоставляться докером на 127.0.0.11, однако, поскольку в настоящее время невозможно определить определяемые пользователем сети в Dockerrun.aws.json, Я ищу другое решение. В links можно разрешить внутри контейнера, pinging api действительно работает, однако nginx там делает свое дело.

Я читал о dnsmasq также, однако, я хотел запустить это, не устанавливая этот пакет, есть ли у меня здесь выбор?

Невозможно заставить nginx использовать записи из / etc / hosts.

Однако вы можете использовать карту {} в своей конфигурации nginx, чтобы указать nginx, как преобразовывать имена хостов в IP-адреса. Вам понадобится скрипт для преобразования вашего / etc / hosts в формат, который можно использовать на карте, т.е. hostname ip против ip hostname.

Вот пример карты:

map $container_hostname $container_ip {
    default 127.0.0.1;
    containerA X.X.X.X;
    containerB Y.Y.Y.Y;
}

Позже в файле конфигурации вы можете сделать:

server_name   ~^(www\.)?(?<container_hostname>.+)$;

location / {
    proxy_pass http://$container_ip:80;
}

nginx будет соответствовать запрошенному server_name и сохраните его в $ container_hostname:

http://nginx.org/en/docs/http/server_names.html#regex_names

Затем он найдет имя хоста на карте, получит соответствующий IP-адрес и передаст его proxy_pass.

Подробнее на карте: http://nginx.org/en/docs/http/ngx_http_map_module.html

Нет nginx - нет проблем. Просто замените его на балансировщик нагрузки приложений. А как насчет запросов внутри связанных контейнеров? В любом случае они будут переходить непосредственно в связанные контейнеры, минуя nginx, так что здесь это бесполезно. Вы можете использовать порт 80 внутри контейнеров и поместить их на разные порты хоста для подключения балансировщика нагрузки.