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

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

技术背景

在使用Docker进行容器化部署时,有时需要从主机获取容器的IP地址,以进行网络连接、配置等操作。不同版本的Docker和不同的操作系统环境,获取容器IP地址的方法可能有所不同。

实现步骤

1. 使用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

在Windows系统中,需要使用双引号"代替单引号'

2. 结合docker psgrep命令

先使用docker ps获取容器ID,然后使用docker inspect结合grep查找IP地址。

1
2
docker ps
docker inspect <container ID> | grep "IPAddress"

在Windows CMD中,使用findstr代替grep

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

3. 获取所有容器的IP地址

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

如果使用docker-compose,同样可以使用此命令。

4. 使用脚本获取IP地址

可以将获取IP地址的命令封装成脚本,方便使用。

1
2
3
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

使用时:

1
docker-ip YOUR_CONTAINER_ID

5. 通过容器内文件查看

  • Linux系统
1
docker exec [container-id or container-name] cat /etc/hosts
  • Windows系统
1
docker exec [container-id or container-name] ipconfig

6. 查看网络信息

1
docker network inspect bridge

7. 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'])

核心代码

获取单个容器IP地址

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

获取所有容器IP地址

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

Python脚本获取容器网络信息

1
# 上述Python脚本代码

最佳实践

  • 对于经常需要获取容器IP地址的场景,可以将相关命令封装成脚本或别名,提高效率。
  • 在编写脚本时,考虑不同操作系统和Docker版本的兼容性。

常见问题

  • 容器连接多个网络:上述部分方法仅适用于容器连接单个网络的情况。对于连接多个网络的容器,需要根据具体需求进行调整。
  • 权限问题:确保运行命令的用户具有足够的权限执行docker相关操作。
  • 命令格式问题:在Windows系统中,注意单引号和双引号的使用。

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