一、概述

  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. Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇

    Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Internet与中国 Internet最早来源于美 ...

  2. React源码 ReactContext

    我们知道在react当中,组件与组件的沟通是通过props,父组件通过props给子组件传递一些属性,父组件可以传递一些回调函数给子组件,让子组件在某些特定的时候,可以调用父组件的一些特性. 但是我们 ...

  3. Bag of Tricks for Image Classification with Convolutional Neural Networks笔记

    以下内容摘自<Bag of Tricks for Image Classification with Convolutional Neural Networks>. 1 高效训练 1.1 ...

  4. 搭建unity客户端

    1.新建个unity的项目ChatClient 2.在unity的Main Camera下挂载个脚本PhotonServerEngine做为与服务器端通信的脚本 3.在PhotonServerEngi ...

  5. python 连接 redis cluster 集群

    一. redis集群模式有多种, cluster模式只是其中的一种实现方式, 其原理请自行谷歌或者百度, 这里只举例如何使用Python操作 redis cluster 集群 二. python 连接 ...

  6. python基础语法5 函数定义,可变长参数

    函数 1.什么是函数 函数就是一种工具. 可以重复调用 2.为什么要用函数 1.防止代码冗(rong)余 2.代码的可读性差 3.怎么用函数 1.定义函数-->制造工具 2.调用函数--> ...

  7. 前端性能----CDN

    Content Distribute Network(内容分发网络)是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调度等功能模块,使用户就近获取所需内容 ...

  8. django-评论

    视图函数views.py # 订单评论 class OrderCommentView(View): def get(self, request, order_id): # 获取用户信息 user = ...

  9. C 语言项目中.h文件和.c文件的关系

    http://blog.csdn.net/xingkong_678/article/details/38639847 关于两者以前的关系,要从N年以前说起了~ long long ago,once a ...

  10. 数据库 = filesystem + transcation + dsl + dslengine

    数据库 = filesystem + transcation + dsl + dslParser