一、概述

  docker的网络驱动有很多种方式,按照docker官网给出的网络解决方案就有6种,分别是:bridge、host、overlay、macvlan、none、Network plugins,每个网络都有自己的特点,当然应用场景也不同,比如当有多台主机上的docker容器需要容器间进行跨宿主机通讯时,overlay和macvlan可提供解决方案,而默认docker采用的是bridge模式,而此模式不能与其他主机上的docker容器通讯。本文主要介绍docker单主机通讯方式的几种通讯模式:bridge、host、none、container。
  启动容器指明网络通过参数--network选择指定,可简写为--net,默认如果不加选项使用的是bridge。

二、bridge网络模式

介绍

   bridge模式是docker默认的网络方式,当Docker 进程启动时,会自动在主机上创建一个 docker0 虚拟网桥,默认分配网段172.17.0.0/16,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机,附加在其上的任何网卡之间都能自动转发数据包。
    创建一个容器时,容器从docker0中的子网分配一个IP地址(也可以使用--ip指定),并创建一对veth虚拟网络设备,一个设备在容器中作为容器的网卡名叫eth0,另一个设备在宿主机上叫做名称为vethXXX并桥接在docker0上,可通过命令brctl show 查看,通过这样的桥接方法宿主机上的所有容器都处于同一个二层网络中,这样使得容器与容器以及容器与宿主机之间能够互相通信,以下介绍其通信细节。(ps:这里的通信是单主机上容器通讯)

关于veth

    veth 是 Virtual ETHernet 的缩写,是一种虚拟网络设备。它的特点是:当它被创建以后,总是以两张虚拟网卡(Veth peer)形式成对出现,并且在一个网卡上的数据包可直接转发给另一个与之对应的网卡上,即使这两个网卡不在同一个namespace中。这里推荐一篇文章介绍veth: https://segmentfault.com/a/1190000009251098

容器与容器间通讯

启动一个bs1的容器,并查看其IP地址为172.17.0.2,默认网关为172.17.0.1。而这个网关地址则是网桥docker0地址:

同时我们查看docker0桥接的网卡与刚才容器对应的veth网卡:

同样的在启动一个容器为bs2,IP地址为172.17.0.3 ,网关172.17.0.1,即也是docker0:

此时docker0上会多了一个bs2的veth设备veth7833d44:

当我们从容器bs1中ping 172.17.0.3(容器bs2)时候,在bs1容器里,根据路由规则,数据包从eth0转发址与之对应的veth(veth0737c95)上,该veth桥接在了docker0上,此时数据包到达了docker0,docker0此时扮演交换机角色并广播ARP请求寻找172.17.0.3的mac地址,而此时的bs2的另一个veth设备桥接在了docker0上并收到该ARP请求,发现自己是172.17.0.3,将其mac地址回复给bs1,此时的容器bs1就可以和bs2进行通讯了,并且在bs1上可以查看到缓存的172.17.0.3的mac地址:

以上的两个容器间的通讯过程示意图如下:

容器与外部网络通讯

同样的,介绍了容器与容器间的通讯,容器与主机间的通讯就容易理解了,如果在容器bs1 ping 另一个主机10.168.0.3,它发出去的数据包经过docker0网桥流向eth0,eth0在将数据包转发给与之相通的10.168.0.3,于是bs1就能和其主机节点进行通讯了。当然如果这个地址不是其他主机节点而是公网地址,只要eth0能到达,容器bs1都能与之通讯。以下是其示意图:

宿主机与容器通讯

当宿主机访问容器时,数据包从docker0流入到与容器对应的veth设备,在经容器的eth0到达到主机中,示意图如下:

外部访问容器

默认情况,其他外部网络(宿主机以外)无法访问到容器内的端口,通常的做法是使用-p或者-P选项(使用方法参考docker基础篇)来暴露容器中的端口到宿主机上,外部网络通过访问宿主机的端口从而访问到容器端口。本质上来说,该方式是通过iptables规则转发实现的,例如以下启动nginx容器并使用宿主机的8080映射到容器内部80端口:

查看其对应的iptables规则:

上述规则表明当访问宿主机的8080端口时,NAT到容器中的172.17.0.4的80中。

自定义网桥

除了使用默认docker0作网桥以为还可以使用docker network 相关命令自定义网桥,以下将创建一个br1的网络,子网是172.30.0.0/16,网关为172.30.0.1:

查看docker网络:

查看对应网桥:

此时运行一个容器指明网络使用br1,此时的容器地址使用的是172.30.0.0段的网络,此时使用的网桥为br-9e5b3fba2e11,如下:

三、host网络模式

Host模式使用是在容器启动时候指明--network host,此时容器共享宿主机的Network Namespace,容器内启动的端口直接是宿主机的端口,并且容器不会创建网卡和IP,直接使用宿主机的网卡和IP,但是容器内的其他资源是隔离的,如文件系统、用户和用户组。这种模式的好处就是效率高,因为不需要额外的网络开始,直接使用宿主机网络。同样启动一个nginx,此时共享主机网络:

此时连入容器内部直接能看到docker0与宿主机网卡:

