docker 提供给我们多种 (4 种) 网络模式,我们可以根据自己的需求来使用。例如我们在一台主机(host)或者同一个 docker engine 上面运行 continer 的时候,我们就可以选择 bridge 网络模式;而当我们需要在多台 host 上来运行多个 container 来协同工作的时候,overlay 模式就是我们的首选。
当我们完成 docker engine 的安装以后,docker 会在每一个 engine 上面生成一个 3 种网络,他们是:bridge, none 还有 host。
首先来侃一侃 docker0. 之所以说它是默认的网络,是由于当我们运行 container 的时候没有 "显示" 的指定网络时,我们的运行起来的 container 都会加入到这个 "默认" docker0 网络。他的模式是 bridge。
顾名思义,所有加入到这个网络模式中的 container,都 "不能" 进行网络通信。貌似有点鸡肋。。。
这种网络模式将 container 与宿主机的网络相连通,虽然很直接,但是却破获了 container 的隔离性,因此也比较鸡肋。。。
由于之前介绍的 3 种自带的网络模式有各自的局限性,因此,docker 推荐大家自定义网络。通过自定义网络,我们可以实现 "服务发现" 与 "DNS 解析"。
docker 允许我们创建 3 种类型的自定义网络,bridge,overlay,MACVLAN (目前我还没有用到)。
与 docker0 类似,我们可以自定义 bridge 网络,通过使用自定义 bridge 网络,我们就可以实现在一台 host 上的多个 container 之间的通信。他的网络模型如下 (图片来自 docker 官网):
- docker_gwbridge
他在本质上还是一个 local 的 bridge 网络,但是他是我们实现多个 host 之间的 container 通信的基础。通常情况下,当我们在链接 swarm nodes 的时候,docker_gwbridge 网络就会被在每一个 swarm 节点上自动创建出来。
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 能够做到 container 之间的通信呢? 答案就是 docker 内置的 DNS server. 关于他的详细介绍,请参考官网链接。
https://docs.docker.com/engine/userguide/networking/configure-dns/
来源: http://www.cnblogs.com/atuotuo/p/6926390.html