解释 Docker 网络概念

Docker 网络 基本上是用来通过宿主机建立docker容器与外界的通信,或者可以说它是一个通信通道,所有隔离的容器通过它在各种情况下相互通信以执行所需的操作。 在本指南中,我们将通过 Ubuntu 上的实际示例来解释基本的 Docker 网络概念。

如果您尚未安装 Docker,请参阅以下指南。

  • 如何在 Ubuntu 18.04 LTS 服务器中安装 Docker

Docker使用基础:

  • 开始使用 Docker

解释 Docker 网络概念

下面列出的所有命令都经过测试 特权 Ubuntu.

要管理网络操作,例如创建新网络、将容器连接到网络、断开容器与网络的连接、列出可用网络和删除网络等,我们使用以下命令:

# docker network

docker 网络驱动程序的类型

要列出所有网络,请运行:

# docker network ls

让我们对所有这些做一些简短的介绍。

  1. 桥接网络: 启动 Docker 时,会自动创建一个默认的桥接网络。 一个新启动的容器会自动连接到它。 您还可以创建用户定义的自定义桥接网络。 用户定义的桥接网络优于默认的桥接网络。
  2. 主机网络: 它消除了容器和 Docker 主机之间的网络隔离,直接使用主机的网络。 如果您运行绑定到端口 80 的容器并使用主机网络,则容器的应用程序可在主机 IP 地址的端口 80 上使用。 意味着您将无法在同一主机上运行多个 Web 容器,在同一端口上,因为该端口现在对主机网络中的所有容器都是通用的。
  3. 无网络: 在这种网络中,容器不连接到任何网络,也无法访问外部网络或其他容器。 因此,当您想要完全禁用容器上的网络堆栈时,将使用此网络。
  4. 覆盖网络: 创建一个跨越参与 swarm 集群的所有节点的内部专用网络。 因此,覆盖网络促进了 docker swarm 服务和独立容器之间的通信,或者不同 Docker 守护进程上的两个独立容器之间的通信。
  5. 麦克兰网络: 一些应用程序,尤其是遗留应用程序或监控网络流量的应用程序,期望直接连接到物理网络。 在这种情况下,您可以使用 Macvlan 网络驱动程序为每个容器的虚拟网络接口分配一个 MAC 地址,使其看起来是直接连接到物理网络的物理网络接口。

请允许我向您展示桥接和主机网络的动手练习。

1. 桥接网络

我将使用两个 Alpine 容器来解释这种类型的网络。

现在,我将运行两个 Alpine 容器,即 C1C2 使用命令:

# docker run -it -d --name c1 alpine ash
# docker run -it -d --name c2 alpine ash

运行 Alpine 容器

接下来,让我们找出那些正在运行的容器的 IP 地址。 为此,请运行:

# docker exec -it c1 sh –c “ip a”
# docker exec -it c2 sh –c “ip a”

显示容器的 IP 地址

可以看到,C1容器的IP地址是 172.17.0.2 C2的IP地址是 172.17.0.3.

现在让我们继续尝试互相 ping 以确保他们是否能够通信。

首先,附加到正在运行的 C1 容器并尝试 ping C2 容器:

# docker attach c1
# Ping –c 2 172.17.0.3

附加到 C1 容器和 Ping C2 容器

同样,附加到 C2 容器并尝试 ping C1 容器。

# docker attach c2
# Ping –c 2 172.17.0.2

从 C2 容器 ping C1 容器

正如您在上面的屏幕截图中看到的,通信发生在同一网络中的容器之间。

我们还可以通过使用命令检查桥接网络来验证它:

# docker network inspect bridge

上面的命令将显示网络的所有信息,例如网络类型、子网、网关、容器名称和 iip 地址等。

显示桥接网络详细信息

1.1 创建自定义桥接网络

就像我已经说过的,当你启动 Docker 时, 默认桥接网络是自动创建的. 所有新启动的容器都会自动连接到它。 但是,您也可以创建用户定义的自定义桥接网络。

要创建新的网络驱动程序,只需运行:

# docker network create my_net

或者,

# docker network create --driver bridge dhruv_net

这两个命令将执行相同的工作。 如果您不指定驱动程序名称,它将在默认网络驱动程序中创建,即 .

创建用户定义桥接网络

在 dhruv_net 等用户定义的网络上,容器不仅可以通过 IP 地址进行通信,还可以将容器名称解析为 IP 地址。 这种能力称为 自动服务发现.

为了确保容器之间是否可以相互通信,让我们运行三个 alpine 容器,即 A1, A2A3dhruv_net 我们之前创建的网络。

# docker run -it -d --name A1 --network dhruv_net alpine ash
# docker run -it -d --name A2 --network dhruv_net alpine ash
# docker run -it -d --name A3 --network dhruv_net alpine ash

在用户定义的桥接网络上运行容器

现在尝试附加到任何一个容器并使用容器名称 ping 其他两个。

附加和 ping 容器

从上面的截图可以证明容器之间是可以相互通信的。

2.主机网络

我们正在运行一个使用主机网络绑定到端口 80 的容器,容器的应用程序在主机 IP 地址的端口 80 上可用。

使用主机网络运行容器

仅当您运行具有非常特定网络的程序时才需要主机网络。 从网络的角度来看,在 Docker 容器中运行的应用程序看起来就像在主机本身上运行。 它允许容器比它通常可以获得的更大的网络访问权限。

在这里,我们使用 网络统计-ntlp 命令显示服务器上的侦听端口。 要查找哪个服务正在侦听特定端口, 本指南.

我们只介绍了 Docker 网络概念的基础知识。 有关更多详细信息,我建议您查看下面随附的 Docker 网络指南。

建议阅读:

  • 解释 Docker 卷
  • 如何自动更新正在运行的 Docker 容器
  • ctop – Linux 容器的命令行监控工具
  • Portainer – 管理 Docker 的最简单方法
  • PiCluster – 一个简单的、基于 Web 的 Docker 管理应用程序
  • Dockly – 从终端管理 Docker 容器

关于作者:

德鲁夫·蒂瓦里 是一名 DevOps 工程师,他喜欢自动化事物,大规模地使用 Linux,并梦想有一天系统足够智能,无需登录 Linux 机器。 CI/CD 从源代码到代码部署再到生产的旅程。

感谢您的光临!

帮助我们帮助您:

祝你有美好的一天!!