首页 > 解决方案 > 如何从主机获取所有 Docker 容器的 IP 地址?

问题描述

(类似于How to get a Docker container's IP address from the host? ,但略有不同,因为我们对这里的所有容器都感兴趣)

我遇到了与我们的内部服务器的 IP 冲突,该服务器与 Docker 容器冲突。我已重新配置/etc/docker/daemon.json,将default-address-pools设置设置为另一个网络。但是我现在如何定位我的七个 Docker 容器中的哪一个正在使用这个特定的 IP 网络?

标签: dockernetworking

解决方案


docker network ls通过列出所有 Docker 网络,可以部分帮助您:

$ docker network ls
NETWORK ID          NAME                          DRIVER              SCOPE
3eb73575a250        bridge                        bridge              local
6ce0e4a8be79        centre_isp_services_default   bridge              local
abe7381d0bfd        elasticsearchhq_default       bridge              local
bb4387bdfac2        host                          host                local
cc3e69407994        metrics_default               bridge              local
55f1c6914497        none                          null                local
26f3247f27cc        postgres-112_default          bridge              local

docker network inspect bridge提示信息可在以下位置获得IPAM.Config.Subnet

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "3eb73575a2503d6758f8baed97ec478ebaed3e75df21b4269bd170edd94337de",
        "Created": "2019-11-08T11:33:49.489800945+02:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.31.0.0/24"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

人们本来希望docker network ls --format '{{.Name}} {{.IPAM.Config.Subnet}}'能够向我们提供这些信息,但遗憾的是,事实并非如此。使用该命令只有几个字段可用。

解决方案

所以,我们必须跳过几个圈才能完成它。这可以解决问题:

$ for e in $(docker network ls --format '{{.Name}}') ; do docker network inspect $e --format '{{ printf "%-40s" .Name}} {{.IPAM.Config}}'; done
bridge                                   [{172.31.0.0/24   map[]}]
centre_isp_services_default              [{172.24.0.0/16  172.24.0.1 map[]}]
elasticsearchhq_default                  [{172.23.0.0/16  172.23.0.1 map[]}]
host                                     []
metrics_default                          [{172.22.0.0/16  172.22.0.1 map[]}]
none                                     []
postgres-112_default                     [{192.168.0.0/20  192.168.0.1 map[]}]

推荐阅读