从主机获取Docker容器的IP地址的方法
技术背景
在使用Docker进行容器化部署时,有时需要从主机获取容器的IP地址,以进行网络连接、配置等操作。不同版本的Docker和不同的操作系统环境,获取容器IP地址的方法可能有所不同。
实现步骤
1. 使用docker inspect
命令
1 2
| docker inspect \ -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
|
1 2
| docker inspect \ --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
|
在Windows系统中,需要使用双引号"
代替单引号'
。
2. 结合docker ps
和grep
命令
先使用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. 通过容器内文件查看
1
| docker exec [container-id or container-name] cat /etc/hosts
|
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
|
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)
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脚本获取容器网络信息
最佳实践
- 对于经常需要获取容器IP地址的场景,可以将相关命令封装成脚本或别名,提高效率。
- 在编写脚本时,考虑不同操作系统和Docker版本的兼容性。
常见问题
- 容器连接多个网络:上述部分方法仅适用于容器连接单个网络的情况。对于连接多个网络的容器,需要根据具体需求进行调整。
- 权限问题:确保运行命令的用户具有足够的权限执行
docker
相关操作。 - 命令格式问题:在Windows系统中,注意单引号和双引号的使用。