小智 1969
--format
检查的选择来救援.
现代Docker客户端语法:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
Run Code Online (Sandbox Code Playgroud)
旧Docker客户端语法:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
Run Code Online (Sandbox Code Playgroud)
哪个只返回IP地址.
正如评论中所提到的:如果您使用的是Windows,请在花括号周围使用双引号"
而不是单引号'
.
cre*_*ack 501
您可以使用 docker inspect <container id>
例:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
Run Code Online (Sandbox Code Playgroud)
Kru*_*nal 380
首先获取容器ID:
docker ps
Run Code Online (Sandbox Code Playgroud)
(第一列是容器ID)
使用容器ID运行:
docker inspect <container ID>
Run Code Online (Sandbox Code Playgroud)
在底部,在"NetworkSettings"下,您可以找到"IPAddress"
或者只是做:
docker inspect <container id> | grep "IPAddress"
Run Code Online (Sandbox Code Playgroud)
nPc*_*omp 188
docker inspect CONTAINER_ID | grep "IPAddress"
Hem*_*ela 108
只需一个命令即可获取所有容器名称及其IP地址.
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)
如果您使用docker-compose
该命令将是这样的:
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)
输出将是:
/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2
Run Code Online (Sandbox Code Playgroud)
Tuo*_* Le 92
在您~/.bashrc
或相关文件中添加此shell脚本:
docker-ip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Run Code Online (Sandbox Code Playgroud)
然后,要获取容器的IP地址,只需执行以下操作:
docker-ip YOUR_CONTAINER_ID
Run Code Online (Sandbox Code Playgroud)
对于新版本的Docker,请使用以下内容:
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
Run Code Online (Sandbox Code Playgroud)
Jak*_*e W 34
在Docker 1.3+中,您还可以通过以下步骤进行检查:
输入正在运行的Docker:
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
Run Code Online (Sandbox Code Playgroud)
zho*_*uji 34
显示所有容器的IP地址:
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)
小智 26
从Docker版本1.10.3开始,构建20f81dd
除非你告诉Docker,否则Docker总是在桥接网络中启动你的容器.所以你可以尝试下面这个命令:
docker network inspect bridge
Run Code Online (Sandbox Code Playgroud)
然后应返回一个容器部分,该部分将显示该正在运行的容器的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"
}
}
]
Run Code Online (Sandbox Code Playgroud)
gog*_*sca 22
执行:
docker ps -a
Run Code Online (Sandbox Code Playgroud)
这将显示活动泊坞窗图像:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b733ae18c1c parzee/database "/usr/lib/postgresql/" 6 minutes ago Up 6 minutes 5432/tcp serene_babbage
Run Code Online (Sandbox Code Playgroud)
使用CONTAINER ID值:
docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
Run Code Online (Sandbox Code Playgroud)
"172.17.0.2"
sil*_*gon 20
根据我喜欢的一些答案,我决定将它们合并到一个函数中以获取所有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}}' "$@"
}
Run Code Online (Sandbox Code Playgroud)
第一个命令提供所有容器的IP地址,第二个命令提供特定容器的IP地址.
docker-ips
docker-ip YOUR_CONTAINER_ID
Run Code Online (Sandbox Code Playgroud)
ctr*_*brk 19
我的答案:
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
Run Code Online (Sandbox Code Playgroud)
也作为 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 }
Run Code Online (Sandbox Code Playgroud)
输出按 IP 地址排序,并以制表符分隔:
# 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
Run Code Online (Sandbox Code Playgroud)
Sam*_*r C 16
按名称引用容器:
docker run ... --name pg-master
Run Code Online (Sandbox Code Playgroud)
然后按名称获取IP地址:
MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
Run Code Online (Sandbox Code Playgroud)
Dun*_*unk 14
我编写了以下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
}
Run Code Online (Sandbox Code Playgroud)
您应该将变量网络更改为您自己的网络名称.
小智 13
Docker在Go内部制作,它也使用Go语法进行查询.
要检查特定容器的IP地址,需要运行命令(-f表示格式选项)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
对于容器ID或名称,您可以运行该命令docker container ls
.它将列出每个正在运行的容器.
iva*_*ncz 11
这是我今天用Python开发的解决方案,使用"docker inspect container"JSON输出作为数据源.
我有很多容器和基础设施需要检查,我需要以快速和漂亮的方式从任何容器中获取基本的网络信息.这就是我制作这个剧本的原因.
重要提示:从版本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'])
Run Code Online (Sandbox Code Playgroud)
输出就像这样:
$ 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
Run Code Online (Sandbox Code Playgroud)
Ben*_*ari 10
docker container ls
Run Code Online (Sandbox Code Playgroud)
docker inspect <container_ID Or container_name> |grep 'IPAddress'
Run Code Online (Sandbox Code Playgroud)
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
Run Code Online (Sandbox Code Playgroud)
如果容器部署到默认桥接网络,则上述方法有效.
但是,如果使用自定义网桥或覆盖网络,我发现以下内容更好:
docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Run Code Online (Sandbox Code Playgroud)
要扩展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'
Run Code Online (Sandbox Code Playgroud)
小智 8
将之前的答案与根据 Docker 映像名称查找容器 ID 相结合:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
Run Code Online (Sandbox Code Playgroud)
小智 8
我用这种简单的方法
docker exec -it <container id or name> hostname -i
Run Code Online (Sandbox Code Playgroud)
例如
ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5
Run Code Online (Sandbox Code Playgroud)
小智 7
获取容器的IP地址和主机端口:
docker inspect containerId | awk '/IPAddress/ || /HostPort/'
Run Code Online (Sandbox Code Playgroud)
输出:
"HostPort": "4200"
"HostPort": "4200"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
Run Code Online (Sandbox Code Playgroud)
Linux容器
docker exec postgres ifconfig
Run Code Online (Sandbox Code Playgroud)
docker exec postgres cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)
docker exec postgres ip a
使用 Powershell
docker inspect postgres | select-string 'ipaddress'
Run Code Online (Sandbox Code Playgroud)
注意!!!for Docker Compose用法:
由于Docker Compose为每个群集创建了一个隔离的网络,因此以下方法不起作用docker-compose
.
最优雅和简单的方法是将shell函数定义为@ WouterD的最多投票答案:
dockip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Run Code Online (Sandbox Code Playgroud)
Docker可以将容器ID写入Linux程序之类的文件中:
使用--cidfile=filename
参数运行,Docker将容器的ID转储到此文件.
--cidfile="app.cid": Write the container ID to the file
Run Code Online (Sandbox Code Playgroud)
--cidfile
参数的容器,app.cid
文件内容如下:a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
您可以使用文件内容来检查Docker容器:
? blog-v4 git:(develop) ? docker inspect `cat app.cid`
提取Container 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'])
Run Code Online (Sandbox Code Playgroud)
http://networkstatic.net/10-examples-of-how-to-get-docker-container-ip-address/
这里有10种获取Docker容器IP地址的替代方案.
对于那些从 Google 来寻找从终端(而不是通过脚本)执行命令的解决方案的人来说,“ jid ”是一个交互式 JSON 深入实用程序,具有自动完成和建议功能,可让您以更少的输入完成同样的事情.
docker inspect $CID | jid
Run Code Online (Sandbox Code Playgroud)
输入Tab.Net 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": "",
Run Code Online (Sandbox Code Playgroud)
输入.IPA
Tab,你会看到类似的内容:
[Filter]> .[0].NetworkSettings.IPAddress
"172.17.0.2"
Run Code Online (Sandbox Code Playgroud)
对于Windows 10:
docker inspect --format "{{ .NetworkSettings.IPAddress }}" containerId
Run Code Online (Sandbox Code Playgroud)
小智 6
这将列出主机上的所有容器 IP:
sudo docker ps -aq | while read line; do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
Run Code Online (Sandbox Code Playgroud)
接受的答案不适用于每个容器的多个网络:
> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cc54d96d63ea
172.20.0.4172.18.0.5
Run Code Online (Sandbox Code Playgroud)
下一个最佳答案更接近:
> docker inspect cc54d96d63ea | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.20.0.4",
"IPAddress": "172.18.0.5",
Run Code Online (Sandbox Code Playgroud)
我喜欢用jq
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
}
}
Run Code Online (Sandbox Code Playgroud)
要列出每个容器的 IP 地址,则变为:
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",
Run Code Online (Sandbox Code Playgroud)
Docker检查用于打印所有容器ips及其各自的名称
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
Run Code Online (Sandbox Code Playgroud)
我在这个问题中读到的许多(几乎所有)解决方案都需要用户首先识别<容器名称>或<容器 ID>的中间步骤,然后将其提供给他们的解决方案以显示 IP。
重新创建容器时,IP 可能会发生变化,如果发生这种情况,引用它的任何脚本现在都将被破坏......
因此,我需要一种无需手动干预即可提取容器 IP 的方法,以确保脚本始终具有正确的 IP,即使每次重新创建容器时 IP 都会发生变化。
#!/bin/bash
# Only need to set "CONTAINERNAME" variable with an arbitrary
# string found in either the Container ID or Image Name and
# it prints container IP. Ensure the string is unique to desired host
CONTAINERNAME='mariadb-blog'
CONTAINERID="$(docker ps | grep -i $CONTAINERNAME | awk '{print $1}')"
CONTAINERIP="$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINERID)"
echo "$CONTAINERIP"
Run Code Online (Sandbox Code Playgroud)
我已经用我自己的 Linux Docker-Compose 主机测试了这个脚本,自 20220722 起它就可以可靠地工作。事实上,复制粘贴脚本来验证我的结果是否可重现是很容易的。
请注意:存在潜在的可靠性致命弱点:如果您不剪切自己的 docker 镜像并依赖第三方的镜像,他们可能会更改镜像的命名约定并破坏脚本grep
中的命名约定。因此,我建议将任意字符串设置为容器名称,因为您可以控制它,确保该字符串的 grep 始终成功并打印 IP 以提供给您的脚本。
小智 5
只是为了完整性:
我真的很喜欢--format选项,但起初我并不知道这个选项所以我使用了一个简单的Python单行来获得相同的结果:
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
Run Code Online (Sandbox Code Playgroud)
用:
docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
Run Code Online (Sandbox Code Playgroud)
docker inspect <container id> | grep -i ip
Run Code Online (Sandbox Code Playgroud)
例如:
docker inspect 2b0c4b617a8c | grep -i ip
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1101240 次 |
最近记录: |