Docker跨宿主机通信

原创 2017年10月06日 20:27:12

Docker跨宿主机通信

Docker跨宿主机通信目前有如下几种主流方法:

  1. 使用路由机制打通网络;
  2. 使用Open vSwitch(OVS)打通网络 ;
  3. 使用flannel来打通网络;
  4. 使用Quagga来实现自动学习路由;
  5. 借助openstack、k8s等方式。

本文主要使用路由机制打通网络。

一、拓扑图

拓扑图

因为Docker默认的网桥docker0为172.17.0.1/16网段,所以必须要修改其中一个docker节点的网桥,以避免ip冲突。

  • router1使用默认的docker0网桥;
  • router2使用自行添加的网桥br0,并创建一对“veth pair”接口 A 和 B,连接容器router2和网桥br0。

二、创建docker容器

1、 在node1下创建容器router1:

[root@node1 ~]# docker run -itd --name router1 quagga /bin/bash
e6b85b463a379a0e349aab31efc1715f225fed27117e1b2cb985149261366a79

2、在node2下创建容器router2(使用无网络模式):

[root@node2 ~]# docker run -itd --name router2 --net none quagga /bin/bash
d712a46ec871eb2a94d392e9d87c951f0ed9efe50496070cfe669bad87e88e2b

三、创建br0网桥

1、 在node2中创建一个网桥 br0:

[root@node2 ~]# brctl addbr br0
[root@node2 ~]# ip addr add 172.18.42.1/16 dev br0
[root@node2 ~]# ip link set dev br0 up

2、添加后可以用 “brctl show” 来查看:

[root@node2 ~]# brctl show
bridge name   bridge id          STP enabled          interfaces
br0           8000.000000000000  no     
docker0       8000.024210962f1f  no     
virbr0        8000.000000000000  yes    

四、创建一对“veth pair”接口 A 和 B,连接容器router2和网桥br0

1、 在node2查找容器的进程 id,然后通过pid将容器的网络命名空间链接到/var/run/netns/目录下。这么做的目的是,方便在主机上使用ip netns命令配置容器的网络。因为,在Docker容器中,我们没有权限配置网络环境。

[root@node2 ~]# sudo docker inspect -f '{{.State.Pid}}' router2
44561
[root@node2 ~]# pid=44561
[root@node2 ~]# mkdir -p /var/run/netns
[root@node2 ~]# ln -s /proc/$pid/ns/net /var/run/netns/$pid

2、 创建一对“veth pair”接口 A 和 B,绑定 B到网桥br0,并启用它:

[root@node2 ~]# ip link add A type veth peer name B
[root@node2 ~]# brctl addif br0 B
[root@node2 ~]# ip link set B up

3、 将A放到容器router2的网络命名空间,命名为 eth0,启动它并配置一个可用 IP(桥接网段)和默认网关:

[root@node2 ~]# ip link set A netns $pid
[root@node2 ~]# ip netns exec $pid ip link set dev A name eth0
[root@node2 ~]# ip netns exec $pid ip link set eth0 up
[root@node2 ~]# ip netns exec $pid ip addr add 172.18.42.99/16 dev eth0
[root@node2 ~]# ip netns exec $pid ip route add default via 172.18.42.1

4、 查看router2内的网卡eth0:

[root@node2 ~]# docker exec router2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b2:7d:f0:a8:22:6f brd ff:ff:ff:ff:ff:ff
    inet 172.18.42.99/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::b07d:f0ff:fea8:226f/64 scope link 
       valid_lft forever preferred_lft forever

五、添加路由规则

1、 node1上执行:

[root@node1 ~]# route add -net 172.18.0.0/16 gw 192.168.168.137

2、 node2上执行:

[root@node2 ~]# route add -net 172.17.0.0/16 gw 192.168.168.129

六、测试

在router1中能够ping通router2:

[root@node1 ~]# docker attach router1 
root@e6b85b463a37:/# 
root@e6b85b463a37:/# ping 172.18.42.99
PING 172.18.42.99 (172.18.42.99): 56 data bytes
64 bytes from 172.18.42.99: icmp_seq=0 ttl=62 time=0.432 ms
64 bytes from 172.18.42.99: icmp_seq=1 ttl=62 time=0.943 ms
^C--- 172.18.42.99 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.432/0.688/0.943/0.256 ms
版权声明:本文为博主原创文章,未经博主允许不得转载。

Docker网络管理及容器跨主机通信(四)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lizhenliang.blog.51cto.com/7876557/173189...
  • moonhillcity
  • moonhillcity
  • 2016年08月11日 08:19
  • 2211

Docker网络基础---Docker跨主机容器访问通信

在同一宿主机下的Docker的容器之间是默认互相联通的。通过docker inspect id或name可以查看到ip地址。在不通的容器中来执行ping是可以ping通的。但我们通过观察发现,每一个...
  • canot
  • canot
  • 2016年10月22日 23:36
  • 9303

docker 使用网桥实现跨主机容器链接

基本思想: 由于Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段。...
  • sfdst
  • sfdst
  • 2017年04月06日 20:18
  • 1262

Docker跨主机网络通信方案

在微服务架构中,多个服务是通过服务注册中心进行管理的,服务需要将自己的IP地址和端口发送给注册中心,这样该服务才能被其它服务感知并调用。但是当服务在docker容器内运行时,服务获取到的自身IP是宿主...
  • tracker_w
  • tracker_w
  • 2017年02月27日 16:50
  • 1102

docker学习8--同主机下容器通信

本系列docker学习都是在centos7下学习的。 1.容器放主机/主机访问容器      启动一个已经配置好JDK、tomcat的镜像,命名为tomcat01。          使用rout...
  • dream_broken
  • dream_broken
  • 2016年09月05日 15:26
  • 2712

容器跨主机通信之docker default overlay

default docker overlay基于libnetwork和libkv,这里使用etcd作为key value store VM1: 129.107.126.123 VM2: 129...
  • sk1137
  • sk1137
  • 2017年03月22日 11:07
  • 275

Docker 1.9 Overlay Network实现跨主机网络互通

11月4日,Docker发布了1.9版本,实现了原本实验性的Networking组件的支持。用户可以在Swarm中使用它或者将其作为Compose 工具。创建虚拟网络并将其连接到容器上,可实现多个主机...
  • jasko
  • jasko
  • 2015年11月20日 15:24
  • 3805

Docker容器的跨主机连接

Docker容器的跨主机连接   使用网桥实现跨主机容器连接   1.网桥方式需要安装网桥管理工具: apt-get install bridge-utils ...
  • shanyongxu
  • shanyongxu
  • 2016年05月13日 21:15
  • 3744

十、Docker网络以及跨宿主机通信

讲在前面: 1.目前实现的是单机部署,如何创建镜像,管理镜像;如何创建容器,管理容器;如何快速创建docker虚拟主机machine,如何快速部署多组件项目compose以及如何跨宿主机建立集群sw...
  • qq_15800363
  • qq_15800363
  • 2017年12月04日 18:06
  • 195

Docker实现跨主机容器实例网络通信(1)——利用LinuxBridge构建多主机Docker网络

前面我们已经提到了如果我们构建docker集群,肯定会出现跨主机docker实例网络连接的需求,而且为了节省主机网络的IP资源,我们尽量使用docker0自己的网络连接,适当为主节点(容器实例)添加主...
  • chinagissoft
  • chinagissoft
  • 2016年05月05日 08:36
  • 1859
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Docker跨宿主机通信
举报原因:
原因补充:

(最多只允许输入30个字)