🐳 Как узнать IP-адрес Docker контейнера

Мануал

Хотите узнать, какой IP-адрес у вашего запущенного контейнера?

Вы можете проверить работающий контейнер, чтобы получить эту информацию.

sudo docker container inspect container_name_or_ID

Команда inspect предоставляет много подробностей о проверяемом контейнере.

Пролистайте к концу вывода и загляните в раздел Networks, чтобы получить IP-адрес контейнера.

Вы также можете использовать команду grep, чтобы вывести только строки, соответствующие шаблону «IPAddress».

Не знаете название или идентификатор контейнера? Используйте команду sudo docker ps.

Не пугайтесь, если у вашего контейнера более одного IP-адреса.

В этом нет ничего необычного.

Чтобы понять это, вам нужно разобраться, как контейнеры взаимодействуют друг с другом.

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

Как общаются Docker контейнеры?

Docker – это инструмент для упаковки и доставки программного обеспечения с использованием технологии контейнеризации.

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

Каждое из этих программ разбивается на микросервисы, а затем упаковывается в контейнеры.

В зависимости от назначения программного обеспечения одной службе может потребоваться взаимодействие с другой.

Например, рассмотрим WordPress.

Есть две службы: одна – это веб-сервер, фронтенд, а другая – бэкэнд, база данных.

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

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

Эта сеть называется «docker network».

Docker network

Считайте Docker network пулои доступных IP-адресов.

Если два контейнера получат IP-адреса из одного пула, они смогут обмениваться данными друг с другом.

В основном есть два типа сетей: сети по умолчанию или предварительно определенные сети и сети, определяемые пользователем.

Вы можете получить список сетей, используя следующую команду:

 docker network ls
NETWORK ID NAME DRIVER SCOPE
03451ee164fe bridge bridge local
047550573b63 host host local
cec416104436 none null local

Проигнорируйте последние две записи и сосредоточьтесь на первой сети.

Сеть bridge – это сеть по умолчанию, к которой будет подключаться каждый контейнер, если не другое указан явно.

Вы можете получить более подробную информацию об этой сети, выполнив команду docker network inspect bridge.

Я собираюсь отфильтровать вывод, так как для этой демонстрации мне не нужны все данные, которые мы можем вывести.

❯ docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Subnet
172.17.0.0/16

Если у вас не установлен jq, установите его с помощью диспетчера пакетов вашего дистрибутива.

У каждой из этих сетей есть подсеть, в случае сети bridge это подсеть 172.17.0.0/16.

Это означает, что всего имеется 65534 – 1 = 65533 используемых хостов или IP-адресов.

Я отминусовал один, так как для шлюза выделен 172.17.0.1.

Вы также можете увидеть это, используя следующую команду:

docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Gateway

Проверка IP-адреса Docker контейнера

Есть несколько способов проверить IP-адрес[а], связанный с вашим контейнером, вот их список, включая примеры команд.

Метод 1: Inspect

Подкоманда inspect чрезвычайно полезна.

Контейнер можно проверить с помощью команды docker container inspect [CONTAINER ID] | [CONTAINER NAME].

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

Из вывода можно извлечь IP-адрес.

Если вы запустите команду inspect для контейнера, вы получите кучу информации в формате JSON.

Прокрутите вниз, пока не найдете ключ NetworkSettings, там найдите IPAddress.

Это и есть IP-адрес вашего контейнера.

Команда  выглядит следующим образом:
docker run --rm --name ubuntu-ip -d ubuntu:20.04 sleep 1d

Чтобы контейнер работал, я использовал команду sleep 1d.

Теперь запустите процесс оболочки внутри контейнера и прикрепите свой stdin|stdout вот таким образом:

docker exec -ti ubuntu-ip sh

Оказавшись в этом контейнере, попробуйте запустить ip или ifconfig.

Вы увидите что-то вроде следующего:

❯ docker exec -ti ubuntu-ip sh
# ip
sh: 1: ip: not found
# ifconfig
sh: 2: ifconfig: not found

Чтобы эти команды работали, вам необходимо установить соответствующие пакеты.

Чтобы получить команду ip, установите пакет iproute2 и повторно запустите команду ip a.

# apt update -qq                                       
6 packages can be upgraded. Run 'apt list --upgradable' to see them.
# apt install iproute2 -yqq
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

Теперь вы можете увидеть, что IP-адрес, связанный с интерфейсом eth0@if5, равен 172.17.0.2.

Обратите внимание на сеть, частью которой является этот контейнер.

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

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

Метод 3: проверив саму сеть

Всякий раз, когда контейнер подключается к сети, этот подключенный контейнер также виден из сети вместе с IP-адресом, назначенным этим контейнерам.

Поскольку мой контейнер подключен к сети bridge, я могу проверить сеть с помощью следующей команды:

docker network inspect [NETWORK NAME][NETWORK ID]
Здесь вместо идентификатора я буду использовать имя, bridge
❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16
В большинстве случаев вы не можете вспомнить идентификатор контейнера, поэтому, если вы хотите получить IP-адрес только из имени контейнера, вам потребуется некоторое знание jq (или просто повторно используйте следующую команду).
docker network inspect -f '{{json .Containers}}' bridge | \
    jq '..|if type == "object" and has("Name") then select(.Name=="[CONTAINER NAME]") | .IPv4Address else empty end' -r
Поместите имя контейнера в функцию select и вы увидите, как происходит волшебство.
❯ docker network inspect -f '{{json .Containers}}' bridge | \
    jq '..|if type == "object" and has("Name") then select(.Name=="ubuntu-ip") | .IPv4Address else empty end' -r

172.17.0.2/16

Какой метод выбрать?

Это были все методы, с помощью которых вы можете получить IP-адрес [а] контейнеров.

Второй метод, хотя и интуитивно понятен, не воспроизводится.

В большинстве случаев первый метод самый простой и хорошо выполняет свою работу.

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

В этом случае имеет смысл проверить сеть и подсветить IP-адреса.

Вы можете получить все имена контейнеров и назначенные им IP-адреса из сети вот так:

❯ docker network inspect -f '{{json .Containers}}' bridge | \
    jq '.. | if type=="object" and has("Name") then {(.Name): .IPv4Address} else empty end'

{
  "ubuntu-ip": "172.17.0.2/16"
}
{
  "ip": "172.17.0.3/16"
}
Добавить комментарий