Несколько месяцев назад я столкнулся с подобной проблемой, и можно получить то, что вы хотите (даже если я работал над 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-адреса.