Как получить IP-адрес контейнера Docker от хоста?
есть ли команда, которую я могу запустить, чтобы получить IP-адрес контейнера прямо с хоста после создания нового контейнера?
в принципе, как только Docker создает контейнер, я хочу свернуть свои собственные сценарии развертывания кода и конфигурации контейнера.
30 ответов
современный синтаксис клиента Docker:
старый синтаксис клиента Docker:
который вернет только IP-адрес.
можно использовать docker inspect
сначала получите идентификатор контейнера:
(первый столбец для идентификатора контейнера)
используйте идентификатор контейнера для запуска:
внизу, в разделе «NetworkSettings», вы можете найти»IPAddress»
docker inspect CONTAINER_ID | grep «IPAddress»
чтобы получить все имена контейнеров и их IP-адреса всего за одну команду.
если вы используете docker-compose команда будет такая:
добавьте этот сценарий оболочки в свой
/.bashrc или соответствующие файл:
затем, чтобы получить IP-адрес контейнера, просто сделать это:
для новой версии Docker, пожалуйста, используйте следующее:
показать все IP-адреса контейнеров:
в Docker 1.3+ вы также можете проверить его с помощью следующих шагов:
введите Докер работает:
начиная с Docker версии 1.10.3, построить 20f81dd
Если вы не сказали докеру иначе, Докер всегда запускает ваши контейнеры в сети моста. Таким образом, вы можете попробовать эту команду ниже:
который затем должен вернуть раздел контейнеров, который отобразит IP-адрес для этого запущенного контейнера.
это отобразит активные изображения docker:
используйте значение идентификатора контейнера:
первая команда дает IP-адрес всех контейнеров, а вторая-IP-адрес конкретного контейнера.
контейнеры ссылки по имени:
затем возьмите IP-адрес по имени:
вы должны изменить сеть переменных на свое собственное сетевое имя.
Docker сделан внутренне в Go, и он также использует синтаксис Go для целей запроса.
для проверки IP-адреса конкретного контейнера необходимо выполнить команду (- F для опции форматирования)
вот решение, которое я разработал сегодня в Python, используя вывод JSON «docker inspect container» в качестве источника данных.
у меня есть много контейнеров и инфраструктур, которые я должен проверить, и мне нужно получить основную информацию о сети из любого контейнера, быстро и довольно порядке. Вот почему я написал этот сценарий.
важно: начиная с версии 1.9, Docker позволяет создавать несколько сетей и присоединять их к контейнер.
выход так же, как это:
вышеизложенное работает, если контейнер развернут в сети моста по умолчанию.
однако, если вы используете пользовательскую мостовую сеть или сеть наложения, я нашел ниже, чтобы работать лучше:
чтобы расширить ответ ko-dos, вот псевдоним для списка всех имен контейнеров и их IP-адресов:
Если вы установили Docker с помощью Docker Toolbox, вы можете использовать приложение Kitematic для получения IP-адреса контейнера:
внимание. для использования Docker Compose:
самый элегантный и простой способ-определить функцию оболочки как наиболее проголосовавший ответ @WouterD это:
Docker может записывать идентификаторы контейнеров в файл, такой как программы Linux:
использование PID-файла
вы можете использовать содержимое файла для проверки контейнеров Docker:
➜ blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
Извлечение Контейнера IP встроенный скрипт Python:
Более Дружественные Формы
здесь есть 10 альтернатив получения IP-адресов контейнера Docker.
Как получить IP-адрес Docker-контейнера
Главное меню » Linux » Как получить IP-адрес Docker-контейнера
Команда inspect дает вам много подробностей об исследуемом контейнере. Подойдите к концу и загляните в раздел Networks, чтобы получить IP-адрес контейнера.
Вы также можете использовать команду grep, чтобы получить только строки, соответствующие строке «IPAddress».
Не пугайтесь, если у вашего контейнера более одного IP-адреса. В этом нет ничего необычного. Чтобы понять это, вам нужно понять, как контейнеры взаимодействуют друг с другом.
Мы объясним вам это в следующем разделе, а затем расскажу о некоторых других методах получения IP-адреса работающего контейнера докеров.
Как сообщаются докер-контейнеры?
Docker – это инструмент для упаковки и доставки программного обеспечения в массы с использованием технологии контейнеризации. Программное обеспечение может иметь множество целей, от, возможно, простой обработки текста до полноценного веб-сервера, на котором размещаются ваши личные файлы. Каждое из этих программ разбивается на микросервисы, а затем упаковывается в контейнеры. В зависимости от назначения программного обеспечения одной службе может потребоваться взаимодействие с другой.
Например, рассмотрим WordPress. Есть две службы: одна – это веб-сервер, обслуживающий интерфейс, а другая – бэкэнд, база данных. Интерфейс должен взаимодействовать с базой данных, иначе он просто не будет работать.
Эта связь достигается за счет наличия по крайней мере двух сетевых интерфейсов, связанных с каждым из этих двух контейнеров, причем оба интерфейса подключены к одной и той же сети. Эта сеть называется «докер-сетью».
Сеть докеров
Думайте о сети докеров как о пуле доступных IP-адресов. Если два контейнера получат IP-адреса из одного пула, они смогут обмениваться данными друг с другом.
В основном есть два типа сетей: сети по умолчанию или предварительно определенные сети и сети, определяемые пользователем.
Вы можете получить список сетей, используя следующую команду
Рассмотрим мой список ниже:
Игнорируйте последние два и сосредоточьтесь на первой сети. bridgeСеть по умолчанию сеть каждый контейнер будет подключен к тому, если ничего не указано явно. Вы можете получить более подробную информацию об этой сети, выполнив команду docker network inspect bridge.
Мы собираемся отфильтровать вывод, поскольку для этой демонстрации мне не нужны все данные.
Если у вас не установлен jq, установите его с помощью диспетчера пакетов вашего дистрибутива.
У каждой из этих сетей докеров есть подсеть, в случае bridgeсети это подсеть 172.17.0.0/16. Это означает, что всего имеется 65 534 – 1 = 65 533 используемых хоста или IP-адреса. Мы вычитали один, так как для шлюза выделено 172.17.0.1. Вы также можете увидеть это, используя следующую команду
Проверка IP-адреса вашего док-контейнера
Есть несколько способов проверить IP-адрес [а], связанный с вашим контейнером, вот их список, включая примеры команд.
Метод 1: осматривая контейнер
В суб-команде inspect в docker чрезвычайно полезны. Контейнер можно проверить с помощью команды docker container inspect [CONTAINER ID]|[CONTAINER NAME].
Проверка контейнера означает получение как можно большего количества информации о контейнере, от портов, переменных среды до точек монтирования, данных контрольной группы и т. д. Из него можно извлечь IP-адрес.
Если вы запустите команду inspect в контейнере, вы получите кучу информации в формате JSON. Прокрутите вниз, пока не найдете ключ NetworkSettings, там найдите дополнительный ключ IPAddress. Это IP-адрес вашего контейнера.
Команда для выполнения выглядит следующим образом
Вот мой результат (усеченный)
Вместо того, чтобы прокручивать все это, вы можете отфильтровать вывод следующим образом:
Вот отфильтрованный вывод:
Если вы хотите получить IP-адрес, связанный с определенной сетью, используйте следующую команду:
метод 2: Использование оболочки контейнера
Это наиболее простой метод, но мы его не рекомендуем.
В этом методе вы присоединяете свой stdin|stdout к контейнеру и запускаете команду ip (или другую команду, которая показывает IP-адреса, связанные с сетевыми адаптерами).
Причина, по которой мы не рекомендуем это делать, заключается в том, что многие изображения довольно легкие и не содержат команды ip (или чего-то подобного).
Возьмите изображение ubuntu:20.04 в качестве примера, запустите контейнер, как показано ниже
Чтобы контейнер работал, мы использовали команду sleep 1d.
Теперь запустите процесс оболочки внутри контейнера и прикрепите свой stdin | stdout вот так
Попав в этот контейнер, попробуйте запустить ip или ifconfig. Вы увидите что-то вроде следующего:
Чтобы эти команды работали, вам необходимо установить соответствующие пакеты. Чтобы получить ipкоманду, установите пакет iproute2 и повторно запустите команду как ip a
Теперь вы можете увидеть, что IP-адрес, связанный с картой, eth0@if5- 172.17.0.2.
Обратите внимание на сеть, частью которой является этот контейнер. Поскольку мы не создавали и не подключали пользовательскую сеть к этому контейнеру, он был подключен к сети моста, поэтому сеть этого IP-адреса 172.17.0.0
Этот метод, безусловно, работает, хотя он более трудоемкий и не очень воспроизводимый, он интуитивно понятен. Следующие методы должны быть намного лучше по сравнению с этим.
Метод 3: проверив саму сеть
Всякий раз, когда контейнер подключается к сети, этот подключенный контейнер также виден из сети вместе с IP-адресом, назначенным этим контейнерам.
Поскольку наш контейнер подключен к сети моста, мы можем проверить сеть с помощью следующей команды
Здесь вместо идентификатора мы будем использовать имя, bridge
Вместо того, чтобы прокручивать вниз до раздела Containers jq, на этот раз мы воспользуемся фильтром вывода.
Чтобы продемонстрировать это, мы развернули еще один контейнер с таким именем ip. Вы можете увидеть контейнеры и IP-адреса в указанном выше объекте JSON. Теперь извлечь IP-адрес конкретного контейнера здесь немного сложнее.
Если вы знаете идентификатор контейнера, вы можете использовать jq это так
В большинстве случаев вы не можете вспомнить идентификатор контейнера, поэтому, если вы хотите получить IP-адрес только из имени контейнера, вам нужно знать jq (или просто повторно использовать следующую команду).
Поместите имя контейнера в функцию select и увидите, как происходит волшебство.
Какой метод вы предпочитаете? Вероятно, способ 1
Это были все методы, с помощью которых вы можете получить IP-адрес [а] контейнеров докеров. Второй метод, хотя и интуитивно понятен, не воспроизводится. В большинстве случаев это первый метод, который используется, поскольку он самый простой и выполняет свою работу.
Но может наступить время, когда вы захотите проверить, какие контейнеры подключены к определенной сети, и получить IP-адреса в этой сети. В этом случае имеет смысл проверить сеть и получить IP-адреса. Вы можете получить все имена контейнеров и назначенные им IP-адреса из сети, подобной этой
Перейдите bridge в другую сеть, и вы получите все контейнеры и их IP-адреса, как это.
На сегодня все. Надеюсь, эта статья была для вас полезной. Если у вас есть какие-либо вопросы, дайте мне знать в комментариях ниже.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
How to get the IP address of the docker host from inside a docker container
As the title says. I need to be able to retrieve the IP address the docker hosts and the portmaps from the host to the container, and doing that inside of the container.
26 Answers 26
As @MichaelNeale noticed, there is no sense to use this method in Dockerfile (except when we need this IP during build time only), because this IP will be hardcoded during build time.
As of version 18.03, you can use host.docker.internal as the host’s IP.
Works in Docker for Mac, Docker for Windows, and perhaps other platforms as well.
Note, as in the Mac and Windows documentation, this is for development purposes only.
For example, I have environment variables set on my host:
In my docker-compose.yml file, I have this:
Update: On Docker for Mac, as of version 18.03, you can use host.docker.internal as the host’s IP. See aljabear’s answer. For prior versions of Docker for Mac the following answer may still be useful:
On Docker for Mac the docker0 bridge does not exist, so other answers here may not work. All outgoing traffic however, is routed through your parent host, so as long as you try to connect to an IP it recognizes as itself (and the docker container doesn’t think is itself) you should be able to connect. For example if you run this from the parent machine run:
This should show you the IP of your Mac on its current network and your docker container should be able to connect to this address as well. This is of course a pain if this IP address ever changes, but you can add a custom loopback IP to your Mac that the container doesn’t think is itself by doing something like this on the parent machine:
You can then test the connection from within the docker container with telnet. In my case I wanted to connect to a remote xdebug server:
Now when traffic comes into your Mac addressed for 192.168.46.49 (and all the traffic leaving your container does go through your Mac) your Mac will assume that IP is itself. When you are finish using this IP, you can remove the loopback alias like this:
One thing to be careful about is that the docker container won’t send traffic to the parent host if it thinks the traffic’s destination is itself. So check the loopback interface inside the container if you have trouble:
In my case, this showed inet 127.0.0.1/8 which means I couldn’t use any IPs in the 127.* range. That’s why I used 192.168.* in the example above. Make sure the IP you use doesn’t conflict with something on your own network.
Как получить IP-адрес контейнера Docker от хоста?
Можно ли выполнить команду, чтобы получить IP-адрес контейнера прямо с хоста после создания нового контейнера?
По сути, когда Docker создает контейнер, я хочу развернуть сценарии развертывания собственного кода и конфигурации контейнера.
Синтаксис современного Docker-клиента:
Синтаксис старого Docker-клиента:
Который вернет только IP-адрес.
Как упоминалось в комментариях: если вы используете Windows, используйте двойные кавычки » вместо одинарных кавычек ‘ вокруг фигурных скобок.
Вы можете использовать docker inspect
Сначала получите идентификатор контейнера:
(Первый столбец для идентификатора контейнера)
Используйте идентификатор контейнера для запуска:
Внизу, под «NetworkSettings», вы можете найти «IP-адрес»
Или просто сделайте:
docker inspect CONTAINER_ID | grep «IPAddress»
Чтобы получить все имена контейнеров и их IP-адреса всего за одну команду.
Добавьте этот сценарий Shell в свой
/.bashrc или соответствующий файл:
Затем, чтобы получить IP-адрес контейнера, просто сделайте это:
Для новой версии Docker, пожалуйста, используйте следующее:
Показать все контейнеры IP-адреса:
В Docker 1.3+ вы также можете проверить это, выполнив следующие действия:
Введите работающий Docker:
Начиная с версии Docker 1.10.3, сборка 20f81dd
Если вы не сказали Docker иначе, Docker всегда запускает ваши контейнеры в сети моста. Таким образом, вы можете попробовать эту команду ниже:
Который должен затем вернуть раздел «Контейнеры», в котором будет отображаться IP-адрес этого работающего контейнера.
Это отобразит активные изображения докера:
Используйте значение идентификатора CONTAINER:
Справочные контейнеры по имени:
Затем захватите IP-адрес по имени:
Docker встроен в Go и использует синтаксис Go также для запросов.
Вы должны изменить переменную сеть на свое собственное имя сети.
Вот решение, которое я разработал сегодня в Python, используя вывод JSON «docker inspect container» в качестве источника данных.
У меня есть много контейнеров и инфраструктур, которые я должен осмотреть, и мне нужно получить основную информацию о сети из любого контейнера, быстрым и довольно способом. Вот почему я сделал этот сценарий.
ВАЖНО: Начиная с версии 1.9, Docker позволяет создавать несколько сетей и присоединять их к контейнерам.
вывод такой же:
Вышеуказанное работает, если контейнер развернут в мостовой сети по умолчанию.
Однако, если вы используете настраиваемую мостовую сеть или оверлейную сеть, я обнаружил, что приведенное ниже работает лучше:
Быстрый ответ (это работает):
Получите ваше имя контейнера или ID:
Тогда сделайте это (получите IP):
Получить порт:
Чтобы расширить ответ ko-dos, вот псевдоним для перечисления всех имен контейнеров и их IP-адресов:
Если вы установили Docker с помощью Docker Toolbox, вы можете использовать приложение Kitematic для получения IP-адреса контейнера:
Чтобы получить IP-адрес и порт хоста контейнера:
Docker может записывать идентификаторы контейнеров в файл, такой как программы Linux:
Использование файла PID
Вы можете использовать содержимое файла для проверки контейнеров Docker:
➜ blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
Извлечение встроенного сценария IP контейнера Python:
Более дружественная к человеку форма
Здесь есть 10 вариантов получения IP-адресов контейнера Docker.
Просто для полноты:
Мне действительно нравится опция — format, но сначала я не знал об этой опции, поэтому я использовал простую однострочную строку Python, чтобы получить тот же результат:
Объединение предыдущих ответов с поиском идентификатора контейнера на основе имени образа Docker.
Если вы забыли идентификатор контейнера или не хотите манипулировать с помощью команд оболочки, лучше использовать пользовательский интерфейс, например Portainer.
Там вы можете найти всю информацию о контейнере, а также IP.
Для контейнеры Windows использовать
Это перечислит все IP-адреса контейнеров на хосте:
Для тех, кто пришел из Google, чтобы найти решение для выполнения команд из терминала (не по сценарию), jid (интерактивная утилита детализации JSON с автозаполнением и предложением) позволяет добиться того же с меньшим набором текста.
Docker проверяет использование для печати всех контейнеров ips и соответствующих им имен
Во всяком случае, я нашел это работать хорошо:
Мне пришлось извлечь IP-адрес Docker-контейнера по имени Docker-контейнера для дальнейшего использования в сценариях развертывания. Для этого я написал следующую команду bash:
Наряду с принятым ответом, если вам нужен определенный удобный псевдоним, чтобы получить конкретный контейнер, используйте этот псевдоним.
и тогда вы можете получить свой IP-контейнер с
Вы также можете использовать containerid вместо containername
КСТАТИ принял отличный ответ, чтобы получить чистый вывод, поэтому я отредактировал его и использовал вот так;
EDIT: Обновлено до Python 3.7 согласно комментариям.
Никто еще не предлагал API Docker Python. Решение Docker API для получения IP-адреса довольно простое.
Не было слишком сложно найти, но полезно. кроме того, это можно легко изменить, чтобы найти все IP-адреса, назначенные контейнеру в различных сетях.
Принятый ответ не работает с несколькими сетями на контейнер:
Следующий лучший ответ ближе:
Мне нравится использовать jq для анализа сети JSON:
Чтобы перечислить IP-адреса каждого контейнера, тогда становится:
вы также можете просто создать псевдоним, если хотите так:
Выше для контейнеров Windows, где сеть была настроена с
Попробуйте в Windows PowerShell:
Принятый ответ точно описывает, что набирать достаточно хорошо, но есть небольшое улучшение:
Для тех, кто хочет знать, как они могут искать другие значения, я часто использую следующее для вывода любого синтаксиса в формате докера в json:
По сути, когда Docker создает контейнер, я хочу развернуть сценарии развертывания собственного кода и конфигурации контейнера.
Основная причина моего ответа в том, что у этого комментария огромный красный флаг. Это указывает на то, что ваши изображения не содержат всего необходимого для запуска вашего приложения, что является серьезным препятствием при работе с контейнерами. С дюжиной клиентов за многие годы мне еще не удалось найти реальный вариант использования для прямого подключения к контейнеру по его внутреннему IP-адресу с хоста докера, у которого не было лучшего варианта. Вместо этого, если в вашем контейнере есть конфигурация после запуска, которую необходимо запустить, это часто делается с помощью сценария точки входа.
Существует также красный флаг, что вы обходите сетевую модель докера. В Docker Networking есть два варианта. Во-первых, при обмене данными между контейнерами это делается с помощью сети, созданной пользователем, и с использованием встроенного DNS докера для подключения к контейнеру по имени или сетевому псевдониму, а не по IP-адресу, который изменится при повторном создании контейнера. А для связи извне докера с контейнером это делается путем публикации порта от хоста докера к контейнеру и последующего подключения к хосту на этом порту, а не к контейнеру напрямую. Если вы будете придерживаться этих двух вариантов, вы сможете получить доступ к своему приложению, даже не зная его внутреннего IP-адреса.
Docker provides the ability to package and run an application in a loosely isolated environment called a container.
I know what you might be thinking – come on, not another post explaining what Docker is, it’s everywhere these days!
But don’t worry, we are skipping that basic introduction. The target audience for this article should already have a basic understanding of what Docker and Containers are.
But have you ever wondered how to get a Docker Container IP Address?
Docker network explained
First, let’s understand how the Docker network works. For that we are going to focus on the default bridge network. When you are using Docker, if you don’t specify a driver this is the type of network you are using.

