Разрешить docker IP-адрес контейнера из ОС хоста, используя имя контейнера - PullRequest
0 голосов
/ 25 мая 2020

У меня есть неконтейнерный экземпляр nginx, служащий обратным прокси для контейнерных и неконтейнерных сервисов.

Поскольку IP-адреса контейнера могут изменяться при перезагрузке, я не хочу использовать их в файл конфигурации nginx. Я искал простой способ ссылаться на контейнеры. Контейнеры Docker могут ссылаться друг на друга по имени контейнера, то есть поиск в DNS имен контейнера дает IP-адрес контейнера. Я искал что-то подобное, но имена должны быть разрешены из ОС хоста.

Ограничения:

Решение должно работать с существующими контейнерами. Так что никаких docker run ... команд

Я пробовал mageddo / dns-proxy-server. Предполагается, что он разрешает имена контейнеров, но этого не происходит даже после установки правильных переменных среды.

sudo docker run -d \
--restart unless-stopped \
--name dns-proxy-server \
-p 5380:5380 \
-e MG_REGISTER_CONTAINER_NAMES=true \
--hostname dns.mageddo \
-v /opt/dns-proxy-server/conf:/app/conf \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/resolv.conf:/etc/resolv.conf defreitas/dns-proxy-server

PS: Хотя nginx взят в качестве примера, функция поиска DNS полезна во многих других сценариях ios. Поэтому я ищу решение для поиска DNS, а не просто исправление проблемы nginx.

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

Процессы за пределами Docker не могут получить доступ к системе Docker DNS; за исключением одной конкретной конфигурации c, они также не могут получить доступ к частным IP-адресам контейнера.

Вместо этого вы можете опубликовать sh порты из своих контейнеров, используя параметр docker run -p или параметр Compose ports: . Указанный вами номер порта будет стабильным и сохранится при перезапуске контейнера. Если вы не хотите, чтобы порт был доступен напрямую за пределами хоста, вы можете ограничить его доступ только через интерфейс обратной связи хоста.

docker run -d --name backend \
  -p 127.0.0.1:8001:3000 \      # port 8001 reaches this container, only on lo0
  ...
match /backend/ {
  proxy_pass http://localhost:8001/
}

Если это важно для вашего nginx конфигурации для использования внутреннего DNS Docker, вы также можете запустить прокси nginx внутри Docker.

0 голосов
/ 25 мая 2020

Есть решение, которое можно реализовать. Сначала запустите DNS-сервер.

docker run --rm --hostname dns.mageddo --name dns-proxy-server -p 5380:5380 \
  -v /opt/dns-proxy-server/conf:/app/conf \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /etc/resolv.conf:/etc/resolv.conf \
  defreitas/dns-proxy-server

Затем запустите тестовый контейнер для проверки имени хоста

docker run --hostname test.intranet nginx

Тестирование

ping test.intranet
PING test.intranet (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3 (172.18.0.3): icmp_seq=1 ttl=64 time=0.072 ms
64 bytes from 172.18.0.3 (172.18.0.3): icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from 172.18.0.3 (172.18.0.3): icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 172.18.0.3 (172.18.0.3): icmp_seq=4 ttl=64 time=0.046 ms
...