docker 提供给我们多种(4种)网络模式,我们可以根据自己的需求来使用。例如我们在一台主机(host)或者同一个docker engine上面运行continer的时候,我们就可以选择bridge网络模式;而当我们需要在多台host上来运行多个container来协同工作的时候,overlay模式就是我们的首选。

 

当我们完成docker engine的安装以后,docker会在每一个engine上面生成一个3种网络,他们是:bridge, none 还有host。

 

 

默认网络模式 - bridge

 

首先来侃一侃docker0. 之所以说它是默认的网络,是由于当我们运行container的时候没有“显示”的指定网络时,我们的运行起来的container都会加入到这个“默认” docker0 网络。他的模式是bridge。

 

 

无网络模式 - none

顾名思义,所有加入到这个网络模式中的container,都"不能”进行网络通信。貌似有点鸡肋。。。

 

宿主网络模式 - host

这种网络模式将container与宿主机的网络相连通,虽然很直接,但是却破获了container的隔离性,因此也比较鸡肋。。。

 

自定义网络

由于之前介绍的3种自带的网络模式有各自的局限性,因此,docker推荐大家自定义网络。通过自定义网络,我们可以实现“服务发现”与“DNS解析”。

docker 允许我们创建3种类型的自定义网络,bridge,overlay,MACVLAN (目前我还没有用到)。

 

自定义bridge网络

与docker0类似,我们可以自定义bridge网络,通过使用自定义bridge网络,我们就可以实现在一台host上的多个container之间的通信。他的网络模型如下(图片来自docker官网):

docker host模式udp docker host network_自定义

 

docker_gwbridge

他在本质上还是一个local的bridge网络,但是他是我们实现多个host之间的container通信的基础。通常情况下,当我们在链接swarm nodes的时候,docker_gwbridge网络就会被在每一个swarm节点上自动创建出来。

 

自定义Overlay网络

docker提供给我们两种方式来定义overlay网络,在docker1.12之前,我们需要依靠第三方的工具( Consul, Etcd, and ZooKeeper (Distributed store))来通过注册于寄存统一的“key-value”来实现“服务发现”和“DNS解析”,从而达到多个container不同host上的的通信。 但是在docker1.12之后,我们可以直接用“原生态”的swarm来实现“服务发现”和“DNS解析”。

 

swarm在设计之初是为了service(一组container)而服务的,因此通过swarm创建的overlay网络在一开始并不支持单独的container加入其中。但是在docker1.13, 我们可以通过“--attach” 参数声明当前创建的overlay网络可以被container直接加入。


# docker network create --driver=overlay --attachable name=myOverlayNet

 

 

Docker 内置的DNS server

在这里,我们会很好奇为什么docker能够做到container之间的通信呢? 答案就是 docker 内置的 DNS server.  关于他的详细介绍,请参考官网链接。