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

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

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

Ответ 1

--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-адрес.

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

Ответ 2

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

Пример:

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

Ответ 3

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

docker ps

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

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

docker inspect <container ID>

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

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

docker inspect <container id> | grep "IPAddress"

Ответ 4

docker inspect CONTAINER_ID | grep "IPAddress"

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

docker inspect CONTAINER_ID | grep -i "IPADDress"

Ответ 5

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

Ответ 6

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

docker-ip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "[email protected]"
}

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

docker-ip YOUR_CONTAINER_ID

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

docker-ip() {
        docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "[email protected]"
}

Ответ 7

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

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

Ответ 8

В 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

Ответ 9

В версии Docker версии 1.10.3, build 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"
        }
    }
]

Ответ 10

Execute:

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

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

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

"172.17.0.2"

Ответ 11

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

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

docker-ips
docker-ip YOUR_CONTAINER_ID

Ответ 12

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

docker run ... --name pg-master

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

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

Ответ 13

Я написал следующий Bash script, чтобы получить таблицу 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 }}" "[email protected]"
}

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
}

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

Ответ 14

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

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

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

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

Ответ 15

Вот решение, которое я разработал сегодня на Python, используя в качестве источника данных вывод 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

Ответ 16

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

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

docker container ls

Тогда сделайте это (получите IP):

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

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

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

Ответ 17

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}'

Ответ 18

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

Ответ 19

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

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

Ответ 20

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

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

Выход:

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

Ответ 21

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

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


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

dockip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "[email protected]"
}

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

Запуск с параметром --cidfile=filename, Docker сбрасывает идентификатор контейнера в этот файл.

Докер запускает секцию PID-эквивалента

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

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

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

a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909

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

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

  2. Извлечение встроенного IP-контейнера Python script:

    $ 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.

Ответ 22

Для окон 10:

docker inspect --format "{{ .NetworkSettings.IPAddress }}"  containerId

Ответ 23

Только для полноты:

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

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

Ответ 24

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

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

Ответ 25

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

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

Ответ 26

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

docker inspect $CID | jid

Введите tab.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 tab, и вы увидите следующее:

[Filter]> .[0].NetworkSettings.IPAddress
"172.17.0.2"

Ответ 27

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

docker exec <container> ipconfig

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

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

Ответ 28

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

Ответ 29

В этом списке перечислены все IP-адреса контейнера на хосте:

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

Ответ 30

Никто еще не предложил Docker Python API. Решение Docker API для получения IP-адреса довольно простое.

* ОС на базе NIX: docker api 3.7 (обновлено благодаря canadadry из комментариев)

import docker

client = docker.DockerClient(base_url='unix://var/run/docker.sock')
x_container = client.containers(filters={"name":"x_container"})[0]
x_ip_addr = x_container["NetworkSettings"]["Networks"]["NETWORK_NAME"]["IPAddress"]

ОС Agnostic: docker api 4.0.x (добавлено благодаря pds из комментариев)

import docker

client = docker.from_env()
container = client.containers.get(container_name)
vars( container )["attrs"]["NetworkSettings"]["Networks"]["<NETWORK_NAME>"]["IPAddress"]

Не было слишком сложно найти, но полезно. Кроме того, это можно легко изменить, чтобы найти все IP, назначенные контейнеру в различных сетях.