Сеть Docker Bridge DNS

У меня есть два контейнера, работающих в стандартной сети Docker Bridge. Демон назначает им "случайный" ip в определенном диапазоне.

network_mode: bridge -> 172.17.0.X

Как я могу связаться друг с другом через псевдоним или имя?

2 ответа

Давайте возьмем следующие контейнеры, работающие с базовым образом Ubuntu:16.04:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2461f410228b        ubuntu:16.04        "/bin/bash"         20 minutes ago      Up 20 minutes                           competent_shockley
6da9d8196637        ubuntu:16.04        "/bin/bash"         21 minutes ago      Up 21 minutes                           hungry_mccarthy

Стандартные сети от Docker, чтобы узнать больше о стандартных сетях, обратитесь сюда:

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f83800356529        bridge              bridge              local
8169b2246500        host                host                local
b61e4f39c0ec        none                null                local

Давайте выясним IP-адреса контейнеров, используя docker inspect:

$ docker inspect 2461f410228b | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.18.0.3",
                    "IPAddress": "172.18.0.3",


$ docker inspect 6da9d8196637 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.18.0.2",

По умолчанию контейнеры, запущенные в сети BRIDGE, смогут получить доступ к другим контейнерам, запущенным в той же сети.

root@2461f410228b:/# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.051 ms

Поскольку вы ищете доступ к другому контейнеру, используя имя / псевдоним, добавьте информацию о целевом контейнере в файл / etc / hosts для разрешения DNS:

root@2461f410228b:/# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3      2461f410228b
172.18.0.2      docker2

Теперь попробуйте достичь целевого контейнера, используя имя хоста:

root@2461f410228b:/# ping docker2
PING docker2 (172.18.0.2) 56(84) bytes of data.
64 bytes from docker2 (172.18.0.2): icmp_seq=1 ttl=64 time=0.077 ms

Я считаю, что это может помочь в некоторой степени.

Я запускал банку Spring Boot в одном контейнере Docker и хотел подключиться к базе данных Oracle, работающей в другом. В файле Spring application.properties я ссылался на URL-адрес базы данных как

      spring.datasource.url=jdbc:oracle:thin:@oracle:1521/xepdb1

В моем файле Windows C:\Windows\System32\drivers\etc\hosts я разрешил "оракул" как IP-адрес локального хоста, чтобы я мог запускать приложение Java из Eclipse...

      127.0.0.1 oracle

Из команды docker inspect я смог определить IP-адрес контейнера Oracle как 172.17.0.2.

Когда я запустил свой контейнер Spring Boot, я запустил его с переключателем --add-host, чтобы разрешить «оракул» в качестве IP-адреса контейнера базы данных...

      docker run --add-host=oracle:172.17.0.2 -p 9090:8080 -dit --name <name> <image>

В моих пакетных командах после сборки Jenkins я фиксирую IP-адрес работающего контейнера базы данных и передаю его в контейнер приложения при запуске...

      for /F %%x in ('docker inspect -f "{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}" oracle-xe') do set ip=%%x
docker run --add-host=oracle:%ip% -p 9090:8080 -dit --name demo demo
Другие вопросы по тегам