docker 提供给咱们多种(4种)网络模式,咱们能够根据本身的需求来使用。例如咱们在一台主机(host)或者同一个docker engine上面运行continer的时候,咱们就能够选择bridge网络模式;而当咱们须要在多台host上来运行多个container来协同工做的时候,overlay模式就是咱们的首选。html
当咱们完成docker engine的安装之后,docker会在每个engine上面生成一个3种网络,他们是:bridge, none 还有host。node
首先来侃一侃docker0. 之因此说它是默认的网络,是因为当咱们运行container的时候没有“显示”的指定网络时,咱们的运行起来的container都会加入到这个“默认” docker0 网络。他的模式是bridge。docker
顾名思义,全部加入到这个网络模式中的container,都"不能”进行网络通讯。貌似有点鸡肋。。。网络
这种网络模式将container与宿主机的网络相连通,虽然很直接,可是却破获了container的隔离性,所以也比较鸡肋。。。ide
因为以前介绍的3种自带的网络模式有各自的局限性,所以,docker推荐你们自定义网络。经过自定义网络,咱们能够实现“服务发现”与“DNS解析”。工具
docker 容许咱们建立3种类型的自定义网络,bridge,overlay,MACVLAN (目前我尚未用到)。post
与docker0相似,咱们能够自定义bridge网络,经过使用自定义bridge网络,咱们就能够实如今一台host上的多个container之间的通讯。他的网络模型以下(图片来自docker官网):ui
docker_gwbridge
他在本质上仍是一个local的bridge网络,可是他是咱们实现多个host之间的container通讯的基础。一般状况下,当咱们在连接swarm nodes的时候,docker_gwbridge网络就会被在每个swarm节点上自动建立出来。url
docker提供给咱们两种方式来定义overlay网络,在docker1.12以前,咱们须要依靠第三方的工具( Consul, Etcd, and ZooKeeper (Distributed store))来经过注册于寄存统一的“key-value”来实现“服务发现”和“DNS解析”,从而达到多个container不一样host上的的通讯。 可是在docker1.12以后,咱们能够直接用“原生态”的swarm来实现“服务发现”和“DNS解析”。spa
swarm在设计之初是为了service(一组container)而服务的,所以经过swarm建立的overlay网络在一开始并不支持单独的container加入其中。可是在docker1.13, 咱们能够经过“--attach” 参数声明当前建立的overlay网络能够被container直接加入。
# docker network create --driver=overlay --attachable name=myOverlayNet
在建立overlay网络以前,咱们须要先搭建swarm集群,详细内容能够参考我以前的随笔:
在这里,咱们会很好奇为何docker可以作到container之间的通讯呢? 答案就是 docker 内置的 DNS server. 关于他的详细介绍,请参考官网连接。
https://docs.docker.com/engine/userguide/networking/configure-dns/