一、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://:8500 –cluster-advertise=ens3:2376
其中