Docker 网络部分知识

Docker 网络

一、简介

Docker 网络架构源自于一种叫做容器网络模型(CNM)的方案,该方案是开源的并且支持插接式连接。Libnetwork 是Docker对CNM的一种实现吗,提供了Docker核心网络架构的全部功能,不同的驱动可以通过插拔的方式接入Libnetwork来提供定制化的网络拓扑。

为了实现开箱即用的效果,Docker封装了一系列本地驱动,覆盖了大部分常见的网络需求。其中包括单机桥接网络(Single-Hose Bridge Network)、多机覆盖网络(Multi-Host Overlay),并且支持接入现有VLAN。

二、基础理论

Docker 网络架构由3个主要部分构成:CNM、Libnetwork和驱动。

CNM是设计标准。在CNM中,规定了Docker网络架构的基础组成要素。

CNM 定义了3个基本要素:沙盒、终端和网络
沙盒:是一个独立的网络栈。其中包括以太网接口、终端、路由表以及DNS配置。
终端:就是虚拟网络接口。
网络:是802.1d网桥的软件实现。

Libnetwork 是CNM的具体实现,并且被Docker采用。Libnetwork通过Go语言编写,并实现CNM中列举的核心组件。

驱动通过实现特定网络拓扑的方式来拓展该模型的能力。

  • 单机桥接网络

    单机:意味着该网络只能在单个Docker主机上运行,并且只能与所在Docker主机上的容器进行连接
    桥接:意味着这是802.1.d桥接的一种实现(二层交换机)
    

    在linux Docker主机之上,默认的"bridge"网络被映射到内核中为"docker0"的linux 网桥。

    [root@localhost ~]# docker network inspect bridge | grep bridge.name
                "com.docker.network.bridge.name": "docker0",
    
    

    使用docker network create命令创建新的单机桥接网络,名为:“localnet”

    docker network create -d bridge localnet
    

    创建成功之后会出现在docker network ls命令的输出内容总,还会在主机内核中创建一个新的Linux网桥。

    [root@localhost ~]# brctl show
    bridge name	           bridge id		    STP enabled	     interfaces
    br-509626cdf043		   8000.0242723de637	no		         
    docker0		           8000.024269f06e58	no		         veth9a5266b
    

    第一个网桥(br-509626cdf043)与新建的"localnet" Docker 桥接我网络相对应。当前网桥没有接入任何设备(对应的interface为空)

    创建一个新的容器,并且接入到这个新的网桥中(localnet)。

    docker run -d --name c1 --network localnet alpine sleep 1d
    

    再次运行brctl show命令,可以看到 c1 的网络接口连接到 br-509626cdf043 网桥。

    [root@localhost ~]# brctl show
    bridge name	           bridge id		    STP enabled	     interfaces
    br-509626cdf043		   8000.0242723de637	no		         veth1ebd250
    docker0		           8000.024269f06e58	no		         veth9a5266b
    
    

    如果在相同网络中继续接入新的容器,那么在新接入容器中可以通过容器名称来ping通的。这是因为新容器都注册到了指定的Docker

    DNS 服务,所以相同网络中的容器可以解析其他容器的名称。

    注:Linux 上默认的Bridge网络是不支持通过Docker DNS 服务进行域名解析的。自定义桥接网络可以!

    这里提到的桥接网络中的容器只能位于相同网络中的容器进行通讯,但是可以使用端口映射来绕开这个限制。

  • 多机覆盖网络

    覆盖网络适用于多机环境,它允许单个网络包含多个主机,这样不同主机上的容器间就可以在链路层实现通信。

    覆盖网络是理想的容器间通讯方式,支持完全容器化的应用,并且具备良好的伸缩性。

    Docker 为覆盖网络提供了本地驱动,这使得创建覆盖网络非常简单,只需要在 docker network create 命令中添加 -d overlay 参数。

  • 接入现有网络

    应中已容器化的部分需要与那些运行在物理网络和VLAN上的未容器化的部分进行通信,这就需要使用到----Macvlan驱动

    Docker 内置的Macvlan驱动可以为容器提供MAC和IP地址。

    Docker 内置的Macvlan驱动可以为容器提供MAC和IP地址。

    Macvlan的优点是性能优异,因为无须端口映射或者额外桥接,可以直接通过主机接口(或者子接口)访问容器接口。但是Macvlan的缺点是需要将主机网卡(NIC)设置为混杂模式,这在大部分公有云平台是不允许的。

    下面创建一个名为macvlan100的Macvlan网络:

    docker network create -d macvlan --subnet=10.0.0.0/24 --ip-range=10.0.0.0/25 --gateway=10.0.0.1 -o parent=docker0.100 macvlan100
    

    该网络会连接到VLAN 100,该命令会创建 macvlan100 网络以及 docker0.100 子接口。

    通过--ip-range参数告知Macvlan网络在子网中有哪些IP地址可以分配给容器。这些地址必须被保留,不能用于其他节点或者DHCP服务器,因为没有任何管理层功能来检查IP区域重合问题。

    下面将容器部署到该网络(macvlan100)

    docker run -d --name mactainer1 --network macvlan100 alpine sleep 1d
    

    mactainer1容器可以ping通任何加入VLAN 100 的系统,并进行通信。

三、 服务发现

服务发现允许容器和Swarm服务通过名称互相定位,唯一的要求就是需要处于同一个网络当中。

其底层实现就是利用Docker内置的DNS服务器,为每一个容器提供DNS解析功能。

用户可以为Swarm服务和独立容器进行自定义的DNS配置,--dns参数允许指定自定义的DNS服务列表,以防出现内置的Docker DNS服务器解析失败的情况。此外还可以使用 --dns-search 参数指定自定义查询时所使用的的域名。

四、Ingress 网络

Swarm 支持两种服务发布模式,两种模式均保证服务从集群外可访问。

  • Ingress 模式(默认)
  • Host 模式

通过Ingress模式发布的服务,可以保证从Swarm集群内任意一节点都能访问该服务;以Host模式发布的服务只能通过运行服务副本的节点来访问。

你可能感兴趣的:(docker,网络,运维)