Como obter o endereço IP de um Contentor de Docker da máquina
Existe um comando que eu possa executar para obter o endereço IP do contentor directamente da máquina após a criação de um novo contentor?
basicamente, uma vez que o Docker cria o contentor, eu quero rolar os meus próprios programas de implementação de código e configuração do contentor.
30 answers
A opção --format
de inspect
vem em Socorro.
A sintaxe do cliente Docker moderno é:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
A sintaxe do Cliente do Docker antigo é:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
Estes comandos irão devolver o endereço IP do contentor do Docker.
Como mencionado nos comentários: se estiver no Windows, use aspas duplas "
em vez de aspas simples '
em torno dos chavões encaracolados.
Pode usar docker inspect <container id>
.
Por exemplo:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
Primeiro obter o identificador do contentor:
docker ps
(A primeira coluna é para o ID do contentor)
Utilize o identificador do contentor para executar:
docker inspect <container ID>
No fundo, em "NetworkSettings", pode encontrar "IPAddress"
Ou apenas fazer:
docker inspect <container id> | grep "IPAddress"
docker inspect CONTAINER_ID | grep "IPAddress"
Você pode adicionar -i
ao grep por ignorar o caso, então mesmo o seguinte irá funcionar:
docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
Se estiver a utilizar {[3] } o comando será este:
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
A saída será:
/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2
Adicione este script de consola no seu ~/.bashrc
ou ficheiro relevante:
docker-ip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Então, para obter um endereço IP de um contentor, basta fazer isto:
docker-ip YOUR_CONTAINER_ID
Para a nova versão do acoplador, por favor use o seguinte:
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
No Docker 1. 3+, pode também verificá - lo usando:
Indique o acoplador em execução (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
Para as janelas:
docker exec [container-id or container-name] ipconfig
Mostra todos os endereços IP do contentor:
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
A partir da versão 1.10.3 do Docker, build 20f81dd
A menos que tenha dito ao Docker o contrário, o Docker lança sempre os seus contentores na rede de pontes. Então você pode tentar este comando abaixo:docker network inspect bridge
Que deverá então devolver uma secção de contentores que irá mostrar o endereço IP desse contentor em execução.
[
{
"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"
}
}
]
Executar:
docker ps -a
Isto irá mostrar imagens do acoplador activo:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b733ae18c1c parzee/database "/usr/lib/postgresql/" 6 minutes ago Up 6 minutes 5432/tcp serene_babbage
Utilize o valor DO ID do contentor:
docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
"172.17.0.2"
docker-ips() {
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
O primeiro comando dá o endereço IP de todos os contentores e o segundo o endereço IP de um contentor específico.
docker-ips
docker-ip YOUR_CONTAINER_ID
Obter o nome do contentor ou o ID:
docker container ls
Depois obter o IP:
docker inspect <container_ID Or container_name> |grep 'IPAddress'
Vai para o porto:
docker inspect <container_ID Or container_name> |grep 'Port'
Recipientes de referência pelo nome:
docker run ... --name pg-master
Depois obtém o endereço IP pelo nome:
MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
Aqui está uma solução que eu desenvolvi hoje em Python, usando a saída JSON docker inspect container
como fonte de dados.
Importante: desde a versão 1.9, o Docker permite-lhe criar várias redes e anexá-las aos contentores.
#!/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'])
A o resultado é:
$ 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
Eu escrevi o seguinte script Bash para obter uma tabela de endereços IP de todos os recipientes em 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
}
Você deve mudar a rede variável para o seu próprio nome de rede.
O Docker é escrito em Go e usa a sintaxe Go também para fins de consulta.
Para inspeccionar o endereço IP de um determinado contentor, terá de executar o comando (-f
para "formato"):
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
Para o ID ou nome do contentor, pode executar o comando
docker container ls
Que irá listar todos os contentores em execução.
Uso esta forma simples
docker exec -it <container id or name> hostname -i
E. g
ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
O acima funciona se o contentor for colocado na rede de pontes predefinida.
No entanto, se usar uma rede de pontes personalizada ou uma rede sobreposta, descobri que a infra funciona melhor:
docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Para alargar a resposta do ko-dos, Aqui está um nome alternativo para listar todos os nomes dos contentores e os seus endereços 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'
nota!!! para a utilização da composição do 'Docker':
Uma vez que a composição do Estivador cria uma rede isolada para cada aglomerado, os métodos abaixo não funcionam com docker-compose
.
A maneira mais elegante e fácil é definir uma função shell, actualmente a resposta Mais votada @Wouterd's:
dockip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
O Docker pode escrever IDs de contentores num ficheiro como os programas Linux:
Correndo com --cidfile=filename
, O acoplador descarrega o ID do contentor para "nome".
Ver "O acoplador executa a secção equivalente do PID " para mais informações.
--cidfile="app.cid": Write the container ID to the file
Usando um ficheiro PID:
-
A executar um contentor com o parâmetro
--cidfile
, o conteúdo do ficheiroapp.cid
é como:a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
-
Pode usar o conteúdo do ficheiro para inspeccionar os contentores do Docker:
blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
-
Pode extrair o IP do contentor usando um programa em Python incorporado:
$ 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'])
Ver " 10 alternativas para obter os endereços IP do contentor do Docker " para mais informações.
Combinar as respostas anteriores com encontrar o ID do contentor com base no nome da imagem do acoplador:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
A minha resposta:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq
) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n
Também como pseudónimo de bash:
docker-ips() { docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n }
O resultado é ordenado pelo endereço IP e a página delimitada:
# docker-ips
172.18.0.2 memcached
172.18.0.3 nginx
172.18.0.4 fpm-backup
172.18.0.5 dns
172.18.0.6 fpm-beta
172.18.0.7 exim
172.18.0.8 fpm-delta
172.18.0.9 mariadb
172.18.0.10 fpm-alpha
172.19.0.2 nextcloud-redis
172.19.0.3 nextcloud-db
172.19.0.4 nextcloud
Se instalou o acoplador usando a caixa de ferramentas do acoplador, poderá usar a aplicação Kitemática para obter o endereço IP do contentor:
- Seleccione o contentor
- Carregue em Configuração
- carregue na página portas.
Para obter o endereço IP e o porto de recepção de um contentor:
docker inspect containerId | awk '/IPAddress/ || /HostPort/'
Resultado:
"HostPort": "4200"
"HostPort": "4200"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
Apenas para completar:
Eu realmente gosto da Opção --format
, mas no início eu não estava ciente dela então eu usei um simples Python one-liner para obter o mesmo resultado:
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
Para o windows 10:
docker inspect --format "{{ .NetworkSettings.IPAddress }}" containerId
Inspeccionar o uso do 'Docker' para imprimir todos os ips do contentor e os respectivos nomes
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
Para aqueles que vieram do Google para encontrar uma solução para a execução de comandos a partir do terminal (não por um script), "jid", que é um utilitário interativo JSON drill-down com autocomplete e sugestão, permite-lhe fazer a mesma coisa com menos digitação.
docker inspect $CID | jid
Tipo Tab . Net Tab e vais ver algo como:
[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": "",
Tipo .IPA
Tab e vais ver algo como:
[Filter]> .[0].NetworkSettings.IPAddress
"172.17.0.2"
Isto irá listar todos os IPs do contentor na máquina:
sudo docker ps -aq | while read line; do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
A resposta aceite não funciona bem com várias redes por contentor:
> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cc54d96d63ea
172.20.0.4172.18.0.5
A próxima melhor resposta é mais próxima:
> docker inspect cc54d96d63ea | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.20.0.4",
"IPAddress": "172.18.0.5",
Gosto de usar {[4] } para analisar a rede JSON:
> docker inspect cc54d96d63ea | jq -r 'map(.NetworkSettings.Networks) []'
{
"proxy": {
"IPAMConfig": null,
"Links": [
"server1_php_1:php",
"server1_php_1:php_1",
"server1_php_1:server1_php_1"
],
"Aliases": [
"cc54d96d63ea",
"web"
],
"NetworkID": "7779959d7383e9cef09c970c38c24a1a6ff44695178d314e3cb646bfa30d9935",
"EndpointID": "4ac2c26113bf10715048579dd77304008904186d9679cdbc8fcea65eee0bf13b",
"Gateway": "172.20.0.1",
"IPAddress": "172.20.0.4",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:14:00:04",
"DriverOpts": null
},
"webservers": {
"IPAMConfig": null,
"Links": [
"server1_php_1:php",
"server1_php_1:php_1",
"server1_php_1:server1_php_1"
],
"Aliases": [
"cc54d96d63ea",
"web"
],
"NetworkID": "907a7fba8816cd0ad89b7f5603bbc91122a2dd99902b504be6af16427c11a0a6",
"EndpointID": "7febabe380d040b96b4e795417ba0954a103ac3fd37e9f6110189d9de92fbdae",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.5",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:05",
"DriverOpts": null
}
}
Para listar os endereços IP de cada contentor torna-se então:
for s in `docker ps -q`; do
echo `docker inspect -f "{{.Name}}" ${s}`:
docker inspect ${s} | jq -r 'map(.NetworkSettings.Networks) []' | grep "IPAddress";
done
/server1_web_1:
"IPAddress": "172.20.0.4",
"IPAddress": "172.18.0.5",
/server1_php_1:
"IPAddress": "172.20.0.3",
"IPAddress": "172.18.0.4",
/docker-gen:
"IPAddress": "172.18.0.3",
/nginx-proxy:
"IPAddress": "172.20.0.2",
"IPAddress": "172.18.0.2",