Как получить IP-адрес контейнера Docker от хоста?
есть ли команда, которую я могу запустить, чтобы получить IP-адрес контейнера прямо с хоста после создания нового контейнера?
в принципе, как только Docker создает контейнер, я хочу свернуть свои собственные сценарии развертывания кода и конфигурации контейнера.
30 ответов
на --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 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, пожалуйста, используйте следующее:
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 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 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
это отобразит активные изображения docker:
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:
работает с --cidfile=filename
параметр, Docker сбрасывает идентификатор контейнера в этот файл.
Docker запускает эквивалентный раздел PID
--cidfile="app.cid": Write the container ID to the file
использование PID-файла
- запуск контейнера с ,
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 .Сети 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": "",
тип .ИПА tab и вы увидите следующее:
[Filter]> .[0].NetworkSettings.IPAddress
"172.17.0.2"
на контейнеров Windows использовать
docker exec <container> ipconfig
здесь <container>
это имя или id контейнера.
можно использовать docker ps
чтобы найти идентификатор контейнера.
Если вы забыли идентификатор контейнера или не хотите манипулировать командами оболочки, лучше использовать UI как 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.
Inspect не работал для меня. Может быть, как я использовал -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 в качестве аргумента...