Apakah ada perintah yang bisa saya jalankan untuk mendapatkan wadah's alamat IP dari host setelah wadah baru dibuat?
Pada dasarnya, setelah Docker menciptakan wadah, saya ingin roll saya sendiri kode penyebaran dan wadah skrip konfigurasi.
The --format
pilihan untuk memeriksa datang untuk menyelamatkan.
Modern Docker klien sintaks:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
Tua Docker klien sintaks:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
Yang akan kembali hanya alamat IP.
Seperti yang disebutkan dalam komentar: jika anda berada di Windows, gunakan tanda kutip ganda "
bukan tanda kutip tunggal '
di sekitar kurung kurawal.
Pertama mendapatkan wadah ID:
docker ps
(Kolom pertama adalah untuk container ID)
Gunakan wadah ID untuk menjalankan:
docker inspect <container ID>
Di bagian bawah,bawah "NetworkSettings", anda dapat menemukan "IPAddress"
Atau Hanya melakukan:
docker inspect <container id> | grep "IPAddress"
Untuk mendapatkan semua wadah nama dan alamat IP mereka hanya dalam satu perintah.
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
Jika anda menggunakan docker-menulis
perintah akan hal ini:
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Output akan sama:
/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2
Tambahkan shell script anda ~/.bashrc
atau relevan file:
docker-ip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Kemudian, untuk mendapatkan alamat IP dari sebuah wadah, hanya melakukan ini:
docker-ip YOUR_CONTAINER_ID
Untuk versi baru dari Docker, silahkan gunakan kode berikut ini:
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
Di Docker 1.3+, anda juga dapat memeriksanya melalui langkah-langkah di bawah ini:
Masukkan berjalan 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
Untuk windows:
docker exec [container-id or container-name] ipconfig
Sebagai Docker versi 1.10.3, membangun 20f81dd
Kecuali anda mengatakan Docker jika tidak, Docker selalu meluncurkan kontainer di jembatan jaringan. Jadi anda dapat mencoba perintah ini di bawah ini:
docker network inspect bridge
Yang kemudian harus kembali Wadah bagian yang akan menampilkan alamat IP untuk menjalankan wadah.
[
{
"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"
}
}
]
Execute:
docker ps -a
Ini akan menampilkan aktif docker gambar:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b733ae18c1c parzee/database "/usr/lib/postgresql/" 6 minutes ago Up 6 minutes 5432/tcp serene_babbage
Gunakan WADAH ID nilai:
docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
"172.17.0.2"
Berdasarkan beberapa jawaban yang saya cintai, saya memutuskan untuk menggabungkan mereka ke sebuah fungsi untuk mendapatkan semua alamat IP dan satu lagi untuk suatu wadah tertentu. Mereka sekarang .bashrc
file.
docker-ips() {
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
Perintah pertama memberikan alamat IP dari semua kontainer dan yang kedua adalah sebuah wadah tertentu's IP address.
docker-ips
docker-ip YOUR_CONTAINER_ID
Saya menulis sebagai berikut script Bash untuk mendapatkan meja dari alamat IP dari semua kontainer yang berjalan di bawah 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
}
Anda harus mengubah variabel jaringan ke jaringan anda sendiri nama.
Docker ini dibuat secara internal di Pergi dan Pergi menggunakan sintaks query tujuan juga.
Untuk memeriksa alamat IP dari wadah tertentu, anda perlu untuk menjalankan perintah(-f untuk format pilihan)
docker memeriksa -f '{{range .NetworkSettings.Jaringan}}{{.IPAddress}}{{end}}' container_id_or_name
Untuk container id atau nama, anda dapat menjalankan perintah docker container ls
.
Itu akan daftar ke setiap menjalankan wadah.
Berikut ini's merupakan solusi yang saya kembangkan saat ini di Python, menggunakan "docker memeriksa wadah" JSON output sebagai sumber data.
Saya memiliki banyak wadah dan sarana dan prasarana yang harus saya periksa, dan saya perlu untuk mendapatkan informasi jaringan dasar dari setiap wadah, dan cepat cantik cara. Yang's mengapa saya membuat script ini.
PENTING: Sejak versi 1.9, Docker memungkinkan anda untuk membuat beberapa jaringan dan melampirkannya ke wadah.
#!/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'])
Output seperti ini:
$ 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>
Karya-karya di atas jika wadah dikerahkan ke default jembatan jaringan.
Namun, jika menggunakan custom jembatan jaringan atau jaringan overlay, saya menemukan di bawah ini untuk bekerja dengan baik:
docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Untuk memperpanjang ko-dos' jawabannya, di sini's alias untuk daftar semua wadah nama dan alamat IP mereka:
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'
Untuk mendapatkan alamat IP dan port host dari sebuah wadah:
docker inspect containerId | awk '/IPAddress/ || /HostPort/'
Output:
"HostPort": "4200"
"HostPort": "4200"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",