04)docker 的网路
上图,docker 的网络类型有4种。
在底层实现上,利用的是linux 内核的network namespace,大概图如下
上图,linux 内核中不同的 network namespace 通过一对 veth 通信的方法
下图,docker 通过veth 通信的方法
问题1:container之间如何实现互相访问?
在启动docker 时,默认会创建1个docker0的 network ,之后创建container 时,若不指定network,新建的容器默认会连接通过一对 veth 和docker0 相连接,这样容器之间通过docker0,能实现互相通信。
可以把docker0 类比为路由器,多台连接这路由器的电脑,形成1个局域网,连接这台路由器的电脑彼此能够互相访问
另外,使用默认的docker0 网络,2个容器之间只能用ping IP地址的方式ping 通。如果要使用容器名字ping 通,需要用 --link,如在container2 启动时加 --link containerName1 ,这样在container2中就能用 ping containerName1 去ping通,但反过来container1 中是不行的。link的作用类似加了DNS 记录表,实际中用–link 很少使用,会用其他方法实现,下面讲
问题2:container如何实现访问互联网?
如上图,eth0可以访问外网,和docker0做一个nat(网络地址转换),就能访问外网
创建自己的network,创建容器时指定自己创建的network,这样容器不用加 link,默认连接在自己创建的network网络中的容器都能用ping + 容器名字 的方法ping通
问题3:多机器间的docker container 如何通信?
答:需要docker 的overlay 网络和第三方工具,一个分布式存储 ,这里选择 etcd(开源的免费分布式存储)来实现。
比如1台机器要知道另一台机器的容器ip,就要通过这个分布式存储来知道。
etcd有个监听机制,能让多台机器监听某个键值的变化,一旦键值对对话,监听的机器都能收到具体的改变,并在自己的机器上做同步。
比如2台机器,node1和node2,在node1创建1个overlay网络,node2监听到变化也会在自己的主机上建立1个相同名字的overlay网络。