Docker网络模式与配置Docker自定义网络(bridge模式)

发布时间:2021-07-26 14:49
 

一、简述VMware中三种网络模式

可能,对于许多接触Linux操作系统的朋友而言,起初都是通过虚拟机软件进行层层深入的学习。而对于其中一种软件——VMware软件的网络连接可能就是初学者的一个难题。可能一直都并不了解所提供的三种网络模式的原理和意义。那么本小节将简单讲述一下有关VMware的三种网络模式:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。而此三种分别对应于网卡设备中的VMnet0VMnet1(或者后期新增创建的)、VMnet8NAT网卡也只能有一个)

 

1.1桥接模式

概念:桥接模式就是一种将主机(好比是你的笔记本上的)的网卡与虚拟机的网卡利用虚拟网桥进行通信。

 

原理理解:对这种模式的理解可以认为是将物理机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,当然物理机也一样需要连接到这个交换机,也就是说桥接模式下的所有网卡都是交换模式,相互可以访问而且互不干扰。

 

典型特征:虚拟机的IP地址需要与主机在同一网段,如果需要联网则网关与DNS需要与主机网卡一致。

 

具体可以再通过下面的图示理解:

1.2网络地址转换模式

 

NAT模式的话相对来说应该是最熟悉的了。网络地址转换,既然有地址转换,肯定是发生了转变了。NAT模式就比较适合于IP资源紧缺,而且希望虚拟机可以联网的情况。

 

NAT模式借助的是虚拟的NAT设备以及虚拟的DHCP服务器,从而使得虚拟机可以联网。如下图所示:

1.3仅主机模式

 

仅主机模式呢,其实说白了就是没有NAT设备的网络模式,仅使用的是VMnet1虚拟网卡与虚拟交换机连接,从而与虚拟机通信,而这种模式就实现了虚拟机与外网的隔离,即独立的一台服务器,只与主机互相通信。如下图所示:

好的,现在大概了解了VMware中三种网络模式的原理了吧,现在继续来聊聊在docker中的网络模式。

 

二、docker的网络模式

2.1docker网络实现原理

 

docker使用Linux桥接的方式,即在宿主机虚拟一个docker容器网桥(docker0),docker启动一个 容器时会根据docker网桥的网段分配给容器一个IP地址,这个地址就是容器ip,同时docker就是每个容器的默认网关。因此,同一个宿主机内的容器就可以通过容器ip地址直接通信。

 

一般情况下,我们在安装和启动docker服务之后使用ifconfig命令即可查看到这个docker0的虚拟网桥设备:

从上面显示的结果来看,默认的容器网关地址为172.17.0.1/16哈!当然loopback网卡是回环网卡,测试验证(TCP/IP连接),virtual bridge则是虚拟网桥(想想KVM【云原生】)

 

当然,docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法通过ip地址直接寻址的,这就表明我们需要通过其他的方式来使外部网络可以访问容器,一般会通过访问宿主机ip结合容器的端口(并且端口一般是进行了端口映射,之后会讲述)进行容器的访问。

2.2docker四种网络模式

下面直接通过下面的表格来区分理解一下docker的四种网络模式

docker网络模式

配置

说明

host

 

容器和宿主机共享Network namespace

container模式

 

容器和另外一个容器共享Network namespace

none模式

 

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP

bridge模式

 

默认的模式

其实启动docker服务之后,可以使用docker network相关命令控制管理网络,下面我们查看一下网络列表:(默认存在下面三个)下面逐一介绍(结合第一小节的内容来理解docker 中的网络原理)

2.2.1host模式

host模式结合VMware中的仅主机模式即可理解,通过下图表示一下:

从上图可以看出,如果在启动容器后使用的是host模式,那么这个容器将不会获得一个独立的Network Namespace(网络命名空间),而是和宿主机系统共用一个Network Namespace。并且这就意味着容器将不会虚拟出自己的网卡以及配置自己的ip等,而是使用宿主机的ip以及端口。不过呢,在其他方面例如文件系统等还是与之隔离的。

这种方式最大优势在于网络性能比较好但是缺点也很明显——网络的隔离性很弱。

 

2.2.2container模式

这个模式正如上述表格中的说明一般,是表示指定新创建的容器和已经存在的一个容器共享一个Network Namespace。当然这也表示新建的这个容器不会创建自己的网卡等相关操作,而是和与指定的容器共享这些资源。

 

这种模式也和上述的host差不多,除了网络方面,其文件系统、进程列表等都是隔离的。

参照下图:

2.2.3none模式

 

使用none模式,Docker容器拥有自己的Network Namespace,但是,不会对Docker容器进行任何的网络配置。这就表明这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。这种方式网络的隔离性最为彻底,即表明关闭了容器的网络功能,也无法访问这个容器。

示意图如下:

2.2.4bridge模式

该模式就是我们在启动docker服务后默认的docker网络模式,其会在主机上创建一个名为docker0的虚拟网桥,这个主机上的所有启动的容器就会连接到这个虚拟网桥上。结合VMware中网桥模式原理,想想物理交换机的原理,就不难理解了。

docker0子网中分配一个IP给容器使用,并设置docker0IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Dockerveth pair设备的一端放在新创建的容器中(这个veth对我们在OpenStack中见过,笔者觉得可以将之理解为一个桥梁,建立桥两岸的关系而存在的一种虚拟设备),并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。

 

使用docker run -p 命令时,docker实际是在防火墙做了DNAT规则,实现端口转发的功能。

下面通过一个节点的服务器结构图来理解:

 

当然,这四种模式都不需要手动配置,真正需要配置的是自定义网络。

三、docker网络控制相关命令配置

上面已经给出了对应docker网络控制的命令docker network,下面具体看一下这个命令的具体说明:

docker network的命令用法:

Usage: docker network COMMAND

 

Manage networks

 

Commands:

connect Connect a container to a network

create Create a network

disconnect Disconnect a container from a network

inspect Display detailed information on one or more networks

ls List networks

prune Remove all unused networks

rm Remove one or more networks

3.1桥接命令设置

我们通过尝试、排错和验证的方式来配置docker网络。

因为需要NAT地址转换功能,所以需要开启防火墙,但是核心防护还是关了吧。

我们尝试通过docker网桥方式(桥接)给一个容器设置一个ip地址(自定义的),下面看一下命令执行的结果

首先,由于没有改镜像,所以会先拉取镜像之后创建以及尝试运行容器,但是会遇到报错,报错原因是因为用户自己设置的ip地址只适合于他们自己定义的网络。但是这并不影响镜像的获取与创建,我们尝试运行看看结果:

 

很显然,结果告诉我们还是上述的原因导致了这个问题,好吧只能删除这个容器了。索性还原为初始化环境吧(其实可以去掉--network bridge就不会报错,但是设置的ip地址会不生效,可以自行尝试一下),我们不指定ip地址来试一下,顺便验证一下不加这个参数试试,最后还原为初始化状态后我们再通过自定义的方式来设置ip地址吧。

 

进入容器查看ip地址

那么首先我们需要创建一个自定义的子网段,并且给他一个名称,通过这个网段给对应的容器设置固定的ip地址。

 

查看容器的状态,进入容器查看ip地址

此时发现自定义的网络设置容器ip地址成功了。

本文导读