docker inspect 输出中的 NetworkSettings 字段包含了容器网络配置的详细信息。 NetworkSettings 分为两部分:

  • 顶层字段(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
    }
  }
}


# host模式
{
  "Bridge": "",
  "SandboxID": "26023e5f0a154911c0e1ad4ed24ae46217a4a61691287c07966fea8ef6ba53af",
  "HairpinMode": false,
  "LinkLocalIPv6Address": "",
  "LinkLocalIPv6PrefixLen": 0,
  "Ports": {},
  "SandboxKey": "/var/run/docker/netns/default",
  "SecondaryIPAddresses": null,
  "SecondaryIPv6Addresses": null,
  "EndpointID": "",
  "Gateway": "",
  "GlobalIPv6Address": "",
  "GlobalIPv6PrefixLen": 0,
  "IPAddress": "",
  "IPPrefixLen": 0,
  "IPv6Gateway": "",
  "MacAddress": "",
  "Networks": {
    "host": {
      "IPAMConfig": null,
      "Links": null,
      "Aliases": null,
      "NetworkID": "314b9a2c301996ae10d61cf21321c11157bc307683c657a5461a7c62c975bea0",
      "EndpointID": "",
      "Gateway": "",
      "IPAddress": "",
      "IPPrefixLen": 0,
      "IPv6Gateway": "",
      "GlobalIPv6Address": "",
      "GlobalIPv6PrefixLen": 0,
      "MacAddress": "",
      "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。
  • 如示例中bridge 模式中的"172.17.0.3", host 模式为空,与宿主机ip 一致

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 场景)。

四、docker network 命令

https://blog.csdn.net/yuelai_217/article/details/160111829

五、参考文档

1、https://blog.csdn.net/yuelai_217/article/details/157428034
2、https://blog.csdn.net/yuelai_217/article/details/157548664
3、https://blog.csdn.net/yuelai_217/article/details/158067828
4、https://blog.csdn.net/yuelai_217/article/details/160111829

更多推荐