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