Docker网络模式

1.Docker的网络结构

 

一个容器,使用Docker命令跑起来后,一般只有一个eth0网卡,多个网卡的情况很少有。

容器eth0网卡,与宿主机的docker0网桥是一对。

docker网桥的默认地址是 127.0.0.1,作为本机所有容器网关。

 veth接口:是和某个容器在逻辑上是连接的,叫网卡对。容器产生的报文,可以通过mac地址转发给docker网桥。

 

1.1  Docker查看管理网络的参数

 

connect:建立一个网络连接

create:创建一个自定义网络

disconnect:断开一个容器的网络连接

inspect:查看一个容器网络的详细信息

ls:列出所有网络

prune:删除所有容器的网络

rm:删除一个或多个容器网络

 

列出所有网络

#docker network ls
Docker默认网络是圈起来部分

  

 

Bridge模式(重点)

bridge模式是docker默认的,也是开发者最常使用的网络模式
创建容器不指定任何模式就是bridge模式。该模式会分配自己的网络IP等信息,并将容器连接到一个虚拟网桥与外界通信,

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),
另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0 中。

可以通过 brctl show 命令查看。如果没有 brctl 命令可以安装 yum install bridge-utils,如图

 

 

 

演示:

以centos 容器为例, 创建centos 容器,命名为 centos-1

[root@docker-31 ~]# docker run -it --name centos-1 centos  /bin/bash

 

 

host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的 Network Namespace,
而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,
而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等 还是 和宿主机隔离的。

容器和宿主机具有相同的IP地址10.0.7.197。
当使用host模式网络时,容器实际上继承了宿主机的IP地址。

该模式比 bridge 模式更快(因为 没有开销),但是它因为与宿主机IP相同,所以只能通过端口来进行 服务的区分。

采用host模式的容器,可以直接使用宿主机的IP地址与外界进行通信,若宿主机具有公有IP,那么容器也拥有这个公有IP。
同时容器内服务的端口也可以使用宿主机的端口,无需额外进行NAT转换,
而且由于容器通信时,不再需要通过linuxbridge等方式转发或者数据包的拆封,性能上有很大优势。

当然,这种模式有优势,也就有劣势,主要包括以下几个方面:

• 最明显的就是容器不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈的使用,并且容器的崩溃就可能导致宿主机崩溃,
在生产环境中,这种问题可能是不被允许的,将容器直接暴露在公共网络中,是有安全隐患的。。

• 容器内部将不再拥有所有的端口资源,因为一些端口已经被宿主机服务、bridge模式的容器端口绑定等其他服务占用掉了。

 

 

 演示:

启动centos-2 容器,以 --net=host 指定网络连接为 host模式

#docker run -it  --net=host  --name centos-2 centos /bin/bash

直接进入 容器了,查看容器IP地址,发现看到的就是宿主机的网络信息。

宿主机上查看

# docker ps

CONTAINER ID       IMAGE        COMMAND      CREATED           STATUS      PORTS           NAMES
25ead3e11eaf        centos          "/bin/bash"      36 seconds ago     Up            35 seconds       centos-2
dff3b564f291          centos          "/bin/bash"      26 minutes ago     Up             26 minutes        centos-1

 

 

Container模式(也叫 其它容器模式)

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
两个容器的进程可以通过 lo 网卡设备通信。

演示:以  --net=container:指定名称或ID

#docker run -tid --net=container:docker_bri1  --name docker_con1 ubuntu-base:v3
#docker exec -ti docker_con1 /bin/bash
#docker exec -ti docker_bri1 /bin/bash

 

None模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器 没有网卡、IP、等信息。需要我们自己为 Docker 容器添加网卡、配置IP等。

在这种模式下,容器有独立的网络栈,但不包含任何网络配置,只具有lo这个loopback网卡用于进程通信。
也就是说,none模式为容器做了最少的网络设置,在没有网络配置的情况下,
通过第三方工具或者手工的方式,开发这任意定制容器的网络,提供了最高的灵活性

演示:以--net=none指定网络模式

#docker run -tid --net=none --name docker_non1 ubuntu-base:v3
#docker exec -ti docker_non1 /bin/bash

 

容器跨主机通信需要打开 ipv4服务,否则容器无法跨主机进行通信

 

posted @ 2022-02-08 11:12  小小一兆  阅读(89)  评论(0编辑  收藏  举报