docker同宿主机容器和不一样宿主机容器之间怎么通讯?

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

docker同宿主机容器和不一样宿主机容器之间怎么通讯?

命令执行过程:
#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/bashubuntu

#ifconfig –a
#route –nbash

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

docker同宿主机容器和不一样宿主机容器之间怎么通讯?

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

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

#ifconfig –a
#route –nspa

第三种模式 Container
congtainer容器指定和已经存在的容器共享一个network namespace。
不配置ip,指一个已经存在容器共享ip,其余
docker同宿主机容器和不一样宿主机容器之间怎么通讯?接口

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

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主机上添加静态路由直接实现跨宿主机容器之间通讯:
docker同宿主机容器和不一样宿主机容器之间怎么通讯?

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

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

docker同宿主机容器和不一样宿主机容器之间怎么通讯?

第三种: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数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器

docker同宿主机容器和不一样宿主机容器之间怎么通讯?

#/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

相关文章
相关标签/搜索