当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    Docker跨主机网络(overlay)的实现

    栏目:win服务器问题汇总 时间:2019-12-18 22:11

    一、Docker 跨主机通信

    Docker跨主机网络方案包括:

    docker 原生的 overlay 和 macvlan。
    第三方方案:常用的包括 flannel、weave 和 calico。
    docker 通过 libnetwork 以及 CNM 将上述各种方案与docker集成在一起。

    libnetwork 是 docker 容器网络库,最核心的内容是其定义的 Container Network Model (CNM),这个模型对容器网络进行了抽象,由以下三类组件组成:

    1.1 Sandbox
    Sandbox 是容器的网络栈,包含容器的 interface、路由表和 DNS 设置。 Linux Network Namespace 是 Sandbox 的标准实现。Sandbox 可以包含来自不同 Network 的 Endpoint。也就是说Sandbox将一个容器与另一个容器通过Namespace进行隔离,一个容器包含一个sandbox,每一个sandbox可以有多个Endpoint隶属于不同的网络。

    1.2 Endpoint
    Endpoint 的作用是将 Sandbox 接入 Network。Endpoint 的典型实现是 veth pair。一个 Endpoint 只能属于一个网络,也只能属于一个 Sandbox。

    1.3 Network
    Network 包含一组 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的实现可以是 Linux Bridge、VLAN 等。


    Docker网络架构

    图片截至CLOUDMAN博客。

    libnetwork下包含上述原生的driver以及其他第三方driver。
    none、bridge网络前面已经介绍。bridge就是网桥,虚拟交换机,通过veth连接其与sandbox。

    二、Docker overlay 网络

    2.1 启动 key-value 数据库 Consul

    Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件。

    consul是一种key-value数据库,可以用它存储系统的状态信息等,当然这里我们并不需要写代码,只需要安装consul,之后docker会自动进行状态存储等。最简单的安装consul数据库的方法是直接使用 docker 运行 consul 容器。

    docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

    启动后可以通过 host ip的8500端口查看consul服务。

    为了让 consul 发现各个 docker 主机节点,需要在各个节点上进行配置。修改各个节点 docker daemon 的配置文件/etc/systemd/system/docker.service。在 ExecStart 最后添加

    --cluster-store=consul://<consul_ip>:8500 --cluster-advertise=ens3:2376
    其中 <consul_ip> 表示运行 consul 容器的节点IP。ens3为当前节点的ip地址对应的网卡,也可以直接填写ip地址。

    以上是单机版 consul 的安装方法,建议采用集群模式,集群模式安装方式见https://www.consul.io/intro/getting-started/join.html。

    2.2 创建 overlay 网络

    创建 overlay 网络与之前创建 bridge 网络基本相同,唯一不同的是将-d参数设置为overlay。如下:

    docker network create -d overlay ov_net2

    docker network create -d overlay ov_net3 --subnet 172.19.0.0/24 --gateway 172.19.0.1

    只需要在一个节点中进行上述创建过程,其他节点自动会识别到该网络,原因正是在于consul的服务发现功能。

    之后创建容器的时候只需要指定--network参数为ov_net2即可。

    docker run --network ov_net2 busybox