Как узнать ip docker контейнера windows

Обновлено: 02.07.2024

Есть такие сетевые приложения, которым необходимо иметь выход во внешний мир не одним портом, а сразу большой группой. Примерами таких приложений могут являться различные программы работающие с потоковыми видео/аудио каналами. Например различные PBX решения, такие как Asterisk или FreeSWITCH.

Собственно, с попыток контейнеризировать Asterisk всё и началось. Есть готовые образы на Docker HUB, хорошим примером является dougbtv/asterisk.

Дальнейший текст можно считать вольным переводом документации по настройке сети в docker .

Не использовать контейнеризацию сетевой подсистемы

Это один из очень простых способов предоставить доступ к контейнеру. Если создать контейнер с опцией --net=host , то контейнер будет запущен с сетевой подсистемой хост-системы. Это крайне просто в реализации, но могут возникнуть другие проблемы. Например, придется создавать алиасы на необходимый внешний интерфейс с другими IP-адресами, а в приложения в контейнерах запускать с привязкой именно на этот адрес, а не на 0.0.0.0 . Все проблемы можно решить с помощью создания простого скрипта, который будет “разруливать” эти проблемы:

  • создавать алиас на интерфейс
  • передавать адрес в контейнер в какой-нибудь переменной
  • контейнер будет использовать эту переменную для запуска приложения

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

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

Проброс одного порта

Проброс одного порта в docker существовал изначально и делался крайне просто с помощью ключа -p или опции EXPOSE в Dockerfile . Например для запуска контейнера с mysql достаточно было указать порт внутри контейнера и порт для хост машины -p <host port>:<container port> (ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort):

Подробне про это можно прочитать в официальной документации тут.

Просмотреть проброшенные порты можно с помощью docker port :

Проброс группы портов

Проброс группы портов был востребован очень давно, но был добавлен в исходный код только 1 ноября 2014. Этот функционал уже доступен в docker версии 1.4.1 .

Пример совсем не похож на реальность, но на то он и пример. Необходимо пробросить 5 портов, 2000-2005 или 3000-3005. Сделаем это опцией --expose , но в одном случае ключ -P (публиковать проброшенные порты на хост-систему) будет установлен в состояние по умолчанию - false , а в другом изменим его состояние на true .

После этого в iptables в цепочках FORWARD и DOCKER увидим следующее:

Как видно из вывода iptables - сервис docker создает правила для проброса портов с хост-системы в контейнер и обратно. Но, стоит учесть то, что при использовании автоматической публикации портов в хост-систему он использует свободные порты из диапазона 49153-65535.

Теперь сделаем тоже самое, но с диапазоном портов 3000-3005 и без публикации портов в хост-систему:

После этого мы не уивидим никаких дополнительных правил для проброса портов, лишь правила для bridge-интерфейса docker0 :

Теперь docker не создал правил для проброса портов. Сделаем это сами и всего лишь одной строкой для каждой цепочки:

Маршрутизация в контейнер

Можно сделать всё на много проще. На сетевом интерфейсе хост-системы уже включен ip_forward (это требуется при первичной настройке docker ) и этого достаточно.

Допустим на хост-системе есть 2 сетевых интерфейса с ip-адресами: 10.10.10.10 и 172.172.172.172. Для доступа к контейнерам из внешней сети достаточно на роутерах во внешней сети указать маршрут на сеть docker через один из ip адресов хост-системы. Но тут встает другая проблема - закрепить IP-адрес за контейнером.

Для назначения статическиого адреса контейнеру создадим контейнер со своей сетевой подсистемой, но никак не связанной с хостовой. Для этого используется ключ --net=none :

Далее, следуя инструкциям из документации назначим IP-адрес контейнеру:

Теперь внутри контейнера ubuntu_none установлен IP-адрес 192.168.10.2. Таким образом был назначен необходимый IP-адрес.

Скрипт для запуска контейнеров со постоянным IP-адресом

Эта часть не совсем относится к настройке сети в контейнерах docker , а скорее к автоматизации описанного ранее.

Почитать подробнее про ностройку сети в docker можно тут - Network Configuration.

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

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

