Docker网络概念

时间:2020-03-21 11:42:22  来源:igfitidea点击:

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

解释Docker网络概念

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

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

# docker network

Docker网络驱动程序的类型

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

# docker network ls

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

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

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

1.桥接网络

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

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

# 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 容器,即A1,A2和A3.

# 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网络教程。