一、前言Docker网络
1、单 Docker Host 容器通信网络方案
none、host、bridge 和 joined 容器
2、跨主机容器间通信网络方案
A、Docker 原生 Network 的 overlay 和 macvlan
B、第三方方案常用的有 flannel、weave 和 calico
N方案如何与 Docker 集成?
利用: libnetwork 以及 CNM
2.1、libnetwork & CNM
libnetwork 是 Docker 容器网络库
Container Network Model (CNM)是libnetwork的核心,对容器网络抽象化,由以下三类组件组成:
Sandbox
Sandbox 是容器的网络栈,包含容器的 interface、路由表和 DNS 设置
Linux Network Namespace 是 Sandbox 的标准实现
Sandbox 可以包含来自不同 Network 的 Endpoint
Endpoint
Endpoint 作用是将 Sandbox 接入 Network
Endpoint 典型实现是 veth pair
1个 Endpoint 只能属于一个网络,且只能属于一个 Sandbox
Network
Network 包含一组 Endpoint
同1个 Network 的 Endpoint 可直接通信
Network 的实现可以是 Linux Bridge、VLAN 等
CNM 示例:
如上图所示:
2个容器,1个容器1个 Sandbox,每个 Sandbox 都有1个 Endpoint 连接到 Network 1,第2个 Sandbox 还有1个 Endpoint 是接入到了 Network 2
libnetwork CNM 定义了 Docker Container的网络模型,按照该模型开发出的 driver 能与 docker daemon 协同工作,实现Container Network
Docker 原生的 driver 包括 none、bridge、overlay 和 macvlan
第三方 driver 包括 flannel、weave、calico 等
二、Docker Overlay Network 环境
Docker 提供了 overlay driver,可创建基于 VxLAN 的 overlay 网络
VxLAN 将二层数据封装到 UDP 进行传输,VxLAN 提供与 VLAN 相同的以太网二层服务,并且拥有更强的扩展性和灵活性
什么是overlay网络
overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密,当我们初始化一个swarm或是加入到一个swarm中时,在docker主机上会出现两种网络:
第一种、称为ingress的overlay网络
用于传递集群服务的控制或是数据消息,若在创建swarm服务时没有指定连接用户自定义的overlay网络,将会加入到默认的ingress网络
第二种、名为docker_gwbridge桥接网络
docker_gwbridge桥接网络会连接swarm中所有独立的docker系统进程
可以使用docker network create创建自定义的overlay网络,容器以及服务可以加入多个网络,只有同一网络中的容器可以相互交换信息,可以将单一容器或是swarm服务连接到overlay网络中,但是两者在overlay网络中的行为会有所不同,接下来会描述两者在overlay网络中的共同行为以及不同行为
注意事项:
如果想要连接到overlay网络,请确保连接前下列端口没有服务,并且服务器防火墙要允许下列端口通过:
TCP端口2377,用于集群管理信息的交流
TCP、UDP端口7946用于集群中节点的交流
UDP端口4789用于overlay网络中数据报的发送与接收
1、搭配key-value 数据库
Docerk overlay 网络需要1个 key-value 数据库来保存网络状态信息,包括 Network、Endpoint、IP 等
Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,此处使用 Consul
2、环境描述
使用docker-machine 创建的实验环境
- 跨主机的2台Docker 主机
Docker 主机 host02(192.168.233.144)和 host03(192.168.233.145)上实践各种跨主机网络方案
B、部署组件
主机 docker-centos (192.168.233.143) 上部署支持的组件,如: Consul
简单方式--容器方式运行 Consul
Consul可以用来实现分布式系统的服务发现与配置,它是HashiCorp公司推出的一款实用开源工具,支持Linux等平台。Consul是分布式的、高可用的、可横向扩展的。
Consul具备的特性:
服务发现: Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
健康检测: Consul的Client提供了健康检查的机制,可以通过用来避免流量被转发到有故障的服务上。
Key/Value存储: 应用程序可以根据自己的需要使用Consul提供的Key/Value存储。Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
多数据中心: Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
执行指令: