从主机获取Docker容器IP地址的方法

从主机获取Docker容器IP地址的方法

技术背景

在使用Docker进行开发和部署时,经常需要从主机获取容器的IP地址,以进行代码部署、容器配置或与容器进行通信等操作。以下介绍多种从主机获取Docker容器IP地址的方法。

实现步骤

方法一:使用docker inspect命令结合格式化选项

现代Docker客户端语法:

1
2
docker inspect \
-f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

旧的Docker客户端语法:

1
2
docker inspect \
--format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

这些命令将返回Docker容器的IP地址。如果在Windows上使用,需将单引号'替换为双引号"

方法二:通过docker psdocker inspect命令手动查找

  1. 首先获取容器ID:
1
docker ps

(第一列是容器ID)
2. 使用容器ID运行:

1
docker inspect <container ID>

在输出的底部,NetworkSettings下可以找到IPAddress
或者在UNIX系统上使用:

1
docker inspect <container id> | grep "IPAddress"

在Windows CMD中使用:

1
docker inspect <container id> | findstr "IPAddress"

方法三:使用脚本获取所有容器的IP地址

1
docker inspect -f '{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

如果使用docker-compose,命令如下:

1
docker inspect -f '{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

方法四:通过docker exec命令在容器内查询

在Linux容器中:

1
docker exec [container-id or container-name] cat /etc/hosts

在Windows容器中:

1
docker exec [container-id or container-name] ipconfig

核心代码

以下是一个Python脚本示例,用于获取容器的网络信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/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'])

最佳实践

  • 使用格式化选项:使用docker inspect--format选项可以直接获取所需的IP地址,避免手动解析大量输出。
  • 脚本化操作:将常用的命令封装成脚本或别名,提高操作效率。例如,在~/.bashrc中添加以下脚本:
1
2
3
docker-ip() {
docker inspect --format '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

然后,要获取容器的IP地址,只需执行:

1
docker-ip YOUR_CONTAINER_ID

常见问题

  • docker inspect返回<no value>:可能是容器未正确分配IP地址,或者使用的网络配置有问题。检查容器是否正常运行,以及网络设置是否正确。
  • 在Windows上使用单引号导致错误:Windows系统需要使用双引号"替换单引号'
  • 容器连接多个网络时获取IP问题:使用docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'可能会返回多个IP地址。可以使用jq工具来解析网络JSON,以更好地处理这种情况。

从主机获取Docker容器IP地址的方法
https://119291.xyz/posts/2025-04-22.methods-to-get-docker-container-ip-address-from-host/
作者
ww
发布于
2025年4月23日
许可协议