Не могли бы вы рассказать, как бы вы хотели использовать эту информацию? Вы сказали «хосты Docker» - вы запускаете Docker на нескольких хостах? Как только ваш контейнер узнает IP-адрес хоста и карт портов, что он будет делать? Самый простой способ передать IP-адреса хоста докера в контейнер докера, я думаю, что вы должны сделать вызов внутри контейнера, используя 'docker container exec'. Предположим, что вы хотите пропинговать хост из контейнера busybox, например: $ IP = '8.8.8.8' && docker container busybox ping $ IP 'Способ узнать IP хоста, используйте то, что вам больше нравится.

Как заметил @MichaelNeale, нет смысла использовать этот метод Dockerfile (кроме случаев, когда нам нужен этот IP только во время сборки), потому что этот IP будет жестко задан во время сборки.

Когда вы используете Docker Bridge (по умолчанию) для контейнеров, это выведет IP-адрес мостов, например, 172.17.42.1, а не IP-адрес хоста, такой как 192.168.1.x (я предполагаю, что ваш хост находится на домашнем NAT). Ответ @Magno Torres - это, вероятно, то, чего хотят люди в таких ситуациях, если вам нужен адрес 192.168.1.x. этот RUN не будет работать так, как вы ожидаете - он будет только вычислять IP во время сборки - и будет всегда статическим и бесполезным. Это будет IP хоста сборки. @ Programster, я могу предположить, что людям нужна связь между хостом докера и контейнером, это то, что может дать вам IP-мост (конечно, в стандартной «домашней» установке). Зачем кому-то нужен «реальный» IP-адрес хоста, если он может быть даже за пределами докерского моста и может быть недоступен? Это решение для всех людей, которые только что установили докер и хотят поиграть с ним в скором времени. @MichaelNeale, как и раньше, я бы предположил, что большинству людей, начинающих с докера, нужна связь между их хостом и контейнером, вот и все. Если кто-то делает «правильное» развертывание, возможно, он в любом случае не использует Docker Bridge, он использует настраиваемую сеть, и, возможно, он знает обо всех сетевых особенностях или у них настроен DNS (или любое другое обнаружение). @ spinus - но это будет допустимо только в том случае, если он работает на хосте, на котором он был создан - в этом случае - вы можете просто жестко его кодировать - или посмотреть его - я думаю, что это не полезный ответ и будет вводить в заблуждение много людей - рекомендую удалить его. (Бег RUN)

Начиная с версии 18.03, вы можете использовать host.docker.internal в качестве IP- адреса хоста.

Работает в Docker для Mac , Docker для Windows и, возможно, на других платформах.

Это обновление для Mac docker.for.mac.localhost , доступное с версии 17.06 и docker.for.mac.host.internal доступное с версии 17.12, которое также может работать на этой платформе.

Обратите внимание, как и в документации для Mac и Windows , это только для целей разработки.

Например, на моем хосте установлены переменные окружения:

В моем docker-compose.yml файле у меня есть это:

@allanberry, к сожалению, люди Docker предпочитают не предоставлять нам независимый от платформы способ сделать это, потому что они предпочитают не использовать непреднамеренные варианты использования (например, доступ к любому сервису на локальном компьютере из контейнера Docker) Я познакомился с Docker'ом как Build it однажды, запускаю его везде. Но это на самом деле неверно, так как вы всегда должны настраивать и хост-систему. Так что docker.for.mac.. это бесполезно , так как в большинстве случаев не имеют среды linux- или Mac-только в вашей компании. Это смешанно, у вас есть разработчики, использующие Linux, Mac и Windows. Этот домен не имеет смысла, так как на 99% это смешанная среда хост-ОС. Я не разрабатываю контейнер под macOS и не развертываю его на сервере macOS. Я развернул его в Linux. Это то, что все делают. Так в чем же смысл docker.for.mac.. ? @allanberry docker.for.mac.host.internal не имеет значения, используете ли вы Docker с или без docker-compose . Я хочу использовать фиксированный хост в файлах конфигурации. IDK, например, docker.host.internal который всегда указывает на IP-адрес хоста. Независимо от того, какую хост-систему я использую. В этом весь смысл использования Docker: я хочу быть автономным. Я понимаю, что это еще сложнее в macOS, потому что у вас есть другой слой между хост-системой и контейнером. Но в любом случае, на мой взгляд docker.for.mac.host.internal , бесполезно, если вы можете использовать его только для macOS. host.docker.internal действительно работает на Docker для Windows , по крайней мере, во время написания этого комментария. это работает отлично, у меня есть dockerCe для окон и запуска jenkins в одном из контейнеров. Я хотел запустить команду docker в jenkins, но docker не смог подключиться на этапе добавления облака, я использовал этот tcp: //host.docker.internal: 2375 и включил «выставить демон на localhost: 2375», и он работает. сэкономил много времени. Спасибо!

