Як отримати IP-адресу запущеного контейнера докера


94

Я використовую Docker для Mac. Я запускаю мікросервіс на основі nodejs у контейнері Docker. Я хочу протестувати мікросервіс вузла через браузер. Як отримати IP-адресу запущеного контейнера докера?


2
Це відповідає на ваше запитання? Як отримати IP-адресу контейнера Docker від хоста?
саняш

Відповіді:


115

Якщо ви не хочете зіставляти порти з вашого хосту в контейнер, ви можете отримати доступ безпосередньо до діапазону докера ip для контейнера. Цей діапазон за замовчуванням доступний лише з вашого хосту. Ви можете перевірити дані контейнерної мережі, виконуючи:

docker inspect <containerNameOrId>

Напевно, краще відфільтрувати:

docker inspect <containerNameOrId> | grep '"IPAddress"' | head -n 1

Зазвичай типовим діапазоном IP-адрес докера є 172.17.0.0/16. Вашим хостом повинен бути 172.17.0.1і ваш перший контейнер, 172.17.0.2якщо все нормально, і ви не вказали жодних спеціальних параметрів мережі.

EDIT Ще один більш елегантний спосіб використання функцій докера замість "обдурювання":

docker inspect -f "{{ .NetworkSettings.IPAddress }}" <containerNameOrId>

7
Ви говорите про внутрішній IP, і він не має нічого спільного з актуальним питанням. Ваша відповідь викликає просто незрозумілість читача. Оскільки IP - це IP машини, на якій працює Docker. Що просто localhost:)
Девід Гатті

Ви неправі. В ОП не вказано нічого про мікросервіс, який повинен бути доступним ззовні. Він сказав лише "перевірити мікросервіс вузла через браузер", і це можна зробити за допомогою запропонованого мною методу http://172.17.0.2:anyPortз хосту. Звичайно, якщо ви хочете отримати доступ до нього за допомогою localhost на хості, ви повинні зіставити порти. Побачимо, чого хоче ОП.
OscarAkaElvis

3
Ви говорите, що можете отримати доступ до внутрішнього IP всередині контейнера з хосту? Це фізично неможливо, це зовсім інша мережа. Мало того, що я просто перевірив і так, я не можу отримати доступ до 172.17.0.7 мого контейнера докера, тоді я повинен мати можливість бачити всіх претендентів на докер, якщо я сканую свою хост-машину за допомогою мережевого сканера, і це не так знову. Я знаю, що це не повинно працювати, я перевірив те, що ви говорите (ніколи не знаєш), і воно не працює. То, можливо, у вашому поясненні бракує ключової частини?
Девід Гатті

До контейнерів можна дістатись із хосту. Спробуйте самі ... Я вам підкажу. 1. Завантажте запущений контейнер: docker run --name struts --rm -i tomcat2. Отримайте ip вашого контейнера (якщо у вас лише один): docker inspect struts | grep '"IPAddress"' | head -n 13. Відкрийте його в браузері хоста http://x.x.x.x:8080. Ви можете побачити сторінку Apache Tomcat за замовчуванням.
OscarAkaElvis

1
Я не зміг отримати доступ до веб-програми в контейнері без відображення порту за допомогою -p
bilal.haider

22

Використовуйте --formatопцію, щоб отримати лише IP-адресу, а не всю інформацію про контейнер:

sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID>

4
У хості Windows використовуйте подвійні лапки замість одинарних лапок. Наприклад, перевірка докера sudo --формату "{{.NetworkSettings.IPAddress}}" <ІДЕНТИФІКАЦІЯ або ІМЯ КОНТЕЙНЕРА> Посилання: посилання
Vineet Sajwan

1
новий формат інформації про контейнер тут
Ігор

18

Для сучасних докерних двигунів використовуйте цю команду:

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

а для старих двигунів використовують:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

Як зазначалося та посилалось у коментарі @sanyash up в оригінальній зоні OP.
Джессі Чисхолм,

Помилка розбору шаблону: template:: 1: несподівана незакрита дія в команді
gmlvsv

11

якщо ви хочете отримати його прямо в контейнері, можете спробувати

ip a | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | grep 172.17

5

Ви можете розпочати свій контейнер із прапорця -P. Це "призначає" випадковий порт для відкритого порту вашого зображення.

З docker port <container id>ви можете побачити випадково обраний порт. Тоді доступ можливий через localhost:port.


2

Для мого випадку, нижче працювали на Mac :

Я не міг отримати доступ до IP-адрес контейнера безпосередньо на Mac. Мені потрібно використовувати localhostз переадресацією портів, наприклад, якщо порт 8000, тоhttp://localhost:8000

Див. Https://docs.docker.com/docker-for-mac/networking/#known-limitations-use-cases-and-workarounds

Оригінальна відповідь була з: https://github.com/docker/for-mac/issues/2670#issuecomment-371249949


-2

Ви не можете отримати доступ до IP-адреси докера за межами цієї хост-машини. Якщо ваш браузер на іншій машині, краще зіставити порт хосту з портом контейнера, передавши -p 8080:8080команду запуску.

Передаючи, -pви можете зіставити порт хосту з портом контейнера, а проксі встановлено для переадресації всього трафіку для вказаного порту хоста до призначеного порту контейнера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.