Динамическое преобразование имени хоста контейнера в IP - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть несколько служб в docker-compose.yml, которые должны разговаривать друг с другом.Это не проблема, так как композитор заботится обо всех сетях внутри страны.Однако одной из служб необходим белый список, чтобы разрешить связь с ее API.Этот белый список имеет нежелательное ограничение только для адресов IPv4 - он не разрешает имена хостов.

Я бы хотел избежать необходимости определять собственную сеть и назначать статические IP-адреса контейнерам, сохраняя ее гибкость.Я искал вверх и вниз и не вижу способа разрешить имена служб во время выполнения или даже на этапе сборки.

Я пытался установить средства DNS и использовать dig, ноне может определить IP-адрес.Это, вероятно, связано с моим непониманием того, как Docker работает с сетевым уровнем.

Итак, мои вопросы:

  • Как я могу разрешить имя службы контейнеров во время выполненияили на этапе сборки?
  • При сборке с docker-compose присваивает ли он статические адреса контейнеру или есть возможность изменения IP-адреса контейнеров после перезагрузки?

1 Ответ

0 голосов
/ 17 февраля 2019

Несколько месяцев назад я столкнулся с подобной проблемой, и можно получить то, что вы хотите (даже если я работал над Kubernetes, а не с docker-compose).

Docker предоставляет внутреннюю систему разрешения DNS, как объяснено в этом вопросе StackOverflow .Если вы немного взломаете dig, вы увидите, что контейнер использует DNS-адрес, отличный от вашего хоста.

В частности, запуск примера Wordpress из документации docker-composeВы можете увидеть это следующим образом:

mkdir /tmp/test && cd /tmp/test
# create a docker-compose.yaml file and past the example from the link above
docker-compose up -d
# it should be test_default, check it out with `docker network ls`
docker run --rm -it --network test_default ubuntu /bin/bash

И затем, внутри типа контейнера:

apt-get update && apt-get install -y dnsutils
dig wordpress

Вы должны получить что-то похожее на это:

root@91e47b426ed3:/# dig wordpress

; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> wordpress
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17239
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;wordpress.                     IN      A

;; ANSWER SECTION:
wordpress.              600     IN      A       172.18.0.3

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Sun Feb 17 19:39:24 UTC 2019
;; MSG SIZE  rcvd: 52

Здесь вы видите, что в поле SERVER указано 127.0.0.11#53, это внутренняя система Docker DNS в моем случае.Вы можете проверить, что адрес является сообщаемым (в моем случае 172.18.0.3), устанавливающим curl и достигающим его в порту 80.

Имея это в виду, вы можете создать сценарий илиПрограмма, которая периодически выполняет разрешение адресов, принимает список адресов, возвращаемый DNS для этой службы, и соответствующим образом обновляет ваш белый список.

Как разрешить имя службы контейнеров во время выполнения или на этапе сборки?

На примере Java вы можете использовать класс InetAddress , для которого задан URL-адрес, который возвращает список адресов IP4 и IP6 (их можно отфильтровать с помощью InetAddressValidator изОбщая библиотека Apache).Вы можете увидеть больше здесь (вот так я решил проблему).В Linux есть специальный системный вызов, getaddrinfo , для получения списка IP-адресов с заданным URL-адресом.

При сборке с docker-compose назначает ли он статические адреса контейнеру или есть возможность изменения IP-адреса контейнеров после перезагрузки?

Относительно второговопрос, docker-compose использует ту же логику, что и docker build, поэтому он не будет назначать статические IP-адреса или аналогичные.Кроме того, в случае сбоя и перезапуска контейнера существует вероятность изменения его IP-адреса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...