如何使用 docker network connect 命令管理容器网络

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用 docker network connect 命令有效地管理容器网络。你将探索如何将一个正在运行的容器连接到现有网络,在容器初始启动时将其连接到网络,为网络上的容器指定静态 IP 地址,以及为容器创建网络别名以方便通信。

通过实践练习,你将获得操作容器网络配置的实际经验,从而能够构建更强大且相互连接的 Docker 化应用程序。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-555173{{"如何使用 docker network connect 命令管理容器网络"}} docker/ps -.-> lab-555173{{"如何使用 docker network connect 命令管理容器网络"}} docker/rm -.-> lab-555173{{"如何使用 docker network connect 命令管理容器网络"}} docker/network -.-> lab-555173{{"如何使用 docker network connect 命令管理容器网络"}} end

将运行中的容器连接到网络

在这一步中,你将学习如何将一个正在运行的 Docker 容器连接到现有网络。当你有一个已经在运行的容器,并且需要它与特定网络上的其他容器或服务进行通信时,这非常有用。

首先,让我们创建一个新的网络,用于本次演示。我们将创建一个名为 my-network 的桥接网络。

docker network create my-network

你应该会看到类似以下的输出,表明网络已成功创建:

<network_id>

现在,让我们运行一个最初未连接到 my-network 的简单容器。我们将以分离模式 (-d) 运行一个 alpine 容器,并将其命名为 my-container

docker run -d --name my-container alpine sleep infinity

输出将是容器 ID:

<container_id>

为了验证容器正在运行且未连接到 my-network,你可以检查容器的网络设置。

docker inspect my-container --format '{{json .NetworkSettings.Networks}}'

输出将显示默认的桥接网络,但不显示 my-network

{
  "bridge": {
    "IPAMData": null,
    "IPAddress": "<ip_address>",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "<mac_address>",
    "DriverOpts": null
  }
}

现在,让我们使用 docker network connect 命令将正在运行的 my-container 连接到 my-network

docker network connect my-network my-container

如果命令成功,将不会有输出。

为了验证容器现在已连接到 my-network,再次检查容器的网络设置。

docker inspect my-container --format '{{json .NetworkSettings.Networks}}'

这次,输出应该同时显示默认的桥接网络和 my-network

{
  "bridge": {
    "IPAMData": null,
    "IPAddress": "<ip_address>",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "<mac_address>",
    "DriverOpts": null
  },
  "my-network": {
    "IPAMData": null,
    "IPAddress": "<ip_address>",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "<mac_address>",
    "DriverOpts": null
  }
}

最后,让我们清理我们创建的容器和网络。

docker stop my-container
docker rm my-container
docker network rm my-network

在容器启动时将其连接到网络

在这一步中,你将学习如何在启动 Docker 容器时将其连接到特定网络。这是确保容器从一开始就处于正确网络的最常见方法。

首先,让我们创建一个名为 app-network 的新网络供我们使用。

docker network create app-network

你应该会看到类似以下的输出,表明网络已成功创建:

<network_id>

现在,我们将运行一个简单的 nginx 容器,并在启动时直接将其连接到 app-network。我们使用 --network 标志,后面跟上网络名称。我们还将以分离模式 (-d) 运行它,并将其命名为 web-server

docker run -d --name web-server --network app-network nginx

输出将是容器 ID:

<container_id>

为了验证容器已连接到 app-network,你可以检查容器的网络设置。

docker inspect web-server --format '{{json .NetworkSettings.Networks}}'

输出应该显示容器已连接到 app-network

{
  "app-network": {
    "IPAMData": null,
    "IPAddress": "<ip_address>",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "<mac_address>",
    "DriverOpts": null
  }
}

注意,这次容器仅连接到 app-network,而不是默认的桥接网络,因为我们在 docker run 命令中指定了网络。

最后,让我们清理容器和网络。

docker stop web-server
docker rm web-server
docker network rm app-network

为网络上的容器指定 IP 地址