以上的host网络模式下的示意图:

四、container网络模式

理解了host模式就很容易理解container模式,host模式是容器共享宿主机的Network Namespace,而container模式即共享已存在的容器的Network Namespace,此时这两容器共同使用同一网卡、主机名、IP地址,容器间通讯可直接通过lo回环接口通讯,但是其他名称空间是隔离的,例如User、Mount。如果你了解kubernetes中的pod的话,pod内的网络也是靠这样的共享方式来实现的。

这里启动一个bs-1容器,IP地址为172.17.0.2:

此时再运行一个容器共享bs-1的网络,此时在bs-2的容器同样看到的是bs1的网卡:

示意图:

五、none网络模式

使用--network none选项指定其网络模式,在该模式下虽然容器有着自己的Network Namespace,但是容器内没有网卡、IP、路由信息,只有一个lo回环接口。如果需要网络配置则需要用户手动进行配置网卡、ip以及路由信息,通常这样的容器用于承担某些无需网络介入的工作,如离线任务、备份等。启动一个none网络模式的容器如下:

示意图:

总结

  本文着重对docker 单主机网络中默认bridge网络模式做了较多介绍,其核心是通过docker0网桥+Veth Pair设备实现,而host、container模式都是“共享”方式实现,host网络模式是容器共享宿主机Network Namespace,continer网络模式是容器共享已存在的容器的Network Namespace,none模式则是网络封闭状态,容器内使用lo接口通讯。

Docker网络模式介绍的更多相关文章

  1. VMware网络模式介绍(下篇)

    VMware网络模式介绍 VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式). Bridged 模式: 在桥接模式下,VMwa ...

  2. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  3. Docker 网络基础介绍

    [编者按]本文作者为 Mesosphere 开发大使 Michael Hausenblas,主要介绍配置 Docker 单主机网络的基本知识.文章系国内 ITOM 管理平台 OneAPM 编译呈现. ...

  4. docker网络模式----入门docker的难点

    众所周知,现在docker是轻量级虚拟化的典型代表!这段时间想要建立一个分布式系统,但是手头上主机没那么多,所以使用docker进行虚拟化,但是在使用的过程中对网络这一部分是一直不太理解,特别找了一篇 ...

  5. docker 网络模式详解

    一.前言 Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分.因此,我们有必要 ...

  6. Docker网络模式详解

    一.Docker四种工作模式 安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络). none .hosthost:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用 ...

  7. Docker网络模式说明

    现在的Docker版本不推荐继续使用Link了,而是推荐用网络模式解决问题,简单讲一下最常用的几个网络模式,其他我用到时候再补充. bridge -net不加参数就是默认的bridge模式,这个默认b ...

  8. Docker 网络模式和跨主机通信

    Docker的四种网络模式 Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上.虚拟网桥的工作方式和物理交 ...

  9. VMware网络模式介绍

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式). Bridged 模式: 在桥接模式下,VMware虚拟机里的系统就像是  ...

随机推荐

  1. 【解决】Error: ENOSPC: no space left on device, watch

    发现问题: 启动 node 项目ReactNative时候出现报错Error: ENOSPC: no space left on device, watch [root@iz2zeihk6kfcls5 ...

  2. MapReduce工程(IDEA)

    MapReduce工程(IDEA) hadoop 1. maven工程 1.1 创建maven工程 1.2 修改配置文件 1.3 Mapper类 1.4 Reduces类 1.5 Driver类 1. ...

  3. LVS负载均衡部署

    一.lvs-nat模式 1.1.环境介绍 本实验用三台虚拟机完成,一台虚拟机模拟lvs调度器,两块网卡,一块模拟公网一块模拟私网,公网地址192.168.0.201/24,私网地址192.168.4. ...

  4. KVM虚拟机被OOM killer

    一.线上环境的虚拟机被KVM物理机kill掉 Linux 内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用的内存可以留作它用,这部分内存是属于 ...

  5. Python 基础-> 字符串,数字,变量

    Python 基础:字符串,数字,变量 1. 字符串 (信息的一种表达方式) a. 使用引号创建字符串 b. 单引号,双引号,三引号: ', ", ''', ""&quo ...

  6. 如何测试Web服务.3

    -->全文字数:2254,需要占用你几分钟的阅读时间 ,您也可以收藏后,时间充足时再阅读- ->第一节讲了<Web服务基础介绍>,第二节讲了<Web服务测试工具> ...

  7. php备忘录模式(memento pattern)

    晚上刷起来. <?php /* The memento pattern provides the object restore functionality. Implementation is ...

  8. Vuex准备

    (1)简介 每一个 Vuex 应用的核心就是 store(仓库).“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state).Vuex 和单纯的全局对象有以下两点不同: Vuex ...

  9. 第一篇 -- XML基础

    一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...

  10. CRAP-API——如何在Linux服务器部署CRAP-API教程

    前言 之前一直用的eolinker的免费版,但是人数有限,所以想找个免费开源的API管理平台,然后就选择了CRAP-API. 步骤 部署环境 LNMT部署 我的环境是之前部署的是LNMP,后面又增加的 ...