Обновление: в Docker для Mac , начиная с версии 18.03, вы можете использовать host.docker.internal в качестве IP- адреса хоста. Смотрите ответ Алланберри . Для предыдущих версий Docker для Mac все еще может быть полезен следующий ответ:

В Docker для Mac docker0 мост не существует, поэтому другие ответы здесь могут не работать. Однако весь исходящий трафик направляется через ваш родительский хост, поэтому до тех пор, пока вы пытаетесь подключиться к IP-адресу, который он распознает как сам по себе (а док-контейнер не считает себя таким), вы должны иметь возможность подключиться. Например, если вы запускаете это с родительского компьютера, запустите:

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

Затем вы можете проверить соединение из контейнера Docker с помощью telnet. В моем случае я хотел подключиться к удаленному серверу xdebug:

Теперь, когда трафик поступает на ваш Mac с адресом 192.168.46.49 (и весь трафик, выходящий из вашего контейнера, проходит через ваш Mac), ваш Mac будет считать, что IP сам по себе. Когда вы закончите использовать этот IP-адрес, вы можете удалить псевдоним петли следующим образом:

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

В моем случае это показало, inet 127.0.0.1/8 что означает, что я не мог использовать любые IP-адреса в 127.* диапазоне. Вот почему я использовал 192.168.* в приведенном выше примере. Убедитесь, что используемый вами IP-адрес не конфликтует с чем-то в вашей сети.

I am using Docker for Mac. I am running a nodejs based microservice in a Docker container. I want to test node microservice through the browser. How to get IP address of running docker container?

docker узнать ip контейнера

7 Answers 7

Probably is better to filter:

docker узнать ip контейнера

docker узнать ip контейнера

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

После чего будет вывалено очень много информации в JSON формате. JSON — удобно. Неудобно то, что я хочу просто информацию об IP. Или же вовсе хочу список всех этих IP. Для этого нужно указать какую именно секцию данных мы хотим посмотреть — что-то вроде фильтров:

Супер, но каждый раз такое набирать утомительно, да и запоминать не очень хочется. В итоге родился такой вот простой bash скрипт:

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

а если хотим узнать IP этих контейнеров, товместо пробелла у нас всего лишь добавляется символ i

Я не вывожу полный хеш контейнера так как он и не нужен. Для тех, кто не знает: при работе по хешу можно указывать первые 3 символа а не копировать весь хеш целиком.

Как дополнение всегда можно воспользоваться командой

Эта команда позволяет узнать IP конкретного контейнера.

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

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

современный синтаксис клиента Docker:

старый синтаксис клиента Docker:

который вернет только IP-адрес.

можно использовать docker inspect

сначала получите идентификатор контейнера:

(первый столбец для идентификатора контейнера)

используйте идентификатор контейнера для запуска:

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

если вы используете docker-compose команда будет такая:

добавьте этот сценарий оболочки в свой

/.bashrc или соответствующие файл:

затем, чтобы получить IP-адрес контейнера, просто сделать это:

для новой версии Docker, пожалуйста, используйте следующее:

показать все IP-адреса контейнеров:

в Docker 1.3+ вы также можете проверить его с помощью следующих шагов:

введите Докер работает:

начиная с Docker версии 1.10.3, построить 20f81dd

Если вы не сказали докеру иначе, Докер всегда запускает ваши контейнеры в сети моста. Таким образом, вы можете попробовать эту команду ниже:

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

это отобразит активные изображения docker:

используйте значение идентификатора контейнера:

первая команда дает IP-адрес всех контейнеров, а вторая-IP-адрес конкретного контейнера.

контейнеры ссылки по имени:

затем возьмите IP-адрес по имени:

Я написал следующий скрипт Bash, чтобы получить таблицу IP-адресов из всех контейнеров, работающих под docker-compose .