在这一步中,你将学习如何在将容器连接到网络时为其分配特定的静态 IP 地址。默认情况下,Docker 会从网络的子网中动态分配 IP 地址。然而,在某些情况下,你可能需要容器具有可预测的 IP 地址。

首先,让我们创建一个具有指定子网的新网络。我们将创建一个名为 static-net 的桥接网络,子网为 172.20.0.0/16

docker network create --subnet 172.20.0.0/16 static-net

你应该会看到类似以下的输出,表明网络已成功创建:

<network_id>

现在,我们将运行一个 alpine 容器,并将其连接到 static-net,使用 --ip 标志指定一个静态 IP 地址。我们将分配 IP 地址 172.20.0.10。我们将以分离模式 (-d) 运行它,并将其命名为 static-ip-container

docker run -d --name static-ip-container --network static-net --ip 172.20.0.10 alpine sleep infinity

输出将是容器 ID:

<container_id>

为了验证容器在 static-net 上具有分配的静态 IP 地址,检查容器的网络设置。

docker inspect static-ip-container --format '{{json .NetworkSettings.Networks}}'

输出应该显示容器以指定的 IP 地址连接到 static-net

{
  "static-net": {
    "IPAMData": null,
    "IPAddress": "172.20.0.10",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "<mac_address>",
    "DriverOpts": null
  }
}

最后,让我们清理容器和网络。

docker stop static-ip-container
docker rm static-ip-container
docker network rm static-net

为容器创建网络别名

在这一步中,你将学习如何为容器创建网络别名。网络别名提供了同一网络上其他容器可用于解析和连接该容器的替代名称。这在 Docker 网络内的服务发现中非常有用。

首先,让我们创建一个名为 alias-network 的新网络。

docker network create alias-network

你应该会看到类似以下的输出,表明网络已成功创建:

<network_id>

现在,我们将运行一个 nginx 容器,并将其连接到 alias-network,使用 --network-alias 标志分配一个网络别名。我们将分配别名 web。我们将以分离模式 (-d) 运行它,并将其命名为 alias-container

docker run -d --name alias-container --network alias-network --network-alias web nginx

输出将是容器 ID:

<container_id>

为了验证容器具有网络别名,检查容器的网络设置。

docker inspect alias-container --format '{{json .NetworkSettings.Networks}}'

输出应该显示容器已连接到 alias-network 并列出网络别名:

{
  "alias-network": {
    "IPAMData": null,
    "IPAddress": "<ip_address>",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "<mac_address>",
    "Aliases": ["web", "alias-container"],
    "DriverOpts": null
  }
}

注意输出中的 "Aliases":["web","alias-container"] 部分。Docker 也会自动将容器名称添加为别名。

现在,让我们在同一网络上运行另一个容器,并尝试使用其网络别名 web 来 ping alias-container。我们将在 alias-network 上以交互式模式 (-it) 运行一个 alpine 容器。

docker run -it --rm --network alias-network alpine ping -c 3 web

你应该会看到表明使用别名 web 成功 ping 通 alias-container 的输出:

PING web (<ip_address>): 56 data bytes
64 bytes from <ip_address>: seq=0 ttl=64 time=0.xxx ms
64 bytes from <ip_address>: seq=1 ttl=64 time=0.xxx ms
64 bytes from <ip_address>: seq=2 ttl=64 time=0.xxx ms

--- web ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.xxx/0.xxx/0.xxx/0.xxx ms

这表明同一网络上的容器可以使用网络别名相互解析和通信。

最后,让我们清理容器和网络。

docker stop alias-container
docker rm alias-container
docker network rm alias-network

总结

在本次实验中,你学习了如何使用 docker network connect 命令管理 Docker 容器网络。你练习了将一个正在运行的容器连接到现有网络,展示了如何在容器启动后动态地为其添加网络连接。

此外,你还探索了如何在创建容器时将其连接到特定网络、为网络上的容器指定静态 IP 地址,以及创建网络别名以为网络内的容器提供替代名称,从而增强容器之间的可发现性和通信能力。