Există o comandă nu pot alerga pentru a obține container's IP adresa de gazdă după un nou container este creat?
Practic, o dată Docker creează în recipient, vreau să-mi dau propriul cod de implementare și recipient de configurare script-uri.
La --format
opțiunea de a inspecta vine vorba de salvare.
Modern Docker client sintaxa:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
Vechi client Docker sintaxa:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
Care va returna doar adresa IP.
După cum sa menționat în comentarii: dacă ești pe Windows, utilizați ghilimele duble " în loc de ghilimele simple
' prin acolade.
În primul rând să recipientul ID:
docker ps
(Prima coloană este pentru container ID)
Utilizați containere ID-ul pentru a rula:
docker inspect <container ID>
În partea de jos,sub "NetworkSettings", puteți găsi "IPAddress"
Sau Doar faci:
docker inspect <container id> | grep "IPAddress"
docker inspecta CONTAINER_ID | grep "IPAddress"
Dacă se adaugă `-am să grep, IPAddress carcasa poate fi orice, cum ar fi următoarele:
docker inspecta CONTAINER_ID | grep -i "IPADDress"
Pentru a obține toate recipient numele și adresele lor IP în doar o singură comandă.
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
Dacă utilizați docker-compune
comanda va fi asta:
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Rezultatul va fi:
/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2
Adauga acest script de shell în~/.bashrc sau fișiere relevante:
docker-ip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Apoi, pentru a obține o adresă IP de la un container, pur și simplu a face acest lucru:
docker-ip YOUR_CONTAINER_ID
Pentru cea mai nouă versiune de Docher, vă rugăm să folosiți următoarele:
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
În Docker 1.3+, puteți verifica, de asemenea, prin pașii de mai jos:
Introduceți funcționare 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
Pentru windows:
docker exec [container-id or container-name] ipconfig
Ca de Docker versiune 1.10.3, construi 20f81dd
Dacă nu ai spus Docker altfel, Docker întotdeauna lansează containere în podul de rețea. Astfel încât să puteți încerca această comandă de mai jos:
docker network inspect bridge
Care ar trebui apoi să se întoarcă o Containere secțiunea care va afișa adresa IP pentru care execută container.
[
{
"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"
}
}
]
Executa:
docker ps -a
Aceasta va afișa active docker imagini:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b733ae18c1c parzee/database "/usr/lib/postgresql/" 6 minutes ago Up 6 minutes 5432/tcp serene_babbage
Utilizați CONTAINERE ID-ul valoare:
docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
"172.17.0.2"
Bazat pe unele dintre răspunsurile de care am iubit, am decis pentru a le îmbina într-o funcție pentru a obține toate adresele IP și un altul pentru un container specific. Ei sunt acum în a mea .bashrc
de fișier.
docker-ips() {
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
Prima comandă vă oferă adresa IP de toate containerele și cel de-al doilea un container specific's adresa IP.
docker-ips
docker-ip YOUR_CONTAINER_ID
Am scris următoarele script Bash pentru a obține un tabel de adrese IP de la toate containerele care rulează sub docker-compune
.
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
}
Ar trebui să schimbe variabilă de rețea de la propriul nume de rețea.
Docker este făcută pe plan intern, în Du-te și-l folosește Merg sintaxa de interogare scopuri prea.
Pentru inspectarea despre adresa IP a unui anumit recipient, aveți nevoie pentru a rula comanda(-f pentru format opțiune)
docker controlați -f '{{gama .NetworkSettings.Rețelele}}{{.IPAddress}}{{end}}' container_id_or_name
Pentru container id-ul sau numele, puteți rula comanda docker container ls
.
Acesta va lista în jos pe fiecare recipient de funcționare.
Aici's este o soluție pe care am dezvoltat astăzi în Python, folosind "docher inspecta container" JSON ieșire ca sursă de date.
Am o mulțime de containere și a infrastructurilor că trebuie să verificați, și am nevoie pentru a obține informații de rețea de bază la orice fel de recipient, într-un mod rapid și frumos mod. Ca's de ce am facut acest script.
IMPORTANT: Începând cu versiunea 1.9, Docker vă permite să creați mai multe rețele și să le atașați la containere.
#!/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'])
Ieșirea este la fel ca aceasta:
$ 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 container ls
docker inspect <container_ID Or container_name> |grep 'IPAddress'
docker inspect <container_ID Or container_name> |grep 'Port'
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
Cele de mai sus funcționează în cazul în care recipientul este desfășurată la default podul de rețea.
Cu toate acestea, dacă utilizați un obicei podul de rețea sau o suprapunere de rețea, am găsit de mai jos pentru a lucra mai bine:
docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Pentru a extinde ko-dos' răspunsul, aici's un alias pentru a lista toate recipient numele și adresele lor 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'
Pentru a obține adresa IP și port gazdă de un container:
docker inspect containerId | awk '/IPAddress/ || /HostPort/'
Ieșire:
"HostPort": "4200"
"HostPort": "4200"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",