相同宿主机下的dcoker之间通信


docker


docker的本质是进程,隔离的资源包括:网卡、回环设备、路由表和 iptables 规则,这些要素构成了一个进程(docker)发起和响应网络请求的基本环境。

host模式


--net=host 表示不开启Network Namespace,直接使用宿主机的网络。

bridge模式


  • 容器拥有自己的ip和端口,这里只讨论此模式。

  • docker会在宿主机上创建一个网桥docker0;当创建一个容器后,docker会生成一对veth pair设备,一个是容器内的eth0,一个挂载在宿主机的docker0上。

  • Veth Pair 设备的特点是:它被创建出来后,总是以两张虚拟网卡(Veth Peer)的形式成对出现的,并且从其中一个“网卡”发出的数据包,可以直接出现在与它对应的另一张“网 卡”上,哪怕这两个“网卡”在不同的 Network Namespace 里。

我们来创建两个容器

docker run -itd --name cos1 centos:base /bin/bash -c 'while true;do echo 1;sleep 100;done'
docker run -itd --name cos2 centos:base /bin/bash -c 'while true;do echo 1;sleep 100;done'

当前ip如下:

cos1:172.17.0.2

cos2:172.17.0.3

宿主机查看docker0,发现绑定了两张虚拟网卡 。

[root@kube-master src]# brctl show
docker0 8000.024250bc873d no veth4db29b2
veth96c7e85

这两张网卡分别和两个容器的eth0组成了两对veth pair设备:veth4db29b2和cos1的eth0,veth96c7e85和cos2的eth0。

#cos1上查看:
[root@691e3302003c /]# route
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 [root@691e3302003c /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 4 bytes 404 (404.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4 bytes 250 (250.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

cos2为172.17.0.3,所以从路由得知,对于目的地址为172.17.0.0/16的IP,匹配的是第二条路由规则,

Gateway是0.0.0.0,意味着这是一条直连规则:凡是匹配到这条规则的 IP 包,应该经过本机的 eth0 网卡,通过二层网络直接发往目的主机。

所以,当从cos1上去ping cos2时

包从cos1上的eth0 -> docker0的veth4db29b2,然后veth4db29b2进行ARP广播,

docker0收到ARP广播后,会把广播传给其他在docker0上的设备,也就是veth96c7e85,于是这个包就传到了cos2的eth0上,然后cos2的eth0把自己的mac地址回复给cos1,有了mac地址,cos1就可以把包发给cos2了。

所以,当从cos1上去ping cos2时,网络链路如下:

cos1的eth0 -> docker0的veth4db29b2 -> docker0的veth96c7e85 -> cos2的eth0

响应顺序则正好相反。

相同宿主机下的dcoker之间通信的更多相关文章

  1. Docker-单宿主机下的网络模式

    docker利用namespaces和cgroups实现了应用隔离和资源控制,那么网络层优势如何实现的呢?是直接使用宿主机的网卡设备,还是独立创造出自己的网络设备?以及容器如何与外界通信,下面我们通过 ...

  2. Mac下Kali虚拟机与宿主机共享文件夹

    宿主机: 1.创建文件夹.测试文件 ZhangSan-MacBook-Air:~ zhangsan$ mkdir kalishare && cd kalishare/ ZhangSan ...

  3. CentOS 7下宿主机使用virsh console访问KVM的设置

    在CentOS 6下要实现宿主机使用virsh console访问KVM可以说是非常麻烦,但这一问题在CentOS 7已经解决了,只需要两条命令在KVM下即可实现. 1.在KVM(客户机)下开机启动并 ...

  4. VMware14虚拟机与宿主机建立通讯

    当我们在VMware14中运行虚拟机搭建实验环境就需要与我们的宿主机或另一台虚拟机连接通讯,下面我们就来看看如何建立通讯,实现虚拟机与宿主机.虚拟机与虚拟机互联互通. 准备环境:一台安装好VMware ...

  5. Centos 虚拟机 和宿主机 文件共享

    我虚拟机下安装的是一个命令行式的centos ,想要把虚拟机里面的源文件移到宿主机上.于是我就想着搞一个文件共享. 网上有很多办法,比如Samba .ftp之类的.我选择了vmware自带的文件共享功 ...

  6. VMware虚拟机中centos6.5网络配置(桥接方式)与宿主机之间通信

    1.修改网络适配器 2.选择桥接所用的网卡 3.设置网络 3.1在系统终端中输入 setup ,进行图形网络配置(此命令只有redhat系列才有作用) 上下左右键选择,enter键确定 将光标移动到U ...

  7. VirtualBox实现宿主机和虚拟机之间网络的通讯

    摘要:实现宿主机和虚拟机之间网络的通讯 环境: 宿主机操作系统            WindowsXP 虚拟机软件                    VirtualBox 虚拟机操作系统     ...

  8. 如何配置 VirtualBox 中的客户机与宿主机之间的网络连接

    如何配置 VirtualBox 中的客户机与宿主机之间的网络连接 作者: Aaron Kili 译者: LCTT rusking | 2017-03-01 13:40   评论: 3 收藏: 3 当你 ...

  9. RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。

    RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大.最高效的方法之一.它为在分布式计算环境中运行的几乎所有应用程序提供基础.本文介绍 RPC 客户机和服务器之间基本的事件流 ...

随机推荐

  1. java中Math的常用方法整理

    public class Demo{ public static void main(String args[]){ /** *Math.sqrt()//计算平方根 *Math.cbrt()//计算立 ...

  2. VyOS软路由系统基本设置

    1. VyOS简介 VyOS是一个开源的网络操作系统,可以安装在物理硬件上,也可以安装在你自己的虚拟机上,或者是一个云平台上.它基于GNU/Linux,并加入了多个应用程序,如:Quagga, ISC ...

  3. Java多线程_线程池

    作用我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为 ...

  4. MacOS上的效率设置--Windows转移过来的小白设置

    1 Copy Path Mac上面的文件管理并不像Windows那么的直观,经常需要指定文件路径时,总是去右键-简介获取相当的费劲.Mac之所以称之为生产力工具,优势就在于此了.利用自动操作的功能就能 ...

  5. 浅谈python垃圾回收机制

    引入 ​ 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那 ...

  6. WPF实现飞控姿态仪表盘控件Attitude dashboard

    一.概要 近期项目当中需要用到飞机控制仪表盘的姿态仪,一开始去各大网站搜索解决方案要么就是winfrom要么就是很老的代码根本不能运行更甚者是居然有的还要下载积分. 只能自己手动从0开始写一个控件.这 ...

  7. Welcome To CUG_YZL's cnblogs

    Welcome To CUG_YZL's cnblogs  My name is YZL, studied in China University of Geosciences Wuhan now.W ...

  8. Palindrome subsequence(区间dp+容斥)

    In mathematics, a subsequence is a sequence that can be derived from another sequence by deleting so ...

  9. [V&N公开赛] CheckIn

    V&N战队考核+招新,赵师傅出的Web题,做着感觉有点顶,趁热打铁写write up记录一下考察的知识点 这道题说是CheckIn其实还是有一定难度的(也可能是我太菜了),进入题目直接给出了f ...

  10. 编程体系结构(02):Java异常体系

    本文源码:GitHub·点这里 || GitEE·点这里 一.异常简介 优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个 ...