网站搜索

解释 Docker 网络概念


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

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

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

Docker 使用基础知识:

  • Docker 入门

解释 Docker 网络概念

下面列出的所有命令均在 Ubuntu 上使用 root 权限进行测试。

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

docker network

Docker 网络驱动程序的类型

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

docker network ls

让我们对它们进行一些简短的介绍。

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

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

1.桥接网络

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

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

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

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

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

可以看到,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

同样,连接到 C2 容器并尝试 ping C1 容器。

docker attach c2
Ping –c 2 172.17.0.2

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

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

docker network inspect bridge

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

1.1 创建用户自定义桥接网络

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

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

docker network create my_net

或者,

docker network create --driver bridge dhruv_net

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

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

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

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 其他两个容器。

从上面的截图可以看出,容器之间是可以进行通信的。

2. 主机网络

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

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

这里,我们使用netstat -ntlp命令来显示服务器上的监听端口。要查找哪个服务正在侦听特定端口,请参阅本指南

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

  • Docker容器网络

建议阅读:

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

作者简介:

Dhruv Tiwari 是一名 DevOps 工程师,他喜欢自动化事物,喜欢大规模使用 Linux,并梦想有一天系统足够智能,永远不需要登录 Linux 机器。 CI/CD 从源代码到代码部署再到生产的旅程。