获取 Docker 容器的 IP 地址

本教程演示如何获取 Docker 容器 IP 地址的 IP 地址。

连接到 Bridge 网络并获取 Docker 容器的 IP 地址

docker 容器如此方便的重要原因之一是我们可以轻松地连接它们。这允许容器通信并轻松共享资源。

我们还可以将容器连接到无 docker 工作负载。

这篇文章不是关于 docker 网络的;因此,我们不会深入研究 docker 网络的细节。但是,docker 提供了各种驱动程序,使用桥驱动程序使网络可插入。

Docker 允许我们使用其默认驱动程序(称为桥接驱动程序)创建网络。但是,桥接网络是私有的,其范围仅限于主机上的容器。

你可以查看主机上的默认网络以及你之前拥有的网络。每个 docker 安装通常包括如下所示的三个默认网络。

isaac@DESKTOP-HV44HT6:~$ docker network lsNETWORK ID     NAME      DRIVER    SCOPE9729860fa596   bridge    bridge    local0667c3f7d0f0   host      host      localc3273b158256   none      null      local

除非另有说明,否则 Docker 将始终在桥接网络中启动新容器。

容器 IP 地址是联网 docker 容器的重要组成部分。通常,容器会为它们连接的每个网络分配一个 IP 地址。

另一方面,你也可以使用以下命令手动将 docker 容器连接到桥接网络。

$ docker run -dt rabbitmq

这将创建一个 docker 容器并将其分配给桥接网络。在我们可以检查网络以确认它是否已连接到它之前,我们应该首先确保容器正在运行。

$ docker psCONTAINER ID   IMAGE      COMMAND                  CREATED              STATUS              PORTS                                                 NAMES42487cad0390   rabbitmq   "docker-entrypoint.s…"   About a minute ago   Up About a minute   4369/tcp, 5671-5672/tcp, 15691-15692/tcp, 25672/tcp   compassionate_keller

检查桥接网络将允许我们查看连接到网络的容器,以及其他详细信息,例如容器的 IP 地址和容器的默认子网。详细信息以 JSON 格式返回,如下所示。

~$ docker network inspect bridge

输出:

"ConfigOnly": false,
        "Containers": {
            "42487cad0390a8de6d1a88bc1d6c09ffdf3162dc85d4d5d3dc70200b2348b673": {
                "Name": "compassionate_keller",
                "EndpointID": "ffa55232565d3a32d1e471d0753c1f491d6131a5cca50b8b76bc43a8ff554e32",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            }

上例中我们容器的 IP 地址是 172.17.0.4/16。

我们也可以有多个容器连接到网络,我们可以通过检查桥接网络轻松找到两者的 IP 地址。如下图,我们在 bridge 网络中添加一个基于 Nginx 镜像的容器。

isaac@DESKTOP-HV44HT6:~$ docker run -dt nginx4ab752ab92582a0eb2cb14475094460fc8cc608c93a357a8dca082cfea2bc368

现在,如果我们检查桥接网络,我们将能够获得两个容器的 IP 地址。请记住,这两个容器应该正在运行。

isaac@DESKTOP-HV44HT6:~$ docker network inspect bridge

输出:

"Containers": {
            "42487cad0390a8de6d1a88bc1d6c09ffdf3162dc85d4d5d3dc70200b2348b673": {
                "Name": "compassionate_keller",
                "EndpointID": "ffa55232565d3a32d1e471d0753c1f491d6131a5cca50b8b76bc43a8ff554e32",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "4ab752ab92582a0eb2cb14475094460fc8cc608c93a357a8dca082cfea2bc368": {
                "Name": "trusting_keller",
                "EndpointID": "a2babd11586f493cf5e57f5d9920a7f5648cf6163e77030521bef62fc9f34a63",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        }

两个容器的 IP 地址按创建顺序分别为 172.17.0.4/16172.17.0.2/16

使用 docker inspect 获取 Docker 容器的 IP 地址

我们还可以使用 docker inspect 和容器名称或容器 id 来查找特定 Docker 容器的 IP 地址。这同样会以 JSON 格式返回许多其他详细信息。

$ docker inspect 42487cad0390

输出:

"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "9729860fa5961eeac55f921ee787b2c82a15146cd36117b5394243be2149e929",
                    "EndpointID": "ffa55232565d3a32d1e471d0753c1f491d6131a5cca50b8b76bc43a8ff554e32",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.4",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:04",
                    "DriverOpts": null
                }
            }

在这种情况下,我们已经根据官方 Nginx 镜像检查了容器。你可以参考 Docker 文档,了解有关联网 Docker 容器的有趣内容。