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


1412

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

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


28
Я просто хотел убедиться, что другие нубы не делают мою ошибку, и попытаться получить IP из образа вместо контейнера. Убедитесь, что вы получили CID или идентификатор контейнера и запросили это; CID через 'docker ps', то есть.
Пол Грегуар

Как получить наоборот? IP хоста или звонок из контейнера?
Сомнат Мулук

Ответы:


2333

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

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

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

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

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

Эти команды вернут IP-адрес контейнера Docker.

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


34
Это гораздо, гораздо лучшее решение. Только спросите, что вам нужно, если это возможно!
MikeyB

8
Хм. Получение <no value>ответа на Mac с помощью Fig / Boot2Docker
cevaris

2
@cevaris Вы получите, <no value>если попытаетесь запустить это для контейнера, который не запущен. Убедитесь, что ваш контейнер работает, прежде чем сделать это.
TheJediCowboy

55
!ПРЕДУПРЕЖДЕНИЕ! Это больше не работает. Новый формат специфичен для контейнера и следует за формой {{ .NetworkSettings.Networks.$network.IPAddress }}. По умолчанию используется значение bridge, но в docker-compose это будет конкретное имя, которое зависит от имени вашего приложения (я думаю, из флага --project-name, хотя это также будет зависеть от того, какой тип конфигурации сети). вы настроили). Я написал полный ответ в ответе здесь stackoverflow.com/questions/17157721/…
Dunk

5
Может быть, я сонная овца, но предупреждение о двойных кавычках было недостаточно смелым и моргающим, чтобы привлечь мое внимание. Возможно, приведу два примера с четким обозначением Linux и Windows. Я буквально просто набрал пример, проверил документы, которые также используют одинарные кавычки, а затем погуглил ошибку. Я уверен, что я не одинок.
Wyck

513

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

Например:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID

67
Для того, чтобы извлечь ip, вы можете сделать что-то вроде docker inspect $CID | grep IPAddress | cut -d '"' -f 4, он отлично работает :)
creack

9
Собрав все вместе, этот псевдоним оболочки должен перечислить все идентификаторы контейнеров и их ips:alias dockerip='docker ps | tail -n +2 | while read cid b; do echo -n "$cid\t"; docker inspect $cid | grep IPAddress | cut -d \" -f 4; done'
ko-dos

64
Как упомянуто @ user3119830, есть новая опция для проверки. Теперь вы можете легче получить Ipdocker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
creack

16
Просто записка. Параметры одиночной тире устарели, поэтому -format станет --format.
jamtur01

7
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}это новый синтаксис. -formatустарела, становится --format.
Деви

408

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

docker ps

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

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

docker inspect <container ID>

Внизу, под «NetworkSettings», вы можете найти «IP-адрес»

Или просто сделайте:

docker inspect <container id> | grep "IPAddress"

5
Жаль, что в одном из моих примеров (с начала docker run -it MYCONTAINER /bin/bash) вывод inspectне имеет раздела NetworkSettings!
Эрик

3
Это не работает в Windows 10. Вам также нужно узнать IP-адрес DockerNAT с помощью ipconfig.
17

@Eric Вы также можете проверить сетевой мост для этого:docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
Томаш Каплоньски

5
Я предпочитаю ... | grep IPрешение для всех деталей форматирования, необходимых для получения IP. +1
d8aninja

1
@Eric - вы перепутали контейнер с изображением . Команда на самом деле docker run -it MYIMAGE(это не имя контейнера ); если вы это сделаете, docker inspect MYIMAGEвы получите статическую информацию об изображении . Вам нужно найти имя работающего контейнера (или использовать его идентификатор, как предлагают другие). В моей системе первый такой контейнер, созданный из этого образа, по умолчанию имеет имя MYIMAGE_1, docker inspect MYIMAGE_1как и NetworkSettings.
ToolmakerSteve

216
docker inspect CONTAINER_ID | grep "IPAddress"

Вы можете добавить -iв grep игнорирование регистра, тогда сработает даже следующее:

docker inspect CONTAINER_ID | grep -i "IPaDDreSS"

5
Чем этот ответ лучше / отличается от других 22?
SdS