The bridge network works as a private network internal to the host so containers on it can communicate. External access is granted by exposing ports to containers.
Bridge networks are used when your applications run in standalone containers that need to communicate.
If you’ve never added a network in Docker you should see something similar to this:
Docker Container IP Address
By default, the container is assigned an IP address for every Docker network it connects to. And each network is created with a default subnet mask, using it as a pool later on to give away the IP addresses.
Usually Docker uses the default 172.17. 0.0/16 subnet for container networking.
Now to better understand it, we will execute a real use case.
Docker Example
To illustrate this, we will use a Hive and Hadoop environment, containing 5 Docker Containers.
Check out the docker-compose.yml file we are about to execute:
No one wants to read a HUGE config file, right? So here’s a picture:
Much better! Now let’s start up those containers:
We can see 5 containers:
Next let’s check our Docker networks:
By default docker compose sets up a single network for your app. And your app’s network is given a name based on the “project name”, originated from the name of the directory it lives in.
Next some examples on how to get the Docker IP Address.
And now that I have your attention, we are going to unveil the mystery.
1. Using Docker Inspect
Docker inspect is a great way to retrieve low-level information on Docker objects. You can pick out any field from the returned JSON in a fairly straightforward manner.
Didn’t you say that Docker uses the default 172.17. 0.0/16 subnet for container networking? Why is the returned IP Address: 172.18.0.5 outside it?

