搞懂Docker网络

在Docker中,提供了四种标准网络模式来执行网络服务:Bridge(桥接)、Host(主机)、Container、none。本文将重点讲解常用的Bridge桥接和Host主机模式。

Bridge桥接

Docker启动后,会在宿主机上创建一个名为Docker0的虚拟网桥,在后续新建Docker容器,在不指定网络的时候默认使用此模式,并通过docker0来实现与主机的网络连接。每一个个容器都会被分配一个虚拟的网络接口和一个私有的 IP 地址,用于在同一个宿主机内通信。

在同一个bridge网络中,不同容器能够直接进行链接,但是无法实现不同的bridge网络中的容器的链接。举个例子:web1、web2容器位于bridge1网络中,web3容器位于bridge2网络中,其中web1 与 web2能够联通,但是两者均无法连接到web3。这是因为每一个bridge网络有着自己的网关、子网和网络命名空间。

在开发中,笔者就遇到了web应用与其他中间件没有存在于同一个bridge网络中导致的无法链接,浪费了大量时间。

那么如何实现bridge1与bridge2之间的容器链接呢?首先是可以将服务暴露在主机的端口中,然后使用本机的ip进行访问,但是这样的行为在公网的生产环境中存在着安全风险,因为需要放开对应的安全组,从而增加安全风险。第二套方案就是将上面的web1与web2也加入到birdge2网络之中,直接使用容器名来访问对应服务。当然第三套方案就是将web服务放置在Host模式中。

Host主机

在Host模式下,Docker 容器不创建独立的网络堆栈,而是共享主机的网络堆栈。这意味着容器中的应用程序可以直接使用宿主机的 IP 地址和端口,容器不再有自己的 IP 地址。

在Host模式下的容器,将会与宿主机共用同一个网络命名空间,容器不会虚拟出自己的ip与端口,但是文件系统等其他的系统仍然保持隔离。

举个例子,处于host模式的web1应用,外部可以直接使用宿主机ip+web1的端口进行访问。同时,如果位于bridge网络的web2,web3容器,并且暴露了端口,web1应用能够使用localhost:端口直接访问到暴露的应用。

Container容器共享

在 Docker 的Container网络模式下,容器可以与另一个已经运行的容器共享相同的网络命名空间。多个容器可以共享相同的 IP 地址和网络端口,这两两个容器之间可以直接使用loaclhost实现直接访问。

None禁用网络

none网络模式就是禁用网络功能,只有127.0.0.1的回环地址。

LICENSED UNDER CC BY-NC-SA 4.0
Comment