DevOps

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

Узнайте, как быстро получить IP-адрес Docker контейнера с хоста командой docker inspect. Примеры для скриптов, docker network inspect, статический IP в docker-compose и советы по автоматизации развертывания.

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

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

В принципе, как только Docker создает контейнер, я хочу развертывать свои собственные скрипты для развертывания кода и настройки контейнера.

Да — получить docker ip адрес контейнера с хост‑машины можно одной командой: используйте docker inspect с шаблоном --format. Простейшая команда — docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container> — возвращает IP контейнера и удобно встраивается в скрипты развёртывания. Для устойчивой автоматизации лучше брать IP через --format или jq, либо задать пользовательскую сеть/фиксированный IP или проброс портов.


Содержание


docker inspect: получить IP контейнера прямо с хоста

Самый надёжный и распространённый способ получить docker контейнер ip — команда docker inspect с шаблоном --format (или -f). Это даёт точный адрес из поля NetworkSettings и легко парсится в скриптах.

Примеры:

bash
# Получить IP (любой сети, если их несколько — вернёт все подряд)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_container

# Конкретная сеть (например, bridge или mynet)
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' my_container
docker inspect -f '{{.NetworkSettings.Networks.mynet.IPAddress}}' my_container

# Альтернатива: вывести JSON и парсить через jq
docker inspect my_container | jq -r '.[0].NetworkSettings.Networks.bridge.IPAddress'

Официальная справка по docker container inspect с описанием шаблонов и структуры JSON доступна в документации: https://docs.docker.com/reference/cli/docker/container/inspect/. Практический разбор команд — в руководствах с примерами: https://purpleschool.ru/knowledge-base/article/get-container-ip и https://selectel.ru/blog/tutorials/running-docker-container/.


docker ip: другие способы (docker network inspect, docker exec)

Если хотите посмотреть IP-адреса всех контейнеров в сети — используйте docker network inspect:

bash
docker network inspect bridge

Вы увидите раздел “Containers” с объектами вида IPv4Address: "172.17.0.2/16". Для автоматической выборки можно использовать jq:

bash
docker network inspect bridge | jq -r '.[0].Containers | to_entries[] | "(.value.Name) (.value.IPv4Address)"'

Можно также получить IP изнутри контейнера (иногда внутри и снаружи адреса совпадают, иногда — нет):

bash
docker exec -it my_container hostname -i
# или
docker exec -it my_container ip -4 addr show eth0

Команда hostname -i возвращает адреса, которые контейнер видит на своих интерфейсах; это полезно для диагностики, но для автоматизации с хоста удобнее docker inspect/docker network inspect. Теоретические основы сетей Docker — обзорный материал: https://ru.hexlet.io/courses/docker-basics/lessons/network/theory_unit.


Скрипты и автоматизация: примеры получения IP в deploy-пайплайне

Ниже — практичные варианты для внедрения в CI/CD или в скрипт развертывания.

  1. Быстрая однострочка при запуске контейнера:
bash
cid=$(docker run -d --name myapp myimage)
ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $cid)
echo "$cid -> $ip"
  1. Надёжное ожидание, пока контейнер запустится:
bash
cid=$(docker run -d --name myapp myimage)

# дождаться состояния Running
until [ "$(docker inspect -f '{{.State.Running}}' $cid 2>/dev/null)" = "true" ]; do
 sleep 0.2
done

ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $cid)
echo "Container $cid is up at $ip"
# выполнить деплой/настройку, например curl или docker exec
  1. Обработчик событий — запуск deploy при старте контейнера:
bash
docker events --filter 'type=container' --filter 'event=start' --format '{{.ID}}' \
| while read cid; do
 ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $cid)
 ./deploy.sh "$cid" "$ip"
 done

(Такой поток работает как простой слушатель событий от демона Docker.)

  1. Полезные приёмы:
  • Используйте docker inspect --format вместо голого docker inspect + grep — это стабильнее.
  • Для сложных JSON-структур используйте jq.
  • В скриптах опирайтесь на container id (docker ps -q) а не на имя — имена могут меняться.
  • Для Docker Compose: получайте id сервиса через docker compose ps -q <service> (или docker-compose ps -q), затем inspect.

Но есть вопрос: стоит ли вообще полагаться на IP контейнера? Часто удобнее запускать конфигурацию через docker exec или проброс портов (-p) и обращаться к сервису по localhost. Ниже — рекомендации.


Статический IP и docker-compose: как задать фиксированный адрес

Если вам нужен фиксированный IP, создайте пользовательскую сеть с заданной подсетью и указывайте IP при запуске, либо задайте адрес в docker‑compose через ipam.

Пример через CLI:

bash
docker network create --subnet=172.20.0.0/16 mynet
docker run --network mynet --ip 172.20.0.10 -d --name app myimage

Пример docker-compose (yaml):

yaml
version: '3.7'
services:
 app:
 image: myimage
 networks:
 mynet:
 ipv4_address: 172.20.0.10

networks:
 mynet:
 driver: bridge
 ipam:
 config:
 - subnet: 172.20.0.0/16

Документация и примеры по запуску контейнеров и созданию сетей — в практических статьях: https://selectel.ru/blog/tutorials/running-docker-container/. Задание статического IP даёт стабильность, но требует аккуратного управления адресным пространством (избегайте конфликтов).


Подводные камни и практические советы

  • IP контейнера в дефолтной bridge‑сети меняется при перезапуске. Значит, хардкодить «эти» IP в конфиг не стоит. Лучше: проброс портов, пользовательская сеть с фиксированным IP, или service discovery.
  • Хост и внешний мир: адрес контейнера (например 172.17.x.x) — внутренний; внешний клиент не доберётся до него без NAT/маршрутизации. Для доступа извне публикуйте порты (-p hostPort:containerPort) или используйте --network host (в этом режиме контейнер использует сетевой стек хоста).
  • Несколько сетей: контейнер может иметь IP в нескольких сетях — указывайте нужную сеть в шаблоне: .NetworkSettings.Networks.<network>.IPAddress.
  • IPv6: поля отличаются (GlobalIPv6Address и т.д.) — проверяйте структуру docker inspect.
  • Docker Compose: внутри сети Compose контейнеры видят друг друга по имени через встроенный DNS; на хосте это имя не резолвится.
  • Если вы разворачиваете код в контейнер (копируете файлы), подумайте про docker cp, docker exec или смонтированные тома — это надёжнее, чем SSH по IP в контейнере.

Небольшой чек‑лист для скрипта деплоя:

  • дождаться состояния контейнера Running;
  • получить IP через --format или jq;
  • если нужен стабильный адрес — используйте пользовательскую сеть/фиксированный IP;
  • по возможности — обращайтесь к контейнеру по опубликованному порту или делайте конфигурацию через docker exec.

Источники


Заключение

Коротко: да — получить docker контейнер ip с хост‑машины можно одной командой (docker inspect -f ...), и это удобно для быстрого развёртывания. Но помните про эфемерность адресов: для надёжной автоматизации лучше использовать --format/jq, пользовательские сети с фиксированными IP либо пробрасывать порты и/или выполнять конфигурацию через docker exec.

Авторы
Проверено модерацией
Модерация
Как получить IP Docker контейнера с хост-машины