To answer that we have to look at our network settings:
We executed this example in a Compute Engine VM, and in this test, the docker network was assigned a different subnet: 172.18.0.0/16. That explains it!
Furthermore, we can also lookup all IP Addresses inside the docker-hive_default network.
So we don’t need to look up each Container’s IP individually:
If you didn’t notice, we used jq help to parse the Containers map object.
2. Using Docker exec
3. Inside the Docker Container
We can even find other containers’ IP Addresses that are inside a container in the same network:
Data node
Hive mestastore
Hive server
Wrap up
All examples were executed in a linux distribution Compute Engine VM. If you execute them in macOS or Windows environments the sample commands might change a bit.
Also bear in mind that those IP Addresses in the examples given are internal to the sample docker-hive_default network. So if you have a use case to connect to those containers externally, you would need to use the host machine’s external IP (assuming that you are exposing the containers ports correctly).
* Illustrations from icons8.com by Murat Kalkavan.
?☁️ Senior Software Engineer | ♥️ Open Source | 5x GCP certified | DevOps | Data Engineer | Cloud Architect | CI&T
If you read this far, tweet to the author to show them you care. Tweet a thanks
Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started
freeCodeCamp is a donor-supported tax-exempt 501(c)(3) nonprofit organization (United States Federal Tax Identification Number: 82-0779546)
Donations to freeCodeCamp go toward our education initiatives and help pay for servers, services, and staff.












