Docker Host网络

认识Docker Host网络

Docker容器运行默认会分配独立的Network Namespace隔离子系统,但是如果基于Host网络模式,容器就不会有一个独立的Network Namespace,而是和宿主机公用一个Network Namespace,这就意味着容器不会虚拟对应的网卡和ip信息,而是直接使用宿主机的ip和端口

在这里插入图片描述

实际操作

首先创建容器c1使用Bridge网络

root@VM-24-7-ubuntu:~# docker container run --name c1 -itd busybox
fad6ed0ba5013aaf184e5bfd8a9254c203f2f466b49195c75d4b8826c536377c

创建容器c2使用Host网络

root@VM-24-7-ubuntu:~# docker container run --name c2 -itd --network=host busybox
3f144b8716af3f113333d1aced10d357e23d4f1eec3f945be074da9dd6b11d6c

网络模式区别

那这两个网络模式有什么区别呢?

Bridge 网络

  • 独立网络空间:Bridge模式为容器提供了一个独立的网络栈和IP地址空间。Docker会创建一个虚拟网桥(默认为docker0),并将容器连接到这个网桥上。每个容器在该网络中都有自己的IP地址,这些地址通常不同于宿主机的IP地址范围,形成了一个逻辑上隔离的网络环境。
  • 容器间隔离:在Bridge网络中,每个容器默认是相互隔离的,除非它们被连接到同一个自定义网络或者进行了特定的端口映射。这意味着容器之间需要通过IP地址或容器名(在支持的网络配置下)进行通信。
  • 外部访问:容器可以通过NAT转换经由宿主机访问外部网络。外部网络到容器的访问通常需要通过宿主机的端口映射来实现。

Host 网络

  • 共享宿主机网络栈:选择Host网络模式的容器将直接使用宿主机的网络栈,这意味着容器不再拥有独立的网络空间。容器将共享宿主机的网络设备、端口、IP地址等网络资源。
  • 网络透明性:在这种模式下,容器内的网络服务(如Web服务器)会直接监听在宿主机的网络接口上,没有网络地址转换(NAT)的开销,也无需进行端口映射。容器内的进程就像直接在宿主机上运行一样,可以直接通过宿主机的IP地址和端口对外提供服务或访问外部资源。
  • 无隔离:因为容器与宿主机共享网络命名空间,容器内的网络活动对宿主机完全透明,反之亦然,这也意味着容器间没有网络隔离的概念,任何容器内的服务都可以直接访问宿主机网络上的所有服务,同时也要小心处理端口冲突问题。

同时,需要注意的是:如果现在有一个容器c1用的是Host网络,那么在他上面部署服务,占据的是我真实宿主机上的端口号,例如,如果在容器c1中运行一个Web服务监听80端口,那么这个Web服务对于外部网络而言,就是直接通过宿主机的80端口访问的。因此,如果宿主机上已经有其他服务占用了80端口,那么容器内的服务将无法正常启动,或者会导致端口冲突。

使用Host网络模式时,需要特别注意端口占用的问题,并确保容器内的服务配置不会与宿主机上的服务产生冲突。同时,由于网络的透明性,这种方式也提供了最低的网络延迟,适合于对网络性能有严格要求的场景或者在调试过程中需要直接与宿主机网络交互的情况。

那这两个有什么使用场景?

使用场景

在Bridge网络在通信的时候需要进行端口转发以及NAT地址转换,这会消耗掉一些资源以及性能,而如果使用Host网络最大的好处就是性能好,如果容器对于网络传输效率有很高的需求场景下,那么选择Host网络会更好,这会减少很多成本

Docker Container网络

认识Docker Container网络

Docker Container的other container网络模式是Docker中一个比较特殊的网络模式,被称作是other container模式,这个模式下的Docker Container,会使用其他容器的网络环境,之所以特别,是因为这个模式下的网络隔离环境会处于在Bridge桥接模式和Host模式之间,Docker Container共享其他容器的网络环境,起码在这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离

这样的网络模式,如下所示:

在这里插入图片描述
Docker Container的other container网络模式的基本逻辑是:

  1. 查找other container的网络Namespace
  2. 将新创建的Docker Container的Namespace使用other Container的Namespace

这一点其实和C++的命名空间比较像,这里就不多进行赘述了

操作实例

创建一个容器

root@VM-24-7-ubuntu:~# docker container run -itd --name netcontainer busybox
e33f58442fbfe86430ed0ac57b9626ae12d5082a816bbc6a3a0ad33709ad37fe

使用netcontainer的网络创建另外一个容器

root@VM-24-7-ubuntu:~# docker run -itd --name netcontainer2 --network container:netcontainer busybox
7d4a54e662b96563566257b3d06f904191825811836ec729d423d6dd019cbe9c

进入两个容器,看一下ip信息

此时会发现,ip信息和mac地址是一样的

root@VM-24-7-ubuntu:~# docker exec -it netcontainer ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
root@VM-24-7-ubuntu:~# docker exec -it netcontainer2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0

暂停容器1,再看容器2

root@VM-24-7-ubuntu:~# docker stop netcontainer
netcontainer
root@VM-24-7-ubuntu:~# docker exec -it netcontainer2 ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

此时就会发现,网卡信息消失了

再重新启动容器1和容器2

现在就又恢复了:

root@VM-24-7-ubuntu:~# docker restart netcontainer netcontainer2
netcontainer
netcontainer2
root@VM-24-7-ubuntu:~# docker exec -it netcontainer2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:806 (806.0 B)  TX bytes:0 (0.0 B)

使用场景

这种模式下的Docker Container可以借助localhost来访问Namespace下的其他容器,传输效率极高,但是会导致存在依赖关系,如果有一个重启了,另外一个就不可用了

Docker None网络

None网络就是没有网络,除了本地回环以外没有任何内容

这个还是很简单的,这里就不多说了

使用场景

针对于一些要求安全性非常高,并且还不用联网的应用,用None网络比较合适

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