前言
河东ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
docker目前支持以下5种网络模式:
默认是桥接模式,网络地址为172.16.0.0/16,同一主机的容器实例能够通信,但不能跨主机通信。本文下面将介绍如何使用gre隧道技术实现跨主机通信。
环境配置
本文使用两台主机A,B模拟实验,这两台主机其实是virtalbox虚拟机,操作系统为ubuntu14.04,均配置有两张网卡,网卡配置如下:
其中A主机网络:
- eth0: 172.16.1.24(公司内网IP,能够通外网)
- eth1: 192.168.56.4
B主机网络:
- eth0: 172.16.1.178(公司内网IP,能够通外网)
- eth1: 192.168.56.5
两台主机需要安装以下软件包:
- curl -sSL https://get.docker.com/ | sh
- sudo apt-get install openvswitch-switch
Docker配置
两台主机的容器能够通信,不能出现网络重叠,因此设置不同的网络:
- A: 10.103.100.0/24
- B: 10.103.200.0/24
并且为了加速镜像拉取,使用灵雀云镜像。***A主机配置文件/etc/default/docker如下:
- DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://houchaohann.m.alauda.cn --bip=10.103.100.1/24 --fixed-cidr=10.103.100.0/24"
B主机配置文件/etc/default/docker如下:
- DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://houchaohann.m.alauda.cn --bip=10.103.200.1/24 --fixed-cidr=10.103.200.0/24"
分别重启A、B主机Docker服务:
- sudo service docker restart
此时A主机docker0网桥地址为10.103.100.1,B主机docker0网桥地址为10.103.200.1。
在A主机上ping 10.103.200.1显然不通,同理B主机ping不通A主机网桥。
隧道配置
在A主机上创建一个网桥(使用ovs-vsctl,不要使用brctl):
- sudo ovs-vsctl add-br docker_tunnel
将gre0接口加入到网桥docker_tunnel, 创建一个GRE隧道添加到网桥中并配置远端IP,注意:我们在eth1之上建立隧道,因此需要使用eth1 IP地址:
- sudo ovs-vsctl add-port docker_tunnel gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.56.5
此时:
- fgp@ubuntu-4:~$ sudo ovs-vsctl show
- 2189345f-d4fb-4915-ab97-4c65a8d9ffe0
- Bridge docker_tunnel
- Port "gre0"
- Interface "gre0"
- type: gre
- options: {remote_ip="192.168.56.5"}
- Port docker_tunnel
- Interface docker_tunnel
- type: internal
- ovs_version: "2.0.2"
把docker_tunnel加入到docker0网桥中:
- sudo brctl addif docker0 docker_tunnel
增加路由:
- sudo ip route add 10.103.200.0/24 via 192.168.56.5 dev eth1
此时路由表:
- fgp@ubuntu-4:~$ sudo route -n
- Kernel IP routing table
- Destination Gateway Genmask Flags Metric Ref Use Iface
- 0.0.0.0 172.16.1.1 0.0.0.0 UG 0 0 0 eth0
- 10.103.100.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
- 10.103.200.0 192.168.56.5 255.255.255.0 UG 0 0 0 eth1
- 172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
- 192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
验证A主机是否能和B通信:
- fgp@ubuntu-4:~$ ping -c 2 -w 1 10.103.200.1
- PING 10.103.200.1 (10.103.200.1) 56(84) bytes of data.
- 64 bytes from 10.103.200.1: icmp_seq=1 ttl=64 time=0.339 ms
- --- 10.103.200.1 ping statistics ---
- 1 packets transmitted, 1 received, 0% packet loss, time 0ms
- rtt min/avg/max/mdev = 0.339/0.339/0.339/0.000 ms
同样在B主机执行相同步骤:
- sudo ovs-vsctl add-br docker_tunnel
- sudo ovs-vsctl add-port docker_tunnel gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.56.4
- sudo brctl addif docker0 docker_tunnel
- sudo ip route add 10.103.100.0/24 via 192.168.56.4 dev eth1
验证B主机是否能够和A通信:
- fgp@ubuntu-5:~$ ping -c 2 -w 1 10.103.100.1
- PING 10.103.100.1 (10.103.100.1) 56(84) bytes of data.
- 64 bytes from 10.103.100.1: icmp_seq=1 ttl=64 time=0.336 ms
- 64 bytes from 10.103.100.1: icmp_seq=2 ttl=64 time=0.409 ms
- --- 10.103.100.1 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 999ms
- rtt min/avg/max/mdev = 0.336/0.372/0.409/0.041 ms
验证docker容器跨主机通信
A主机创建ubuntu14.04容器:
- docker run -t -i --rm --name from-A --hostname from-A ubuntu:14.04 bash
在容器内部查看ip地址:
- # from-A
- ifconfig eth0 | grep 'inet addr' | cut -d ':' -f 2 | cut -d ' ' -f 1
- # 10.103.100.2
B主机创建ubuntu14.04容器:
- docker run -t -i --rm --name from-A --hostname from-B ubuntu:14.04 bash
在容器内部查看地址:
- # from-B
- ifconfig eth0 | grep 'inet addr' | cut -d ':' -f 2 | cut -d ' ' -f 1
- # 10.103.200.2
在A容器实例上ping B容器实例:
- # from-A
- ping 10.103.200.2
输出:
- root@from-A:/# ping -c 2 -w 1 10.103.200.2
- PING 10.103.200.2 (10.103.200.2) 56(84) bytes of data.
- 64 bytes from 10.103.200.2: icmp_seq=1 ttl=62 time=0.510 ms
- --- 10.103.200.2 ping statistics ---
- 1 packets transmitted, 1 received, 0% packet loss, time 0ms
- rtt min/avg/max/mdev = 0.510/0.510/0.510/0.000 ms
我们发现,在主机A的容器成功ping通主机B的容器,实现了跨主机通信!
使用docker-swarm实现跨主机容器通信
docker的overlay的网络驱动支持跨主机通信,这个实现在libnetwork中基于内置的VXLAN实现以及docker的libkv库。使用overlay网络需要依赖K-V Store,目前支持的K-V Store包括etcd、Consul、Zookeeper。
本来想直接使用docker启动consul的,后来发现docker daemon启动依赖consul,因此只能先按照consul。首先到官方下载安装包:下载地址,解压缩后,只有一个二进制文件,直接运行即可:
- nohup ./consul agent -dev -advertise 172.16.1.24 -client 0.0.0.0 &
注意: 该服务在A机器上运行,172.16.1.24务必配成能够连接外网的IP地址,否则后面启动Swarm容器时内部无法通信!
然后修改A、B服务的daemon配置文件/etc/default/docker:
- DOCKER_OPTS="--cluster-store=consul://172.16.1.24:8500 --cluster-advertise=eth0:2375"
- DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://houchaohann.m.alauda.cn -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
重启docker服务:
- sudo service docker restart
执行docker info必须包含以下信息:
- Cluster store: consul://172.16.1.24:8500
- Cluster advertise: 172.16.1.24:2375
接着我们需要部署Docker Swarm集群,详细过程参考手动部署docker-swarm集群。
***创建overlay网络:
- docker network create --driver overlay --subnet 10.103.240.0/24 test
其中--dirver指定为overlay,并指定我们需要的子网地址,名称为test,通过docker network ls可以检查我们创建的网络是否成功:
- fgp@ubuntu-5:~$ docker network ls | grep test
- 7eef808f272b test overlay
此时overlay网络创建完毕。我们测试其是否支持跨主机通信,首先我们创建一个ubuntu容器,命名为ubuntu-1,并使用我们刚刚创建的网络:
- docker run -t -i -d --net test --name ubuntu-1 ubuntu:14.04
接着我们创建***个ubuntu容器,此时为了保证它不和ubuntu-1调度在同一台主机上,我们需要使用docker swarm的filter,指定affinity,如下:
- docker run -t -i -d --net test --name ubuntu-2 -e affinity:container!=~ubuntu-1 ubuntu:14.04
运行docker ps:
- docker ps
- fgp@ubuntu-5:~$ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- ba5018dfe26e ubuntu:14.04 "/bin/bash" 2 minutes ago Up Less than a second ubuntu-5/ubuntu-1
- bedd266cddaa ubuntu:14.04 "/bin/bash" 14 hours ago Up 41 seconds ubuntu-4/ubuntu-2
由此可知,两个ubuntu容器运行在不同的主机上,符合我们的测试要求。分别获取ubuntu-1和ubuntu-2的ip地址:
- fgp@ubuntu-5:~$ docker inspect -f '' ubuntu-1
- 10.103.240.2
- fgp@ubuntu-5:~$ docker inspect -f '' ubuntu-2
- 10.103.240.3
可见ubuntu-1的ip地址为10.103.240.2,ubuntu-2的ip地址为10.103.240.3,我们在ubuntu-1上ping ubuntu-2地址:
- fgp@ubuntu-5:~$ docker exec -t -i ubuntu-1 ping -c 2 10.103.240.3
- PING 10.103.240.3 (10.103.240.3) 56(84) bytes of data.
- 64 bytes from 10.103.240.3: icmp_seq=1 ttl=64 time=0.559 ms
- 64 bytes from 10.103.240.3: icmp_seq=2 ttl=64 time=0.661 ms
- --- 10.103.240.3 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 999ms
- rtt min/avg/max/mdev = 0.559/0.610/0.661/0.051 ms
结果发现,不在同一主机的ubuntu-1和ubuntu-2能够正常通信!
【本文是专栏作者“付广平”的原创文章,如需转载请通过获得联系】
戳这里,看该作者更多好文
网页标题:Docker跨主机通信实现与分析
文章来源:http://www.shufengxianlan.com/qtweb/news4/128954.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联