`
m635674608
  • 浏览: 5044150 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

一分钟看懂Docker的网络模式和跨主机通信

 
阅读更多

Docker的四种网络模式

 

Bridge模式

 

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

bridge模式如下图所示:

 

演示:

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等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

Host模式如下图所示:

 

演示:

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模式

 

 

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

Container模式示意图:

 

演示:

docker run -tid --net=container:docker_bri1 \
              --name docker_con1 ubuntu-base:v3

docker exec -ti docker_con1 /bin/bash
docker exec -ti docker_bri1 /bin/bash

ifconfig –a
route -n

 

None模式

 

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

Node模式示意图:

演示:

docker run -tid --net=none --name \
                docker_non1 ubuntu-base:v3

docker exec -ti docker_non1 /bin/bash

ifconfig –a
route -n

 

 

跨主机通信

Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。这种端口映射方式对很多集群应用来说极不方便。如果能让Docker容器之间直接使用自己的IP地址进行通信,会解决很多问题。按实现原理可分别直接路由方式、桥接方式(如pipework)、Overlay隧道方式(如flannelovs+gre)等。

 

直接路由

 

通过在Docker主机上添加静态路由实现跨宿主机通信:

 

 

Pipework

 

 

Pipework是一个简单易用的Docker容器网络配置工具。由200多行shell脚本实现。通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。

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

  • bri0网桥与缺省的docker0网桥的区别:bri0和主机eth0之间是veth pair

 

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

Flannel模式如下图所示:

 

演示:

/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


http://www.wtoutiao.com/p/199PeVu.html
分享到:
评论

相关推荐

    docker跨主机通信的两种方式

    本文将详细介绍两种实现 Docker 跨主机通信的方法:路由方式和网络桥接。 ### 路由方式 路由方式是通过设置路由规则使得不同主机上的 Docker 容器能够相互通信。这种方法在单个数据中心或同一个 VLAN 环境中最为...

    Docker容器跨主机通信主流方案

    Docker容器跨主机通信主流方案

    Etcd + flannel + Docker 实现 docker 跨主机容器之间通讯 .pdf

    本文详细阐述了如何通过安装和配置etcd、flannel和Docker来实现跨主机的容器间通信。以下将详细梳理本文的知识点: 1. Docker容器技术: Docker 是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个...

    电信设备-Docker容器的跨主机通信方法和系统.zip

    3. Docker网络模型:Docker提供了多种网络模式,如桥接网络、主机网络、overlay网络等,来支持容器间的通信。其中,overlay网络特别适用于跨主机通信,因为它可以创建一个覆盖多个宿主机的虚拟网络。 4. Overlay...

    Etcd flannel Docker 实现 docker 跨主机容器之间通讯

    `Etcd`、`Flannel` 和 `Docker` 是三个关键组件,它们协同工作,使得 Docker 容器可以在跨主机环境中相互通信。本篇文章将深入探讨这三个组件的作用以及如何实现跨主机的 Docker 容器通信。 首先,`Etcd` 是一个...

    Docker容器跨主机通信中直接路由方式详解

    总结来说,Docker容器跨主机通信是一个涉及网络配置和Docker服务管理的过程,要求使用者具有网络基础和一定的Docker操作经验。通过上述配置,我们可以实现容器之间的直接路由通信,使得不同主机上的容器能够高效、...

    docker容器无法访问宿主机端口的解决

    最近在工作时遇到一个问题,docker容器无法访问宿主机的redis,telent6379端口不通。 经排查发现,该服务器启用了防火墙,防火墙把6379的端口的访问授权给docker0网卡访问即可。 操作如下: firewall-cmd –...

    基于overlay的跨主机通信.docx

    在多主机环境下,Docker使用overlay网络来实现跨主机间的通信,这使得容器可以在不同的主机上运行而互相通信。以下是对“基于overlay的跨主机通信”这一主题的详细解释。 首先,我们要了解容器网络的分类。Docker...

    详解Docker容器跨主机通信的方法

    默认情况下Docker容器需要跨主机通信两个主机节点都需要在同一个网段下,这时只要两个Docker容器的宿主机能相互通信并且该容器使用net网络模式,改实现方式为网桥模式通信; 除此之外我们还可以通过使用第三方工具为...

    Docker跨主机容器通信overlay实现过程详解

    Docker的Overlay网络提供了一种方式,使得跨主机的容器可以相互通信,无需关心它们实际运行在哪台物理机上。下面将详细介绍如何在两台服务器上设置和使用Overlay网络。 ### 准备工作 首先,我们需要在两台服务器...

    利用OpenvSwitch完成Docker跨主机通信集群安装并部署Hadoop集群文档

    利用OpenvSwitch完成Docker跨主机通信集群安装并部署Hadoop集群

Global site tag (gtag.js) - Google Analytics