设为首页 收藏本站
查看: 1463|回复: 1

[经验分享] Docker跨主机通信网络

[复制链接]

尚未签到

发表于 2019-2-21 13:08:26 | 显示全部楼层 |阅读模式
Docker跨主机通信网络

  跨主机网络方案包括:
  docker原生的 overlay 和 macvlan。
第三方方案:常用的包括flannel、weave 和 calico。


(1)准备 Overlay 网络实验环境

[root@linux-node1 ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
[root@linux-node1 ~]# netstat -tulnp |grep 8500
tcp6       0      0 :::8500                 :::*                    LISTEN      61092/docker-proxy-
容器启动后,可以通过 http://192.168.56.110:8500 访问 Consul。


接下来修改 node1 和 node2 的 docker daemon 的配置文件/var/lib/systemd/system/docker.service。
--cluster-store 指定 consul 的地址。
--cluster-advertise 告知 consul 自己的连接地址。
[root@linux-node1 ~]# cat /usr/lib/systemd/system/docker.service
......
ExecStart=/usr/bin/dockerd-current \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
--seccomp-profile=/etc/docker/seccomp.json \
--cluster-store=consul://192.168.56.110:8500 \
--cluster-advertise=eth0:2376 \
$OPTIONS \
......
[root@linux-node1 ~]# systemctl daemon-reload
[root@linux-node1 ~]# systemctl restart docker
node1 和 node2 将自动注册到 Consul 数据库中。


(2)创建 overlay 网络

在 node1 中创建 overlay 网络 ov_net1:
[root@linux-node1 ~]# docker network create -d overlay ov_net1  #-d overlay 指定 driver 为 overaly。
[root@linux-node1 ~]# docker network ls  #查看当前网络
NETWORK ID          NAME                DRIVER              SCOPE
8eb7fd71a52c        bridge              bridge              local
6ba20168e34f        host                host                local
4e896f9ac4bc        none                null                local
d9652d84d9de        ov_net1             overlay             global
[root@linux-node2 ~]# docker network ls  #查看当前网络
NETWORK ID          NAME                DRIVER              SCOPE
94a3bc259414        bridge              bridge              local
f8443f6cb8d2        host                host                local
2535ab8f3493        none                null                local
d9652d84d9de        ov_net1             overlay             global
node2 上也能看到 ov_net1。这是因为创建 ov_net1 时 node1 将 overlay 网络信息存入了 consul,node2 从 consul 读取到了新网络的数据。之后 ov_net 的任何变化都会同步到 node1 和 node2。
[root@linux-node1 ~]# docker network inspect ov_net1  #查看 ov_net1 的详细信息
[
{
"Name": "ov_net1",
"Id": "d9652d84d9de6d1145c77d0254c90164b968f72f2eda4aee43d56ab03f8530ed",
"Created": "2018-04-19T21:50:29.128801226+08:00",
"Scope": "global",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
(3) overlay 中运行容器

[root@linux-node1 ~]# docker run -itd --name bbox1 --network ov_net1 busybox
340f748b06786c0f81c3e26dd9dbd820dafcdf73baa9232f02aece8d4c89a73b
[root@linux-node1 ~]# docker exec bbox1 ip r  #查看容器的网络配置
default via 172.18.0.1 dev eth1
10.0.0.0/24 dev eth0 scope link  src 10.0.0.2
172.18.0.0/16 dev eth1 scope link  src 172.18.0.2
  bbox1有两个网络接口eth0 和 eth1。eth0 IP为10.0.0.2,连接的是 overlay 网络ov_net1。eth1 IP 172.18.0.2,容器的默认路由是走 eth1,eth1是哪儿来的呢?
  其实,docker会创建一个bridge网络 “docker_gwbridge”,为所有连接到 overlay 网络的容器提供访问外网的能力。


[root@linux-node1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8eb7fd71a52c        bridge              bridge              local
751bd423a345        docker_gwbridge     bridge              local
6ba20168e34f        host                host                local
4e896f9ac4bc        none                null                local
d9652d84d9de        ov_net1             overlay             global
[root@linux-node1 ~]# docker network inspect docker_gwbridge
[
{
"Name": "docker_gwbridge",
"Id": "751bd423a345a7beaa6b4cbf2a69a7687e3d8b7e656952090c4b94aec54ec1b5",
"Created": "2018-04-21T16:11:57.684140362+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {
"340f748b06786c0f81c3e26dd9dbd820dafcdf73baa9232f02aece8d4c89a73b": {
"Name": "gateway_340f748b0678",
"EndpointID": "64cd599aaa2408ca0a1e595264e727b09d26482ba4d2aa18d97862ed29e23b51",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.enable_icc": "false",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.name": "docker_gwbridge"
},
"Labels": {}
}
]
  从docker network inspect docker_gwbridge输出可确认 docker_gwbridge的 IP 地址范围是 172.18.0.0/16,当前连接的容器就是bbox1(172.18.0.2)。
而且此网络的网关就是网桥 docker_gwbridge 的IP 172.17.0.1。


[root@linux-node1 ~]# ifconfig docker_gwbridge
docker_gwbridge: flags=4163  mtu 1500
inet 172.18.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
inet6 fe80::42:e4ff:feb8:22cb  prefixlen 64  scopeid 0x20
ether 02:42:e4:b8:22:cb  txqueuelen 0  (Ethernet)
RX packets 0  bytes 0 (0.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 0  bytes 0 (0.0 B)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
这样容器 bbox1 就可以通过 docker_gwbridge 访问外网。
[root@linux-node1 ~]# docker exec bbox1 ping -c 2 www.baidu.com
PING www.baidu.com (58.217.200.112): 56 data bytes
64 bytes from 58.217.200.112: seq=0 ttl=127 time=32.465 ms
64 bytes from 58.217.200.112: seq=1 ttl=127 time=32.754 ms
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 32.465/32.609/32.754 ms
(4)overlay 如何实现跨主机通信?

[root@linux-node2 ~]# docker run -itd --name bbox2 --network ov_net1 busybox
[root@linux-node2 ~]# docker ps
CONTAINER ID      IMAGE     COMMAND        CREATED       STATUS      PORTS       NAMES
68c81b90fb86     busybox    "sh"        2 days ago      Up 2 days                bbox2
[root@linux-node2 ~]# docker exec bbox2 ip r
default via 172.18.0.1 dev eth1
10.0.0.0/24 dev eth0 scope link  src 10.0.0.3   
172.18.0.0/16 dev eth1 scope link  src 172.18.0.2
##bbox2 IP 为 10.0.0.3,可以直接 ping bbox1
[root@linux-node2 ~]# docker exec bbox2 ping -c 3 bbox1
PING bbox1 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=154.064 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.789 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.539 ms
--- bbox1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.539/51.797/154.064 ms
  docker会为每个overlay网络创建一个独立的network namespace,其中会有一个linux bridge br0,endpoint 还是由veth pair 实现,一端连接到容器中(即 eth0),另一端连接到 namespace的br0上。
  br0除了连接所有的 endpoint,还会连接一个 vxlan 设备,用于与其他 host建立 vxlan tunnel。容器之间的数据就是通过这个tunnel通信的。逻辑网络拓扑结构如图所示:



(5)overlay 是如何隔离的?

  不同的overlay网络是相互隔离的。我们创建第二个 overlay网络ov_net2 并运行容器bbox3


[root@linux-node1 ~]# docker run -itd --name bbox3 --network ov_net2 busybox
946def609a7b183f68b8398b35fd3f72dc28bff47cc2ba63467f266fde297d5a
[root@linux-node1 ~]# docker exec -it bbox3 ip r
default via 172.18.0.1 dev eth1
10.0.1.0/24 dev eth0 scope link  src 10.0.1.2   ##bbox3的ip为10.0.1.2
172.18.0.0/16 dev eth1 scope link  src 172.18.0.4
[root@linux-node1 ~]# docker exec -it bbox3 ping -c 2 10.0.0.3  #bbox3无法ping通bbox2
PING 10.0.0.3 (10.0.0.3): 56 data bytes
^C
--- 10.0.0.3 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
如果要实现 bbox3 与 bbox2 通信,可以将 bbox3 也连接到 ov_net1。
[root@linux-node1 ~]# docker network connect ov_net1 bbox3
[root@linux-node1 ~]# docker exec -it bbox3 ping -c 2 10.0.0.3
PING 10.0.0.3 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=34.110 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.745 ms
--- 10.0.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.745/17.427/34.110 ms
  docker默认为 overlay网络分配 24 位掩码的子网(10.0.X.0/24),所有主机共享这个 subnet,容器启动时会顺序从此空间分配 IP。当然我们也可以通过--subnet 指定 IP 空间。


[root@linux-node1 ~]# docker network create -d overlay --subnet 10.22.1.0/24 ov_net3a111191fa67e500015a2f3ab8166793d23f0adef4d66bfcee81166127915ff9f
[root@linux-node1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8eb7fd71a52c        bridge              bridge              local
751bd423a345        docker_gwbridge     bridge              local
6ba20168e34f        host                host                local
4e896f9ac4bc        none                null                local
d9652d84d9de        ov_net1             overlay             global
667cc7ef7427        ov_net2             overlay             global
a111191fa67e        ov_net3             overlay             global



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675394-1-1.html 上篇帖子: Docker 部署单节点监控,cAdvisor 下篇帖子: 跟我一起学docker(一)
累计签到:1949 天
连续签到:45 天
发表于 2019-2-21 13:49:18 | 显示全部楼层
感谢楼主的分享!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表