Это определенно не лучший ответ. Ответ WouterD - это ответ, который вы ищете.
М.Вандерли

7
@ M.Vanderlee этот ответ имеет команду, которую легче запомнить, что делает его лучшим ответом IMO.
huysentruitw

1
@WouterHuysentruit Конечно, но вы получаете несколько записей и фактический текст "IP-адрес". Вы не можете использовать его в сценарии без дальнейших манипуляций.
М.Вандерли

Вы правы. В контексте вопроса другой ответ подходит лучше.
huysentruitw

133

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

docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

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

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

Выход будет:

/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2

5
Мне очень нравится это, но это не работает и для Docker Compose, что связано с наличием собственной сети. Вместо этого поменяйте {{.NetworkSettings.IPAddress }}на{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
clockworkgeek

Вот использование вариации I: docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'. В sed(1)удаляет пустые строки для контейнеров присутствует, но не имеющие IP-адрес.
NYCeyes

97

Добавьте этот скрипт в ваш ~/.bashrcили соответствующий файл:

docker-ip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

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

docker-ip YOUR_CONTAINER_ID

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

docker-ip() {
        docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

5
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
Сайянкодер

это работает для меня, но нужноsource ~/.bash_profile
пенни чан

1
Вы получите эту ошибку, если вы не проверяете работающий контейнер, а просто изображение ... у изображения нет
IP-

37

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

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

37

В Docker 1.3+ вы также можете проверить это, используя:

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

docker exec [container-id or container-name] cat /etc/hosts
172.17.0.26 d8bc98fa4088
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.17 mysql

Для окон:

docker exec [container-id or container-name] ipconfig

1
или простоdocker exec [container-name-or-id] ip a
Стефан Рихтер

для оконdocker exec [container-id or container-name] ipconfig
GreatAndPowerfulOz

27

Начиная с версии Docker 1.10.3, сборка 20f81dd

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

docker network inspect bridge

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

[
    {
        "Name": "bridge",
        "Id": "40561e7d29a08b2eb81fe7b02736f44da6c0daae54ca3486f75bfa81c83507a0",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {
            "025d191991083e21761eb5a56729f61d7c5612a520269e548d0136e084ecd32a": {
                "Name": "drunk_leavitt",
                "EndpointID": "9f6f630a1743bd9184f30b37795590f13d87299fe39c8969294c8a353a8c97b3",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        }
    }
]

что это означает, если ваш раздел контейнеров пуст? Тем не менее контейнер работает.
StackEdd

24

Выполнение:

docker ps -a

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

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
3b733ae18c1c        parzee/database     "/usr/lib/postgresql/"   6 minutes ago       Up 6 minutes                 5432/tcp            serene_babbage

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

docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1

"172.17.0.2"


23

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

docker-ips() {
    docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}

docker-ip() {
  docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

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

docker-ips
docker-ip YOUR_CONTAINER_ID

16

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

docker run ... --name pg-master

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

MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)

15

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

function docker_container_names() {
    docker ps -a --format "{{.Names}}" | xargs
}

# Get the IP address of a particular container
dip() {
    local network
    network='YOUR-NETWORK-HERE'
    docker inspect --format "{{ .NetworkSettings.Networks.$network.IPAddress }}" "$@"
}

dipall() {
    for container_name in $(docker_container_names);
    do
        local container_ip=$(dip $container_name)
        if [[ -n "$container_ip" ]]; then
            echo $(dip $container_name) " $container_name"
        fi
    done | sort -t . -k 3,3n -k 4,4n
}

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


1
Tuong Le ответ отсюда stackoverflow.com/questions/17157721/… избегает необходимости указывать сеть в dip (): docker inspect --format '{{range .NetworkSettings.Networks}} {{. IPAddress}} {{end} } '"$ @"
JoanComasFdz

1
@JoanComasFdz Вы спасли меня большое спасибо!
Chagai Friedlander

14

Вот быстрый рабочий ответ:

Получите ваше имя контейнера или ID:

docker container ls

Тогда получите IP:

docker inspect <container_ID Or container_name> |grep 'IPAddress'

Получить порт:

docker inspect <container_ID Or container_name> |grep 'Port'

13

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

Чтобы проверить IP-адрес определенного контейнера, вам нужно выполнить команду ( -fдля «format»):

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

Для идентификатора или имени контейнера вы можете выполнить команду

docker container ls

который будет перечислять каждый запущенный контейнер.


1
Это очень полезно. Где я могу найти документацию для написания собственных запросов Go?
Майкл Хоффманн

12

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

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

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

#!/usr/bin/python

import json
import subprocess
import sys

try:
    CONTAINER = sys.argv[1]
except Exception as e:
    print "\n\tSpecify the container name, please."
    print "\t\tEx.:  script.py my_container\n"
    sys.exit(1)

# Inspecting container via Subprocess
proc = subprocess.Popen(["docker","inspect",CONTAINER],
                      stdout=subprocess.PIPE,
                      stderr=subprocess.STDOUT)

out = proc.stdout.read()
json_data = json.loads(out)[0]

net_dict = {}
for network in json_data["NetworkSettings"]["Networks"].keys():
    net_dict['mac_addr']  = json_data["NetworkSettings"]["Networks"][network]["MacAddress"]
    net_dict['ipv4_addr'] = json_data["NetworkSettings"]["Networks"][network]["IPAddress"]
    net_dict['ipv4_net']  = json_data["NetworkSettings"]["Networks"][network]["IPPrefixLen"]
    net_dict['ipv4_gtw']  = json_data["NetworkSettings"]["Networks"][network]["Gateway"]
    net_dict['ipv6_addr'] = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6Address"]
    net_dict['ipv6_net']  = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6PrefixLen"]
    net_dict['ipv6_gtw']  = json_data["NetworkSettings"]["Networks"][network]["IPv6Gateway"]
    for item in net_dict:
        if net_dict[item] == "" or net_dict[item] == 0:
            net_dict[item] = "null"
    print "\n[%s]" % network
    print "\n{}{:>13} {:>14}".format(net_dict['mac_addr'],"IP/NETWORK","GATEWAY")
    print "--------------------------------------------"
    print "IPv4 settings:{:>16}/{:<5}  {}".format(net_dict['ipv4_addr'],net_dict['ipv4_net'],net_dict['ipv4_gtw'])
    print "IPv6 settings:{:>16}/{:<5}  {}".format(net_dict['ipv6_addr'],net_dict['ipv6_net'],net_dict['ipv6_gtw'])

Выход:

$ python docker_netinfo.py debian1

[frontend]

02:42:ac:12:00:02   IP/NETWORK        GATEWAY
--------------------------------------------
IPv4 settings:      172.18.0.2/16     172.18.0.1
IPv6 settings:            null/null   null

[backend]

02:42:ac:13:00:02   IP/NETWORK        GATEWAY
--------------------------------------------
IPv4 settings:      172.19.0.2/16     172.19.0.1
IPv6 settings:            null/null   null

Пожалуйста, измените на python2.7 в скрипте, python3 сейчас широко используется или напишите две версии
42n4

Я обновлю свой Gist и, как только он у меня будет, я выложу здесь. Действительно, эта обертка была разработана для Python 2.7. Спасибо за ответ!
17

9
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>

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

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

docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

9

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

alias docker-ips='docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect $name | grep IPAddress | cut -d \" -f 4; done'

1
Это можно немного упростить - используйте, docker ps -qчтобы избежать tailи --formatизбежать grep. Также вы можете передавать несколько идентификаторов контейнеров, docker inspectа не зацикливаться в оболочке.
Брайан

1
docker ps -qотображает только числовые идентификаторы контейнеров, но я думаю, что лучше использовать их имя. tailтолько для того, чтобы избавиться от первой строки (заголовок таблицы) и по-прежнему необходимо. Я мог бы использовать --format, хотя: docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect --format="{{.NetworkSettings.IPAddress}}" $name | cut -d \" -f 4; done. Но это не кажется большим улучшением ... grepбыло более читабельным ИМО.
Марко Рой

1
Слегка измененная версия, в которой сначала перечисляются IP-адреса в одну строку вместе с именем контейнера: docker ps | tail -n +2 | пока читаешь -аа; do name = $ {a [$ (($ {# a [@]} - 1))]}; докер проверяет $ name | grep "IP-адрес. * [0-9] \ +" | cut -d \ "-f 4 | tr" \ n "" "; echo -e" \ t $ {name} "; сделано
Галаад

Закончилось:docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
антогервой

9

Я использую этот простой способ

docker exec -it <container id or name> hostname -i

например

ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5

7

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

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

Для меня IP-адрес был на вкладке «Имя хоста / порты», но это был, тем не менее, очень полезный ответ! Обратите внимание, что docker inspectне работает, когда вы запускаете панель инструментов Docker. Он сообщит IP-адрес, но это не тот адрес, который будут использовать ваши службы.
Йоран Розен

7

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

docker inspect containerId | awk '/IPAddress/ || /HostPort/'

Вывод:

    "HostPort": "4200"
                    "HostPort": "4200"
        "SecondaryIPAddresses": null,
        "IPAddress": "172.17.0.2",
                "IPAddress": "172.17.0.2",

7

НОТА!!! для Docker Compose Использование:

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


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

dockip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

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

Работая с --cidfile=filename, Docker выводит идентификатор контейнера в «имя файла».

См. « Docker запускает PID-эквивалентный раздел » для получения дополнительной информации.

--cidfile="app.cid": Write the container ID to the file

Использование файла PID:

  1. Запуск контейнера с --cidfileпараметром, app.cidсодержимое файла выглядит так:

    a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
    
  2. Вы можете использовать содержимое файла для проверки контейнеров Docker:

    blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
    
  3. Вы можете извлечь IP контейнера, используя встроенный скрипт Python:

    $ docker inspect `cat app.cid` | python -c "import json;import sys;\
    sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])"
    172.17.0.2
    

Вот более дружелюбная для человека форма:

#!/usr/bin/env python
# Coding: utf-8
# Save this file like get-docker-ip.py in a folder that in $PATH
# Run it with
# $ docker inspect <CONTAINER ID> | get-docker-ip.py

import json
import sys

sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])

См. « 10 альтернатив получения IP-адресов контейнера Docker » для получения дополнительной информации.



5

Это перечислит все IP-адреса контейнера на хосте:

sudo docker ps -aq | while read line;  do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done

5

Docker проверяет использование для печати всех контейнеров ips и соответствующих им имен

docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'

5

Просто для полноты:

Мне действительно нравится этот --formatвариант, но сначала я не знал об этом, поэтому я использовал простой однострочный Python для получения того же результата:

docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'

Это самый крутой ответ. Также смотрите другой ответ - stackoverflow.com/a/36306632/432903
praagagupd

5

Объединение предыдущих ответов с поиском идентификатора контейнера на основе имени образа Docker:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`

4

Использование:

docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1

Это настоящая однострочная команда. Вот что я получил. $ docker inspect c4591485328d | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1 172.17.0.2
Джаянт Бхавал

4

Для контейнеров Windows используйте

docker exec <container> ipconfig

где <container>это имя или идентификатор контейнера.

Вы можете использовать, docker psчтобы найти идентификатор контейнера.


Не забывайте использовать «-rm», иначе он будет медленно занимать место на жестком диске с неосуществленными слоями. Хорошо сочетать «-rm» с «run» почти во всех случаях.
контанго

@Contango: «docker exec» выполняет команду в уже запущенном контейнере. У него нет ключа --rm. docs.docker.com/engine/reference/commandline/exec
kirodge

4

Если вы забыли идентификатор контейнера или не хотите манипулировать командами оболочки, лучше использовать пользовательский интерфейс, например Portainer.

https://portainer.io/

$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Там вы можете найти всю информацию о контейнере, а также IP.


4
Хотя эта ссылка может ответить на вопрос, ответы только на ссылки не рекомендуются при переполнении стека, вы можете улучшить этот ответ, взяв жизненно важные части ссылки и вставив его в свой ответ, это гарантирует, что ваш ответ все еще остается ответом, если ссылка будет изменена или удалено :)
WhatsThePoint
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.