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

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

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

56 ответов

Решение

--format Вариант осмотра приходит на помощь.

Синтаксис современного 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 ps

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

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

docker inspect <container ID>

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

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

docker inspect <container id> | grep "IPAddress"

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

Пример:

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

docker inspect CONTAINER_ID | grep "IPAddress"

Чтобы получить все имена контейнеров и их 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

Добавьте этот скрипт в ваш ~/.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}}' "$@"
}

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

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

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

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

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

Начиная с версии 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"
        }
    }
]

Мой ответ:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq
) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n

Также как псевдоним bash:

docker-ips() {   docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n }

Вывод отсортирован по IP-адресу и разделен табуляцией:

# docker-ips
172.18.0.2       memcached
172.18.0.3       nginx
172.18.0.4       fpm-backup
172.18.0.5       dns
172.18.0.6       fpm-beta
172.18.0.7       exim
172.18.0.8       fpm-delta
172.18.0.9       mariadb
172.18.0.10      fpm-alpha
172.19.0.2       nextcloud-redis
172.19.0.3       nextcloud-db
172.19.0.4       nextcloud

Выполнение:

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"

Основываясь на некоторых ответах, которые мне понравились, я решил объединить их с функцией для получения всех 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

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

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

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

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

Быстрый ответ (это работает):

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

sudo docker container ls

Затем сделать его:

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

Я написал следующий скрипт 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
}

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

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

docker run ... --name pg-master

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

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

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

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

ВАЖНО: начиная с версии 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

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

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

например

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

НОТА!!! для 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

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

    ➜ blog-v4 git:(develop) ✗ docker inspect `cat app.cid`

  2. Извлечение контейнера 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'])

http://networkstatic.net/10-examples-of-how-to-get-docker-container-ip-address/

Здесь есть 10 вариантов получения IP-адресов контейнера Docker.

Для тех, кто пришел из Google, чтобы найти решение для выполнения команд из терминала (не по сценарию), jid (интерактивная утилита JSON с функцией автозаполнения и предложением) позволит вам добиться того же с меньшим набором текста.

docker inspect $CID | jid

Введите вкладку.Net tab, и вы увидите следующее:

[Filter]> .[0].NetworkSettings
{
  "Bridge": "",
  "EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5",
  "Gateway": "172.17.0.1",
  "GlobalIPv6Address": "",
  "GlobalIPv6PrefixLen": 0,
  "HairpinMode": false,
  "IPAddress": "172.17.0.2",
  "IPPrefixLen": 16,
  "IPv6Gateway": "",
  "LinkLocalIPv6Address": "",
  "LinkLocalIPv6PrefixLen": 0,
  "MacAddress": "02:42:ac:11:00:02",
  "Networks": {
    "bridge": {
      "Aliases": null,
      "EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5",
      "Gateway": "172.17.0.1",
      "GlobalIPv6Address": "",

Введите вкладку.IPA, и вы увидите следующее:

[Filter]> .[0].NetworkSettings.IPAddress
"172.17.0.2"
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}'

Чтобы расширить ответ 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'

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

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

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

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

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

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

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

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

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

Выход:

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

Принятый ответ не работает с несколькими сетями на контейнер:

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

172.20.0.4172.18.0.5

Следующий лучший ответ ближе:

> docker inspect cc54d96d63ea | grep "IPAddress"

"SecondaryIPAddresses": null,
"IPAddress": "",
    "IPAddress": "172.20.0.4",
    "IPAddress": "172.18.0.5",

Я люблю использовать jq для разбора сети JSON:

> docker inspect cc54d96d63ea | jq -r 'map(.NetworkSettings.Networks) []'

{
  "proxy": {
    "IPAMConfig": null,
    "Links": [
      "server1_php_1:php",
      "server1_php_1:php_1",
      "server1_php_1:server1_php_1"
    ],
    "Aliases": [
      "cc54d96d63ea",
      "web"
    ],
    "NetworkID": "7779959d7383e9cef09c970c38c24a1a6ff44695178d314e3cb646bfa30d9935",
    "EndpointID": "4ac2c26113bf10715048579dd77304008904186d9679cdbc8fcea65eee0bf13b",
    "Gateway": "172.20.0.1",
    "IPAddress": "172.20.0.4",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:14:00:04",
    "DriverOpts": null
  },
  "webservers": {
    "IPAMConfig": null,
    "Links": [
      "server1_php_1:php",
      "server1_php_1:php_1",
      "server1_php_1:server1_php_1"
    ],
    "Aliases": [
      "cc54d96d63ea",
      "web"
    ],
    "NetworkID": "907a7fba8816cd0ad89b7f5603bbc91122a2dd99902b504be6af16427c11a0a6",
    "EndpointID": "7febabe380d040b96b4e795417ba0954a103ac3fd37e9f6110189d9de92fbdae",
    "Gateway": "172.18.0.1",
    "IPAddress": "172.18.0.5",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:12:00:05",
    "DriverOpts": null
  }
}

Чтобы перечислить IP-адреса каждого контейнера, тогда становится:

for s in `docker ps -q`; do
  echo `docker inspect -f "{{.Name}}" ${s}`:
  docker inspect ${s} | jq -r 'map(.NetworkSettings.Networks) []' | grep "IPAddress";
done

/server1_web_1:
    "IPAddress": "172.20.0.4",
    "IPAddress": "172.18.0.5",
/server1_php_1:
    "IPAddress": "172.20.0.3",
    "IPAddress": "172.18.0.4",
/docker-gen:
    "IPAddress": "172.18.0.3",
/nginx-proxy:
    "IPAddress": "172.20.0.2",
    "IPAddress": "172.18.0.2",

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

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

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

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

Linux-контейнер

  1.         docker exec postgres ifconfig
    

  1.         docker exec postgres cat /etc/hosts
    

  1. docker exec postgres ip a

  1. С PowerShell

    докер проверяет postgres | select-string 'ipaddress'

Другие вопросы по тегам