04)docker 的网路

04)docker 的网路
上图,docker 的网络类型有4种。

在底层实现上,利用的是linux 内核的network namespace,大概图如下

04)docker 的网路
04)docker 的网路
04)docker 的网路
04)docker 的网路
04)docker 的网路
04)docker 的网路
上图,linux 内核中不同的 network namespace 通过一对 veth 通信的方法
下图,docker 通过veth 通信的方法
04)docker 的网路

问题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如何实现访问互联网?

04)docker 的网路
如上图,eth0可以访问外网,和docker0做一个nat(网络地址转换),就能访问外网

04)docker 的网路
04)docker 的网路创建自己的network,创建容器时指定自己创建的network,这样容器不用加 link,默认连接在自己创建的network网络中的容器都能用ping + 容器名字 的方法ping通


问题3:多机器间的docker container 如何通信?

04)docker 的网路
答:需要docker 的overlay 网络和第三方工具,一个分布式存储 ,这里选择 etcd(开源的免费分布式存储)来实现。
比如1台机器要知道另一台机器的容器ip,就要通过这个分布式存储来知道。
etcd有个监听机制,能让多台机器监听某个键值的变化,一旦键值对对话,监听的机器都能收到具体的改变,并在自己的机器上做同步。
比如2台机器,node1和node2,在node1创建1个overlay网络,node2监听到变化也会在自己的主机上建立1个相同名字的overlay网络。