Docker - 网络


Docker 网络是指使 Docker 容器能够相互通信以及与外部世界通信的机制和配置。这允许容器交换数据、共享资源并与外部网络交互,就像在独立机器上运行的任何传统应用程序一样。Docker 提供不同的网络驱动程序和功能来创建隔离的容器网络、定义网络拓扑和管理网络流量。

在创建和运行具有相互通信组件的多容器应用程序时,Docker 网络至关重要。这还使我们能够将 Web 服务器连接到数据库容器或在更复杂的网络架构中将微服务链接在一起。默认情况下,Docker 创建一个桥接网络,其中该主机上的所有容器都通过该桥接网络连接,并且可以相互通信。但是,Docker 还支持其他网络驱动程序,用于覆盖网络等内容,例如多主机通信,以及用于直接访问主机网络堆栈的主机网络。

Docker 中的网络类型

Docker 提供多个网络驱动程序,可以使用这些驱动程序根据特定需求创建不同类型的网络。每个驱动程序都是独一无二的,提供一组不同的功能和功能,使您能够调整容器之间的通信和隔离。

驱动程序 描述
bridge 默认网络驱动程序。
host 删除容器与 Docker 主机之间的网络隔离。
none 完全隔离容器与主机和其他容器。
overlay 覆盖网络将多个 Docker 守护程序连接在一起。
ipvlan IPvlan 网络提供对 IPv4 和 IPv6 地址的完全控制。
macvlan 为容器分配 MAC 地址。

桥接网络(默认)

  • 这是安装 Docker 时自动创建的默认网络。
  • 提供相同主机上容器之间基本的隔离。
  • 每个桥接网络容器都有一个 IP 地址,允许它通过其 IP 地址或容器名称在同一网络上的容器之间进行通信。
  • 容器也可以使用主机的网络连接来访问外部网络。

主机网络

  • 它消除了容器与主机之间的网络隔离。
  • 容器使用主机的网络命名空间、IP 地址和网络端口。
  • 如果容器需要访问主机网络接口或需要非常低的网络访问延迟,这将非常有用。

无网络

  • 它提供与所有其他网络的完全隔离。
  • 无网络上的容器没有网络接口。
  • 方便用于运行不需要任何网络访问的容器。

覆盖网络

  • 它专为 Docker Swarm 集群中的多主机网络而设计。
  • 允许在不同 Docker 主机上运行的容器相互通信。
  • 它在多个主机上创建虚拟覆盖网络。

Macvlan 网络

  • 为容器分配 MAC 地址,从而使其在网络上看起来像实际设备。
  • 这在您需要将 Docker 容器集成到需要特定 MAC 地址的现有网络中或容器应该直接与某些物理设备通信的情况下很有用。

IPvlan 网络

  • 它提供对容器的 IPv4 和 IPv6 地址的更精细控制。
  • 它提供不同的模式(如 L2 或 L3)以满足不同的隔离和路由需求。

应根据特定用例、所需的隔离级别、通信级别以及与外部网络的集成来选择正确的网络驱动程序。

重要的 Docker 网络命令

要管理 Docker 容器中的网络,您可以使用多个网络命令来创建、管理和检查网络。这些命令可用于配置和维护 Docker 容器中的连接。以下是一些关键的 Docker 网络命令:

创建网络

您可以使用 docker network create 命令创建 Docker 网络。它允许您指定网络的驱动程序和选项。

$ docker network create my_network
Create a Network 1

使用此命令,您还可以指定网络驱动程序(例如,bridge、overlay)。

$ docker network create --driver bridge my_bridge_network
Create a Network 2

列出网络

如果您想列出主机上的所有网络,可以使用 docker network ls 命令。此命令的输出将是所有网络的列表,以及它们的名字和驱动程序。

$ docker network ls
List Networks

检查网络

在使用 Docker 中的网络时,您可能需要获取与主机中网络相关的信息。docker network inspect 命令可帮助您获取与特定网络相关的详细信息。

它提供了重要的详细信息,例如网络的配置、连接的容器和 IP 范围。

$ docker network inspect my_network
Inspect a Network

将容器连接到网络

如果您已经创建了一个网络并希望将其连接到正在运行的容器,则可以使用 docker network connect 命令。这将允许容器与命令中提到的网络上的其他容器通信。

$ docker network connect my_network my_container
Connect a Container to a Network

断开容器与网络的连接

如果网络与容器相关联,并且您希望将其与容器断开连接,则可以使用 docker network disconnect 命令。它将删除容器与指定网络的连接。

$ docker network disconnect my_network my_container
Disconnect a Container from a Network

删除网络

如果不再需要网络,则可以使用 docker network rm 命令将其从系统中删除。借助此命令,您只能删除当前未使用任何容器的网络。

$ docker network rm my_network
Remove a Network

修剪未使用的网络

如果您想删除所有未使用的 Docker 网络以释放资源,则可以使用 docker network prune 命令。在删除所有网络之前,此命令会提示您确认。

$ docker network prune
Prune Unused Networks

其他网络命令

创建覆盖网络

$ docker network create --driver overlay my_overlay_network

创建 Macvlan 网络

$ docker network create --driver macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 -o parent=eth0 my_macvlan_network
Additional Network Commands

结论

在本章中,我们详细讨论了 Docker 网络。我们了解了 Docker 中不同类型的网络驱动程序以及如何使用各种 Docker 网络命令来管理容器连接。这些命令允许您在 Docker 环境中创建、配置和管理网络。

Docker 网络常见问题解答

1. 如何将容器连接到 Docker 中的同一网络?

您可以通过将 --network 标志传递给 docker run 命令或在 docker-compose.yml 中配置网络来实现。您只需在使用 --network 标志调用时使用要连接容器到的网络的名称即可。在 Docker Compose 中,您添加一个网络部分并定义配置。

2. Docker 中的桥接网络和覆盖网络有什么区别?

桥接网络是 Docker 中的默认网络,并根据 IP 提供相同主机上容器之间简单的通信。覆盖网络用于 Swarm 模式,以启用跨多个主机的容器之间的通信 - 每个 Swarm 创建一个跨越 Swarm 的虚拟网络。

3. 如何在 Docker 容器上公开端口?

在启动容器时,您可以使用 –p 或 --publish 选项公开 Docker 容器上的端口。格式很简单:hostPort:containerPort,其中您希望在主机机器上公开 hostPort,而 containerPort 是应用程序在容器中侦听的内容。

4. 如何排查 Docker 中的网络问题?

如果您在 Docker 网络方面遇到一些问题,您需要首先使用 Docker inspect 检查容器的网络配置。您还可以检查容器日志中是否存在与网络相关的任何错误消息。如有必要,您可以使用 docker network 命令列出、检查和诊断 Docker 网络的问题。

广告