Как получить IP-адрес контейнера Docker от хоста?
есть ли команда, которую я могу запустить, чтобы получить IP-адрес контейнера прямо с хоста после создания нового контейнера?
в принципе, как только Docker создаст контейнер, я хочу свернуть свои собственные сценарии развертывания кода и конфигурации контейнера.
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"
чтобы получить все имена контейнеров и их 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-адреса контейнера:
- выберите контейнер
- нажмите на Настройки
- перейдите на вкладку порты.
внимание!!! для использования Docker Compose:
поскольку Docker Compose создает изолированную сеть для каждого кластера, приведенные ниже методы не работают с
docker-compose.
самый элегантный и простой способ-определить функцию оболочки как наиболее проголосовавший ответ @WouterD это:
dockip() { docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@" }
Docker может записывать идентификаторы контейнеров в файл, например программы Linux:
работает с ,
app.cidсодержимое файла, как показано ниже:
a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
вы можете использовать содержимое файла для проверки контейнеров Docker:
➜ blog-v4 git:(develop) ✗ docker inspect `cat app.cid`Извлечение Контейнера 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.
просто для полноты:
Мне очень нравится -- 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"
на контейнеров Windows использовать
docker exec <container> ipconfigздесь
<container>это имя или id контейнера.можно использовать
docker psчтобы найти идентификатор контейнера.
Если вы забыли идентификатор контейнера или не хотите манипулировать командами оболочки, лучше использовать пользовательский интерфейс, такой как Portainer.
$ 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 в качестве аргумента...
Comments