《再见少年拉满弓》

东风吹破少年梦,从此再无赤子心。
黄昏重铸英雄梦,再见少年拉满弓。
再见少年拉满弓,不惧岁月不惧风,
少年扶摇上九重,胸中豪情破苍穹。

image-20240617101725751

  • bridge模式:–net=bridge 桥接模式(默认设置,自己创建也使用bridge 模式)
  • host模式:–net=host 和宿主即共享网络
  • container模式:–net=container:NAME_or_ID 容器网络连通!(很少用,局限性很大!)
  • none模式:–net=none 不配置网络

查看所有的docker网络

命令:docker network ls

1
2
3
4
5
6
@penge ➜ toktik git(main)  docker network ls
NETWORK ID NAME DRIVER SCOPE
151c5fe4b87c bridge bridge local
5c21b13981a4 host host local
c51c6b57875f none null local
b0165c5b9c95 yaml_default bridge local

bridge 网桥模式

Docker安装启动后会在宿主主机上创建一个名为 docker0 的虚拟网桥,处于七层网络模型的数据链路层,后续每当我们创建一个新的docker容器,在不指定容器网络模式的情况下,docker会通过 docker0 与主机的网络连接,docker0 相当于网桥。

补充:网桥,也被称为网络桥接器或桥接器,是一种用于连接同一种或不同种类的网络段以形成一个大网络的设备。它的工作方式类似于路由器,但是它通常只用于连接本地网络(LAN)。

使用 bridge 模式新创建的容器,容器内部都会有一个虚拟网卡,名为 eth0,容器之间可以通过容器内部的IP相互通信。

image-20240617102059535

解释上图:在该模式中,Docker 会创建一个虚拟以太网桥 docker0,新建的容器会自动桥接到这个接口,然后docker会依据docker0在创建的时候设立的网络段给容器分配ip。

Note:但默认的方式存在一个问题,就是每次重启docker默认的网络段也会发生变化,而采用该网络段的docker容器也会跟着发生变化。当然我们也可以自定义一个网络段,然后自己给创建的容器分配指定的ip。

命令:docker run -d -name tomcat01 --net=bridge -p 8085:80 tomcat:latest
说明:

  • –net=bridge 可省略 ,-p 指定端口映射
  • 网桥默认 IP 范围是一般都是 172.17.x.x

host 模式

如果指定的host模式容器不会拥有一个独立network namespace,而是与宿主主机共用network namespace。也就说明容器本身不会有的网卡信息,而是使用宿主主机的网络信息。容器除了网络,其他比如文件系统、进程等依然都是隔离的。

  • host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定;
  • 采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;
  • host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

image-20240617102245846

说明:

  • –net=host 指定
  • 容器和宿主主机共享 Network namespace
  • host模式因为和宿主主机共享network namespace,会有可能出现端口冲突的情况。

container模式

container模式和host模式很类似,host模式和宿主主机共享network namespace;container模式和指定的容器共享,两者之间除了网络共享(网卡、主机名、IP 地址),其他方面还是隔离的。

image-20240617102450256

命令:docker run -d -name tomcat02 --net=container:name/id -p 8000:80 tomcat:latest
说明:

  • –-net={容器id 或容器name} 指定
  • 当前容器和另外一个容器共享 Network namespace

none模式

如果dockers容器指定的网络模式为none,该容器没有办法联网,外界也无法访问它,可以用来本次测试。

命令:docker run -d -name tomcat02 --net=none -p 8000:80 tomcat:latest
说明:

  • –net=none 指定
  • 容器有独立的Network namespace,但并没有对其进行任何网络设置,如果需要的话,需要自定义配置网络

Docker 网络桥接模式和 Host 模式的区别

首先,我们需要了解一下 Docker 的两种网络模式之间的区别。在桥接网络模式下,Docker 将为每个容器创建一个独立的网络命名空间,并为容器分配一个|P 地址。而在 Host 网络模式下,容器将直接使用主机的网络栈,与主机共享网络接口和 IP 地址,这意味着容器可以直接访问主机上的所有网络服务,同时也会导致容器与主机网络之间的隔离性降低。

学习自:docker网络配置:bridge模式、host模式、container模式、none模式

优秀教程:Docker 网络模式详解及容器间网络通信