docker - 关于network的一些理解
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_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
在创建overlay网络之前,我们需要先搭建swarm集群,详细内容可以参考我之前的随笔:
Docker - 运行 containers 使用在 swarm 模式下创建的 overlay 模式的 network
Docker 内置的DNS server
在这里,我们会很好奇为什么docker能够做到container之间的通信呢? 答案就是 docker 内置的 DNS server. 关于他的详细介绍,请参考官网链接。
https://docs.docker.com/engine/userguide/networking/configure-dns/