вы должны изменить сеть переменных на свое собственное сетевое имя.

Docker сделан внутренне в Go, и он также использует синтаксис Go для целей запроса.

для проверки IP-адреса конкретного контейнера необходимо выполнить команду (- F для опции форматирования)

для идентификатора или имени контейнера вы можете запустить команду docker container ls . Он будет перечислять каждый запущенный контейнер.

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

важно: начиная с версии 1.9, Docker позволяет создавать несколько сетей и присоединять их к контейнер.

выход так же, как это:

вышеизложенное работает, если контейнер развернут в сети моста по умолчанию.

однако, если вы используете пользовательскую мостовую сеть или сеть наложения, я нашел ниже, чтобы работать лучше:

чтобы расширить ответ ko-dos, вот псевдоним для списка всех имен контейнеров и их IP-адресов:

Если вы установили Docker с помощью Docker Toolbox, вы можете использовать приложение Kitematic для получения IP-адреса контейнера:

  1. выберите контейнер
  2. нажмите на Настройки
  3. перейдите на вкладку порты.

внимание. для использования Docker Compose:

поскольку Docker Compose создает изолированную сеть для каждого кластера, приведенные ниже методы не работают с docker-compose .

самый элегантный и простой способ-определить функцию оболочки как наиболее проголосовавший ответ @WouterD это:

Docker может записывать идентификаторы контейнеров в файл, такой как программы Linux:

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

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

--format вариант проверки приходит на помощь.

Синтаксис современного Docker-клиента:

Синтаксис старого Docker-клиента:

Который вернет только IP-адрес.

Как упоминалось в комментариях: если вы в Windows, используйте двойные кавычки " вместо одинарных кавычек ' вокруг фигурных скобок.

Вы можете использовать docker inspect <container id>

Сначала получите идентификатор контейнера:

(Первый столбец предназначен для идентификатора контейнера)

Используйте идентификатор контейнера для запуска:

Внизу в разделе "NetworkSettings" вы можете найти "IPAddress",

Или просто выполните:

docker inspect CONTAINER_ID | grep "IPAddress"

Если вы добавите -i в grep, корпус IPAddress может выглядеть примерно так:

docker inspect CONTAINER_ID | grep -i "IPADDress"

Чтобы получить все имена контейнеров и их IP-адреса только в одной команде.

Если вы используете docker-compose , команда будет следующей:

Добавьте эту оболочку script в свой

/.bashrc или соответствующий файл:

Затем, чтобы получить IP-адрес контейнера, просто выполните следующее:

Для новой версии Docker, пожалуйста, используйте следующее:

Показать все IP-адреса контейнеров:

В Docker 1. 3+ вы также можете проверить это с помощью следующих шагов:

Войдите в работающий Docker (Linux):

В версии Docker версии 1.10.3, build 20f81dd

Если вы не сказали Docker иначе, Docker всегда запускает ваши контейнеры в сети моста. Поэтому вы можете попробовать эту команду ниже:

Затем следует вернуть раздел Контейнеры, который отобразит IP-адрес для этого работающего контейнера.

Это отобразит активные изображения докеров:

Используйте значение идентификатора контейнера:

Основываясь на некоторых ответах, которые мне нравились, я решил объединить их с функцией, чтобы получить все IP-адреса, а другой - для конкретного контейнера. Они теперь находятся в моем файле .bashrc .

Первая команда дает IP-адрес всех контейнеров, а второй - конкретный IP-адрес контейнера.

Справочные контейнеры по имени:

Затем возьмите адрес IP-адреса по имени:

Я написал следующий Bash script, чтобы получить таблицу IP-адресов из всех контейнеров, работающих под docker-compose .

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

Docker создается внутри Go и использует синтаксис Go для запросов.

Для проверки IP-адреса конкретного контейнера необходимо выполнить команду (-f для опции формата)

Для идентификатора или имени контейнера вы можете запустить команду docker container ls . Он отобразит список всех запущенных контейнеров.

Вот решение, которое я разработал сегодня на Python, используя в качестве источника данных вывод JSON для проверки докеров.

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

ВАЖНО: начиная с версии 1.9, Docker позволяет создавать несколько сетей и прикреплять их к контейнерам.

Читайте также: