Поиск по сайту:

Как получить IP-адрес контейнера Docker с хоста


Контейнеры Docker предназначены не только для изоляции — они часто используются для управления процессами, которым все еще необходимо напрямую взаимодействовать друг с другом. Но для связи вам часто нужно знать IP-адрес каждого контейнера, который вы можете найти с помощью нескольких команд.

Рассмотрите возможность использования определяемого пользователем моста

Сеть Docker немного сложна. Контейнеры, запущенные по умолчанию, будут помещены в «мостовую сеть» по умолчанию, и им будет разрешено напрямую взаимодействовать с другими контейнерами, если у вас есть их частный IP-адрес. Это можно отключить для настоящей изоляции, но по умолчанию это не так.

Вы также можете использовать этот адрес для связи с хост-ОС, если вы не хотите привязывать порт. Это основной вариант использования доступа к контейнеру напрямую через его IP-адрес, но вам, вероятно, следует просто привязать порт (вы можете закрыть его от Интернета в своем брандмауэре).

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

Контейнеры, добавленные в сети, отличные от сетей по умолчанию, смогут получать доступ друг к другу через свой псевдоним, который автоматически преобразуется в частный IP-адрес. Вы можете создавать новые сети, запускать контейнеры в этих сетях и подключать существующие контейнеры к сети. Затем вы можете получить доступ к другим контейнерам, используя псевдоним в качестве имени хоста; например, контейнер NGINX здесь может получить доступ к экземпляру MongoDB с помощью строки подключения mongodb://mongohost:27017.

docker network create example
docker run --net example --name nginx -d nginx
docker network connect example --alias mongohost mongodb

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

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

Получение IP-адреса из Docker

Однако, если вам нужен только IP-адрес, его довольно просто получить из хост-ОС. Во-первых, вам нужно найти идентификатор или имя контейнера, для которого вы хотите получить информацию, что вы можете сделать:

docker ps

Затем запустите docker inspect, который вернет огромный файл JSON со всей информацией о контейнере. Однако нас интересует только IP-адрес, поэтому вы можете передать ему параметр форматирования с помощью -f , чтобы сузить его до адреса.

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' name_or_id

Эта команда работает хорошо, но она также возвращает информацию только для одного контейнера, идентификатор которого вам понадобится. Если вам нужно более конкретное решение, вы можете использовать docker network inspect , который выводит информацию обо всех контейнерах в данной сети, при необходимости форматируя ее в виде таблицы поиска JSON:

docker network inspect bridge -f '{{json .Containers}}'

Получение конфигурации сети из контейнера

Контейнеры Docker на самом деле представляют собой просто механизм изоляции, и ничто не мешает вам просто войти в контейнер и выполнить обычные команды Linux, такие как ifconfig, и таким образом получить IP-адрес.

Для этого вам нужно получить имя или идентификатор контейнера с помощью docker ps, а затем запустить exec -it, в данном случае распечатав всю информацию об IP:

docker exec -it b94ef3169cd4 ip a