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



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



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

772   30  

30 ответов:

The --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 inspect <container id>

пример:

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

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

docker ps

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

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

docker inspect <container ID>

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

или просто:

docker inspect <container id> | grep "IPAddress"

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-ip() {
        docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

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

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

в 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

начиная с версии 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 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  }' | head -n 1 | cut -d "," -f1

"172.17.0.2"

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

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 run ... --name pg-master

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

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

Я написал следующий скрипт 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 выполнен внутренне в Go, и он также использует синтаксис Go для целей запроса.

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

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

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

вот решение, которое я разработал сегодня в 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 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 }'

чтобы расширить ответ 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 Toolbox, вы можете использовать приложение Kitematic для получения IP-адреса контейнера:

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

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

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


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

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

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

работает с , 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.

для windows 10:

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

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

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

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

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

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

выход:

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

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

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

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

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"

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

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

на контейнеров Windows использовать

docker exec <container> ipconfig

здесь <container> это имя или id контейнера.

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

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

проверка не сработала для меня. Может быть, как я использовал -net host и некоторые пространства имен.

в любом случае, я нашел, что это хорошо работает:

docker exec -i -t NAME /sbin/ifconfig docker0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print }'

мне пришлось извлечь IP-адрес контейнера docker по имени контейнера docker для дальнейшего использования в сценариях развертывания. Для этого я написал следующую команду bash:

docker inspect $(sudo docker ps | grep my_container_name | head -c 12) | grep -e \"IPAddress\"\:[[:space:]]\"[0-2] | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

предположим, что было бы удобно поместить его в скрипт bash, который ожидал бы my_container_name в качестве аргумента...

docker inspect <container id> | grep -i ip

например:

docker inspect 2b0c4b617a8c | grep -i ip

Comments

    Ничего не найдено.