docker同宿主机容器和不同宿主机容器之间怎么通信?

第一部分 docker有四种网络模式
第一种:bridge 模式
当docker进程启动时,主机上会创建一个名为docker0的虚拟网桥,容器内部会创建一个只能容器内部看到的接口eth0,eth0 和docker0工作方式就像物理二层交换机一样,可以互相通信。

命令执行过程:
#docker run -tid --net=bridge --name docker_bri1 ubuntu-base:v3
#docker run -tid --net=bridge --name docker_bri2 ubuntu-base:v3

#brctl show
#docker exec -ti docker_bri1 /bin/bash
#docker exec -ti docker_bri1 /bin/bash

#ifconfig –a
#route –n

第二种:host模式
容器启动时候用host模式,那么容器不会像第一张那样有个独立Network NameSpace。而是和主机共享一个Network NameSpace。
使用宿主机的ip和端口,但是容器的系统,进程列表等还是和主机隔离。

命令执行:
#docker run -tid --net=host --name docker_host1 ubuntu-base:v3
#docker run -tid --net=host --name docker_host2 ubuntu-base:v3

#docker exec -ti docker_host1 /bin/bash
#docker exec -ti docker_host1 /bin/bash

#ifconfig –a
#route –n

第三种模式 Container
congtainer容器指定和已经存在的容器共享一个network namespace。
不配置ip,指一个已经存在容器共享ip,其他

第四种:none模式
none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。


#docker run -tid --net=none --name docker_non1 ubuntu-base:v3
#docker exec -ti docker_non1 /bin/bash

#ifconfig –a
#route -n

第二部分 跨主机通信
单台主机上面的docker容器通过docker0来通信。不同主机上面的容器只能在主机上做端口映射来完成。种端口映射方式对很多集群应用来说极不方便。

方法一:现在用docker主机上添加静态路由直接实现跨宿主机容器之间通信:

方法二:借助pipework容器网络配置工具。
通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。

使用新建的bri0网桥代替缺省的docker0网桥

第三种:Flannel(Flannel + UDP 或者 Flannel + VxLAN)

Flannel实现的容器的跨主机通信通过如下过程实现:

每个主机上安装并运行etcd和flannel;
在etcd中规划配置所有主机的docker0子网范围;
每个主机上的flanneld根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;
当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);
将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;
由于目的IP是宿主机IP,因此路由是可达的;
VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器

#/opt/bin/etcdctl get /coreos.com/network/config
#/opt/bin/etcdctl ls /coreos.com/network/subnets
#/opt/bin/etcdctl get /coreos.com/network/subnets/172.16.49.0-24

转载于:https://blog.51cto.com/2367685/2349762

你可能感兴趣的:(docker同宿主机容器和不同宿主机容器之间怎么通信?)