docker容器inspect内容NetworkSettings的使用
作者:岳来
文章主要介绍了Docker容器的网络设置,包括默认bridge网络和多网络连接的配置,详细解释了顶层字段(如Bridge、SandboxID、HairpinMode等)以及Networks对象的使用方法,推荐使用Networks对象来获取容器的网络信息,因为它提供了更灵活和全面的配置选项
docker inspectNetworkSettingsNetworkSettings
- 顶层字段(
Legacy / Global):主要适用于默认bridge网络(即docker run未指定--network时)。 Networks对象:包含容器连接的每个网络的详细配置(支持多网络)。
一、示例
$ docker inspect 9045fd6a4335 | jq '.[0].NetworkSettings'
{
"Bridge": "",
"SandboxID": "71132bcfbb0f31622aecfd17c7f7d6a257ceaa0dcf935c0edabfabf05df6b4bf",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
}
]
},
"SandboxKey": "/var/run/docker/netns/71132bcfbb0f",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "a7655a6a25a9c0be70e0e47e1de4bbd81c79ab6c783e51946c67b420d2fabc50",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "4b0e8535a09d2bbe8b21abc39dcc03715ad338bde8a94956b7e181f9d7b4b4be",
"EndpointID": "a7655a6a25a9c0be70e0e47e1de4bbd81c79ab6c783e51946c67b420d2fabc50",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null,
"Time": 0,
"SkipResolver": false
}
}
}
二、顶层字段详解(适用于默认 bridge 网络)
2.1、Bridge
- 含义:容器连接的 Linux 网桥设备名称(如 docker0)。
典型值:
- 默认 bridge 网络:
docker0,自社区17.06 版本之后为空字符串。 - 其他情况:空字符串
""
注意:在自定义网络或非 bridge 驱动下通常为空。这个字段仅在使用 bridge 网络驱动时有意义,且主要反映默认 bridge 网络的行为。
存储位置:它是 NetworkSettings 的顶层字段,属于历史遗留设计,现代 Docker 更推荐通过 Networks 对象获取网络信息。
2.2、SandboxID
- 含义:容器网络命名空间(network namespace)的唯一 ID。
- 用途:Docker 内部用于隔离容器网络栈。
- 关联:与 SandboxKey 配合使用。
- 宿主机对应文件:/var/run/docker/netns/$SandboxID ,即为SandboxKey
SandboxID 文件使用:
进入容器的网络命名空间(调试用)使用 nsenter 命令:
# 进入网络命名空间并执行命令 sudo nsenter --net=/var/run/docker/netns/$SANDBOX_ID ip addr sudo nsenter --net=/var/run/docker/netns/$SANDBOX_ID iptables -L ✅ 这是调试容器网络问题(如 DNS、路由、iptables 规则)的最直接方式。
查看命名空间类型
# 查看文件系统类型 stat -f -c %T /var/run/docker/netns/$SANDBOX_ID # 输出: nsfs (表示 network namespace filesystem)
示例
$ docker inspect 4e78a7993616 | jq '.[0].NetworkSettings.SandboxID'
"c8d35d6aee1efcd69d835b22476ab5fa3de6c185136570b4fec6c355f4923479"
$ sudo nsenter --net=/var/run/docker/netns/c8d35d6aee1e ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
950: eth0@if951: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:08 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.8/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
$ sudo nsenter --net=/var/run/docker/netns/c8d35d6aee1e iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 测试 DNS 解析
$ sudo nsenter --net=/var/run/docker/netns/c8d35d6aee1e cat /etc/resolv.conf
options timeout:2 attempts:3 rotate single-request-reopen
nameserver 10.101.0.1
nameserver 10.101.0.17
nameserver 10.101.0.33
$ stat -f -c %T /var/run/docker/netns/c8d35d6aee1e
UNKNOWN (0x6e736673)
容器停止后还能找到 SandboxID 文件吗?
不能。Docker 在容器停止时会自动删除 /var/run/docker/netns/<SandboxID> 文件。
2.3、HairpinMode
- 含义:是否启用 发夹模式(Hairpin NAT)。
- 作用:允许容器通过宿主机 IP 访问自己暴露的端口(例如容器内 curl http://宿主机IP:8080 能访问到自己)。
典型值:
- true:启用(常见于旧版 Docker 或特定配置)
- false:禁用(默认)
底层实现:通过 iptables 的 hairpin nat 规则。
2.4、LinkLocalIPv6Address 和 LinkLocalIPv6PrefixLen
- 含义:容器的 IPv6 链路本地地址(类似 IPv4 的 169.254.x.x)。
- 格式:fe80::/64
- 用途:仅用于同一链路(如同一宿主机)内的通信。
- 注意:Docker 默认禁用 IPv6,故通常为空。更多相关内容查看参考文档
2.5、Ports
- 含义:端口映射(Port Binding) 配置,即 -p 或 --publish 参数的效果。
- 结构:
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
}
]
字段说明:
- 80/tcp:容器内部监听的协议/端口
- HostIp:绑定到宿主机的 IP(0.0.0.0 表示所有接口)
- HostPort:宿主机暴露的端口
多映射:一个容器端口可映射到多个宿主机端口(数组形式)。
示例:docker run -p 8080:80 -p 8081:80 nginx → "80/tcp" 数组有两个元素。
2.6、SandboxKey
- 含义:容器网络命名空间在宿主机上的文件路径。
- 用途:可通过 nsenter 进入该网络命名空间调试:
nsenter --net=/var/run/docker/netns/71132bcfbb0f ip addr
2.7、SecondaryIPAddresses / SecondaryIPv6Addresses
- 含义:容器的辅助 IP 地址(可手动添加)。
- 典型值:null(除非显式配置)
- 用途:高级网络场景(如多 IP 绑定)。
2.8、EndpointID
- 含义:容器在默认 bridge 网络中的端点(endpoint)唯一 ID。
- 注意:在 Networks 对象中每个网络都有自己的 EndpointID。
2.9、Gateway
- 含义:容器默认网关 IP(通常是 Docker 网桥的 IP)。
典型值:
- 默认 bridge:172.17.0.1
- 自定义 bridge:如 172.18.0.1
2.10、IPAddress
- 含义:容器在默认网络中的 IPv4 地址。
- 注意:仅在默认 bridge 网络下有效;自定义网络中应看 Networks..IPAddress。
2.11、IPPrefixLen
- 含义:IP 地址的子网掩码长度(CIDR 表示法)。
- 示例:16 → 子网掩码 255.255.0.0,网络范围 172.17.0.0/16
2.12、MacAddress
- 含义:容器虚拟网卡的 MAC 地址。
- 生成规则:Docker 自动生成,通常以 02:42 开头(避免与物理 MAC 冲突)。
2.13、IPv6 相关字段(GlobalIPv6Address, GlobalIPv6PrefixLen, IPv6Gateway)
- 含义:全局 IPv6 地址、前缀长度、网关。
- 注意:Docker 默认禁用 IPv6,需在 daemon.json 中启用。
三、Networks 对象详解(推荐使用)
容器可连接多个网络,Networks 是一个 Map,键为网络名称(如 “bridge”),值为该网络的配置。
3.1、IPAMConfig
- 含义:IP 地址管理配置(如静态 IP 指定)。
- 示例(如果指定了 --ip):
"IPAMConfig": {
"IPv4Address": "172.18.0.100"
}
3.2、Links
- 含义:容器链接(legacy feature,已废弃)。
- 历史:–link 参数创建的依赖关系。
3.3、Aliases
- 含义:在该网络中的DNS 别名。
- 用途:其他容器可通过别名访问本容器。
- 设置方式:docker run --network-alias myapp …
3.4、NetworkID
- 含义:Docker 网络的唯一 ID(对应 docker network ls 的 ID)。
3.5、EndpointID
- 含义:容器在该网络中的端点 ID(与顶层 EndpointID 在默认网络下相同)。
3.6、Gateway, IPAddress, IPPrefixLen, MacAddress
- 含义:同顶层字段,但仅针对当前网络。
- ✅ 这是获取容器 IP 的正确方式(尤其在多网络场景)。
3.7、DriverOpts
- 含义:网络驱动的额外选项(如 host-local IPAM 的参数)。
3.8、Time
- 含义:内部时间戳(通常无实际意义)。
3.9、SkipResolver
- 含义:是否跳过 Docker 内置 DNS 解析器(用于自定义 DNS 场景)。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
