什么是 Docker 网络模式?
Docker容器是轻量级的独立单元,可以在同一主机上运行多个容器。为了让这些容器能够相互通信以及与外部世界进行交互,Docker提供了不同的网络模式。这些网络模式可以分为四大类:
- Bridge 网络模式:默认模式,用于在单个主机上运行多个容器,容器之间可以通过IP地址进行通信。将容器连接到一个docker0
- Host 网络模式:容器共享主机的网络栈,与主机共享相同的网络命名空间,使容器能够访问主机的网络接口。
- container 网络模式:新创建的容器不会创建自己的网IP,而是和一个指定的容器共享IP,端口范围等。
- None 网络模式:容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pair和网桥连接,ip等。
在本文中,我们将更详细地介绍Bridge网络模式。
Bridge 网络模式
Bridge网络模式是Docker的默认网络模式,它为容器提供了一种简单的网络连接方式。在这种模式下,Docker引擎在主机上创建一个虚拟的网络桥接接口,容器连接到这个网络桥接接口。每个容器都会被分配一个唯一的IP地址,可以用于容器之间的通信。
整个宿主机的网桥模式都是docker0,此时我们就把docker0看成是鲸鱼的一整张背吧,这个背上有许多接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通,这样一对接口叫做veth pair,容器内部有一块虚拟网卡,每个接口叫eth0。docker0上的每个veth匹配某个容器实例内部的eth0。此时宿主机上的所有容器都连接到了这个内部网络上,即可完成两两容器间网络的互通。
但要注意,使用bridge模式时,每当容器变动时,比如说重启容器或删除一个容器,容器的ip地址也会随之变动。这会对开发者造成一定的困扰
要解决这个问题。可在Docker中利用服务名直接通信而不是IP地址。我们可以使用Docker内置的服务发现和DNS解析功能。Docker提供了内置的DNS服务器,它允许容器使用服务名称来解析其他容器的IP地址,而无需手动指定IP地址。以下是如何实现这一目标的一般步骤:
-
创建一个自定义的Docker网络:首先,创建一个自定义的Docker网络,这将允许容器在同一网络内通过服务名称进行通信。使用以下命令创建网络:
docker network create my-network<br />
-
运行容器并将其连接到该网络:运行容器时,确保将它们连接到刚刚创建的自定义网络。您可以使用
--network
标志来指定容器连接到的网络。docker run -d --name container1 --network my-network your-image1
<br /> docker run -d --name container2 --network my-network your-image2<br />
请注意,
container1
和container2
是容器的名称,可以使用它们来识别容器,而不必担心它们的IP地址。 -
使用容器名称进行通信:现在,可以在一个容器中使用其他容器的名称来进行通信。Docker内置的DNS服务器将会为容器的名称提供IP地址解析。
Docker将自动将
container2
解析为其IP地址,从而允许container1
与container2
进行通信。 -
重点!!!要想用上述方法解决该问题,一定要创建自定义网络!因为自定义网络本身就维护好了主机名和ip的对应关系!!!
下图容器创建时使用的是默认的网络模式,无法ping通
下图容器创建时使用了自定义的网络模式luxy,成功ping通
总结:
Docker的网络功能为容器化应用提供了强大的灵活性和可扩展性。通过不同的网络模式,我们可以根据应用程序的需求选择合适的网络配置。在本博客中,重点介绍了Bridge网络模式,它是Docker的默认网络模式,适用于大多数单主机应用。