Хотите узнать, какой 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-адрес вашего контейнера.
Метод 2: Использование оболочки контейнера
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]
❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16
docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="[CONTAINER NAME]") | .IPv4Address else empty end' -r
❯ 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"
}