Как получить 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 network inspect, docker exec)
- Скрипты и автоматизация: примеры получения IP в deploy-пайплайне
- Статический IP и docker-compose: как задать фиксированный адрес
- Подводные камни и практические советы
- Источники
- Заключение
docker inspect: получить IP контейнера прямо с хоста
Самый надёжный и распространённый способ получить docker контейнер ip — команда docker inspect с шаблоном --format (или -f). Это даёт точный адрес из поля NetworkSettings и легко парсится в скриптах.
Примеры:
# Получить 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:
docker network inspect bridge
Вы увидите раздел “Containers” с объектами вида IPv4Address: "172.17.0.2/16". Для автоматической выборки можно использовать jq:
docker network inspect bridge | jq -r '.[0].Containers | to_entries[] | "(.value.Name) (.value.IPv4Address)"'
Можно также получить IP изнутри контейнера (иногда внутри и снаружи адреса совпадают, иногда — нет):
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 или в скрипт развертывания.
- Быстрая однострочка при запуске контейнера:
cid=$(docker run -d --name myapp myimage)
ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $cid)
echo "$cid -> $ip"
- Надёжное ожидание, пока контейнер запустится:
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
- Обработчик событий — запуск deploy при старте контейнера:
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.)
- Полезные приёмы:
- Используйте
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:
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):
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 container inspect: https://docs.docker.com/reference/cli/docker/container/inspect/
- Разбор команд и примеров (как узнать IP контейнера): https://purpleschool.ru/knowledge-base/article/get-container-ip
- Руководство по запуску контейнеров и сетям (статический IP и примеры): https://selectel.ru/blog/tutorials/running-docker-container/
- Теория сети Docker (обзор): https://ru.hexlet.io/courses/docker-basics/lessons/network/theory_unit
- Дополнительный материал по получению IP (обзорные рецепты): https://tecadmin.net/get-docker-container-ip-address/
Заключение
Коротко: да — получить docker контейнер ip с хост‑машины можно одной командой (docker inspect -f ...), и это удобно для быстрого развёртывания. Но помните про эфемерность адресов: для надёжной автоматизации лучше использовать --format/jq, пользовательские сети с фиксированными IP либо пробрасывать порты и/или выполнять конфигурацию через docker exec.