Docker跨宿主机通信
来源:互联网 发布:java做爬虫 编辑:程序博客网 时间:2024/05/21 19:46
Docker跨宿主机通信
Docker跨宿主机通信目前有如下几种主流方法:
- 使用路由机制打通网络;
- 使用Open vSwitch(OVS)打通网络 ;
- 使用flannel来打通网络;
- 使用Quagga来实现自动学习路由;
- 借助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/bashe6b85b463a379a0e349aab31efc1715f225fed27117e1b2cb985149261366a79
2、在node2下创建容器router2(使用无网络模式):
[root@node2 ~]# docker run -itd --name router2 --net none quagga /bin/bashd712a46ec871eb2a94d392e9d87c951f0ed9efe50496070cfe669bad87e88e2b
三、创建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 showbridge name bridge id STP enabled interfacesbr0 8000.000000000000 no docker0 8000.024210962f1f no virbr0 8000.000000000000 yes
四、创建一对“veth pair”接口 A 和 B,连接容器router2和网桥br0
1、 在node2查找容器的进程 id,并为它创建网络命名空间:
[root@node2 ~]# sudo docker inspect -f '{{.State.Pid}}' router244561[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 a1: 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 forever40: 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.99PING 172.18.42.99 (172.18.42.99): 56 data bytes64 bytes from 172.18.42.99: icmp_seq=0 ttl=62 time=0.432 ms64 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 lossround-trip min/avg/max/stddev = 0.432/0.688/0.943/0.256 ms
阅读全文
0 0
- Docker跨宿主机通信
- 十、Docker网络以及跨宿主机通信
- CentOS Docker跨宿主机通讯Open vSwitch(一)
- 宿主机与vm通信
- 宿主机和Linux通信
- Docker: 虚拟机与宿主机端口映射(Mac)
- 如何获取docker宿主机ip
- docker 部署odoo 访问宿主机数据库
- Docker和宿主机之间共享文件
- User Namespaces 加固Docker container 宿主机
- 【Docker】Docker容器与宿主机互相拷贝传递文件
- 实现Linux与宿主机的通信
- 宿主机和虚拟机网络通信
- 宿主机和虚拟机网路通信
- Docker学习(9)------配置Docker Container与Docker宿主机同网段IP
- docker从容器中怎么访问宿主机
- docker容器和宿主机的文件交互
- 通过宿主机目录向docker容器传文件
- 40.笔记go语言——并发
- 51nod 1534棋子游戏(分析)
- 41.笔记go语言——通讯
- Git分布式 & SVN集中管理式
- 轮播效果 jquery
- Docker跨宿主机通信
- 42.笔记go语言圣经——go起源
- JAVA多线程之线程间的通信方式
- 如何理解if __name__ == '__main__':
- 城市列表的简单实现
- BZOJ 1202: [HNOI2005]狡猾的商人 带权并查集
- 微服务概述
- 43.笔记go语言圣经——go语言特性
- 2007-2008 ACM-ICPC, NEERC, Southern Subregional Contest J