Чи є команда, яку я можу виконати, щоб отримати IP-адресу контейнера прямо від хоста після створення нового контейнера?
В основному, як тільки Docker створює контейнер, я хочу прокрутити власний сценарій розгортання коду та конфігурації контейнера.
Чи є команда, яку я можу виконати, щоб отримати IP-адресу контейнера прямо від хоста після створення нового контейнера?
В основному, як тільки Docker створює контейнер, я хочу прокрутити власний сценарій розгортання коду та конфігурації контейнера.
Відповіді:
На допомогу приходить --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.
Як зазначалося в коментарях: якщо ви працюєте в Windows, використовуйте подвійні лапки "
замість одинарних лапок '
навколо фігурних дужок.
<no value>
відповіді на Mac за допомогою Fig / Boot2Docker
<no value>
якщо спробувати запустити це проти контейнера, який не працює. Переконайтеся, що ваш контейнер працює перед цим.
{{ .NetworkSettings.Networks.$network.IPAddress }}
. За замовчуванням здається міст, але під docker-compose це буде конкретне ім’я, яке залежить від імені вашої програми (я думаю, що - прапор-name name, але це також залежатиме від типу конфігурації мережі ви налаштували). Я написав повну відповідь у відповідь тут stackoverflow.com/questions/17157721/…
Можна використовувати docker inspect <container id>
.
Наприклад:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
docker inspect $CID | grep IPAddress | cut -d '"' -f 4
, він прекрасно працює :)
alias dockerip='docker ps | tail -n +2 | while read cid b; do echo -n "$cid\t"; docker inspect $cid | grep IPAddress | cut -d \" -f 4; done'
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
це новий синтаксис. -format
застаріла, вона стає --format
.
Спочатку отримайте ідентифікатор контейнера:
docker ps
(Перший стовпець призначений для ідентифікатора контейнера)
Використовуйте ідентифікатор контейнера для запуску:
docker inspect <container ID>
Унизу, у розділі "Налаштування мережі", ви можете знайти "IPAddress"
Або просто зробіть:
docker inspect <container id> | grep "IPAddress"
docker run -it MYCONTAINER /bin/bash
), вихід inspect
не має розділу NetworkSettings
!
docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
... | grep IP
рішенням усіх деталей форматування, необхідних для отримання IP-адреси. +1
docker run -it MYIMAGE
(це не назва контейнера ); якщо це зробити, docker inspect MYIMAGE
ви отримаєте статичну інформацію про зображення . Потрібно знайти ім'я запущеного контейнера (або використовувати його id, як пропонують інші). У моїй системі перший такий контейнер, створений із цього зображення, за замовчуванням наводить ім'я MYIMAGE_1
, так docker inspect MYIMAGE_1
це NetworkSettings.
docker inspect CONTAINER_ID | grep "IPAddress"
Ви можете додати -i
grep за ігнорування справи, тоді навіть наступне буде працювати:
docker inspect CONTAINER_ID | grep -i "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
{{.NetworkSettings.IPAddress }}
на{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'
. В sed(1)
видаляє порожні рядки для контейнерів присутній, але не мають IP-адресу.
Додайте цей скрипт оболонки у ~/.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}}' "$@"
}
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
source ~/.bash_profile
У 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
docker exec [container-name-or-id] ip a
docker exec [container-id or container-name] ipconfig
Станом на версію 1.10.3 Докера, складіть 20f81dd
Якщо ви не сказали Docker інше, Docker завжди запускає ваші контейнери в мостовій мережі. Тож ви можете спробувати цю команду нижче:
docker network inspect bridge
Потім слід повернути розділ Containers, який відображатиме 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
Використовуйте значення ідентифікатора 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
Я написав наступний сценарій 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 container ls
Тоді отримайте IP:
docker inspect <container_ID Or container_name> |grep 'IPAddress'
Отримайте порт:
docker inspect <container_ID Or container_name> |grep 'Port'
Docker написаний на Go, і він використовує синтаксис Go для запитів.
Щоб перевірити IP-адресу конкретного контейнера, потрібно запустити команду ( -f
для "форматування"):
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
Для ідентифікатора або імені контейнера можна виконати команду
docker container ls
який перелічить кожен запущений контейнер.
Ось рішення, яке я сьогодні розробив у Python, використовуючи docker inspect container
вихід JSON як джерело даних.
У мене є багато контейнерів та інфраструктури, які мені доводиться перевіряти, і мені потрібно швидко та досить швидко отримувати основну мережеву інформацію з будь-якого контейнера . Ось чому я зробив цей сценарій.
ВАЖЛИВО: З версії 1.9 Докер дозволяє створювати декілька мереж і приєднувати їх до контейнерів.
#!/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 $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 ps -q
щоб уникнути tail
, і --format
щоб уникнути грепу. Крім того, ви можете передавати кілька ідентифікаторів контейнерів, docker inspect
а не петлю в оболонці.
docker ps -q
відображає лише числові ідентифікатори контейнерів, але я думаю, що краще використовувати їх ім’я. tail
лише позбутися першого рядка (заголовок таблиці) і все ще потрібно. Я міг би використовувати --format
, хоча: docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect --format="{{.NetworkSettings.IPAddress}}" $name | cut -d \" -f 4; done
. Але це не здається великим покращенням ... grep
ІМО був більш читабельним.
docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
Якщо ви встановили Docker за допомогою Docker Toolbox, ви можете використовувати додаток Kitematic, щоб отримати IP-адресу контейнера:
docker inspect
це не працює, коли ви запускаєте панель інструментів docker. Він повідомить IP-адресу, але ваші служби використовуватимуть не правильну адресу.
Щоб отримати IP-адресу та порт хосту контейнера:
docker inspect containerId | awk '/IPAddress/ || /HostPort/'
Вихід:
"HostPort": "4200"
"HostPort": "4200"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
ПРИМІТКА!!! для використання Docker Compose:
Оскільки Docker Compose створює ізольовану мережу для кожного кластеру, наведені нижче методи не працюють docker-compose
.
Найелегантніший і найпростіший спосіб - це визначення функції оболонки, на даний момент найбільш відповідна відповідь @ WouterD :
dockip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Docker може записати ідентифікатори контейнерів у файл, як-от програми Linux:
Працюючи з --cidfile=filename
, Docker скидає ідентифікатор контейнера на "ім'я файлу".
Додаткову інформацію див. У розділі " Докер виконує PID-еквівалентний розділ ".
--cidfile="app.cid": Write the container ID to the file
Використання PID-файлу:
Запуск контейнера з --cidfile
параметром, 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'])
Див. " 10 альтернатив отримання IP-адреси контейнера Docker " для отримання додаткової інформації.
У цьому списку буде вказано всі 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/ \// /'
Просто для повноти:
Мені дуже подобається --format
варіант, але спочатку я його не усвідомлював, тому використовував простий одношаровий Python, щоб отримати той самий результат:
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
Поєднання попередніх відповідей з пошуку ідентифікатора контейнера на основі імені зображення Docker:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
Використання:
docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
$ docker inspect c4591485328d | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
172.17.0.2
Для використання контейнерів Windows
docker exec <container> ipconfig
де <container>
це ім'я або ідентифікатор контейнера.
Ви можете використовувати 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.