zoukankan      html  css  js  c++  java
  • Docker跨主机网络——overlay

    前言

    Docker网络——单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易。本文我为大家总结Docker跨主机通信相关知识。同样本文大部分内容以CloudMan的相关教程为基础。

    一、Docker 跨主机通信

    Docker跨主机网络方案包括:

    1. docker 原生的 overlay 和 macvlan。
    2. 第三方方案:常用的包括 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
    

    这样即使在不同的主机上使用同一 overlay 网络创建的容器,相互之间也能够直接访问。

    2.3 overlay 网络原理

    再创建完一个overlay网络之后,通过docker network ls可以看到网络中不仅多了一个我们创建的 ov_net2 (类型为overlay、scope为global),还能看到一个名为 docker_gwbridge (类型为bridge、scope为local)。这其实就是 overlay 网络的工作原理所在。

    通过brctl show可以看出,每创建一个网络类型为overlay的容器,则docker_gwbridge下都会挂载一个vethxxx,这说明确实overlay容器是通过此网桥进行对外连接的。

    简单的说 overlay 网络数据还是从 bridge 网络docker_gwbridge出去的,但是由于consul的作用(记录了overlay网络的endpoint、sandbox、network等信息),使得docker知道了此网络是 overlay 类型的,这样此overlay网络下的不同主机之间就能够相互访问,但其实出口还是在docker_gwbridge网桥。

    三、总结

    本文简单总结了 overlay 跨主机网络通信的实现原理和使用方式。后续会总结其他跨主机通信网络。

  • 相关阅读:
    SELinux安全方式
    PHP jpgraph的一点小提示和方法
    PHP之文件的锁定、上传与下载的方法
    MySQL与Oracle差异函数对比
    Dictionary 初始化数据
    IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求
    iis 负载均衡
    iis 反向代理 组件 Application Request Route
    语法糖
    vs git 推送远程会失败.
  • 原文地址:https://www.cnblogs.com/shoufengwei/p/7301157.html
Copyright © 2011-2022 走看看