Docker 跨主机网络
Docker提供两种原生的跨主机网络: Overlay 和 Macvlan
libnetwork & CNM
libnetwork 是 docker 容器网络库,最核心的内容是其定义的 Container Network Model (CNM),这个模型对容器网络进行了抽象,由以下三类组件组成:
Sandbox
Sandbox 是容器的网络栈,包含容器的 interface、路由表和 DNS 设置。 Linux Network Namespace 是 Sandbox 的标准实现。Sandbox 可以包含来自不同 Network 的 Endpoint。
Endpoint
Endpoint 的作用是将 Sandbox 接入 Network。Endpoint 的典型实现是 veth pair,后面我们会举例。一个 Endpoint 只能属于一个网络,也只能属于一个 Sandbox。
Network
Network 包含一组 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的实现可以是 Linux Bridge、VLAN 等。
下面是 CNM 的示例:

创建Overlay网络
环境host1(172.16.65.151)、host2(172.16.65.152)、host3(172.16.65.153)
Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,我们这里使用 Consul。
最简单的方式是以容器方式运行 Consul:
在host3上面运行 #docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
接下来修改 host1 和 host2 的 docker daemon 的配置文件 /lib/systemd/system/docker.service (不同的版本可能位置不一样)

--cluster-store 指定 consul 的地址。--cluster-advertise 告知 consul 自己的连接地址。
重启 docker daemon。
systemctl daemon-reload
systemctl restart docker.service
Docker主机将自动注册到Consul数据库中

在 host1 中创建 overlay 网络 ov_net1:

-d overlay 指定 driver 为 overaly。
docker network ls 查看当前网络:

注意到 ov_net1 的 SCOPE 为 global,而其他网络为 local。在 host2 上查看存在的网络:

host2 上也能看到 ov_net1。这是因为创建 ov_net1 时 host1 将 overlay 网络信息存入了 consul,host2 从 consul 读取到了新网络的数据。之后 ov_net 的任何变化都会同步到 host1 和 host2。
运行一个 busybox 容器并连接到 ov_net1:

查看容器的网络配置:

bbox1 有两个网络接口 eth0 和 eth1。eth0 IP 为 10.0.0.2,连接的是 overlay 网络 ov_net1。eth1 IP 172.17.0.2,容器的默认路由是走 eth1,eth1 是哪儿来的呢?
其实,docker 会创建一个 bridge 网络 “docker_gwbridge”,为所有连接到 overlay 网络的容器提供访问外网的能力。

从 docker network inspect docker_gwbridge 输出可确认 docker_gwbridge 的 IP 地址范围是 172.17.0.0/16,当前连接的容器就是 bbox1(172.17.0.2)。
而且此网络的网关就是网桥 docker_gwbridge 的 IP 172.17.0.1。

这样容器 bbox1 就可以通过 docker_gwbridge 访问外网。

如果外网要访问容器,可通过主机端口映射,比如:
docker run -p 80:80 -d --net ov_net1 --name web1 httpd
在 host2 中运行容器 bbox2:

bbox2 IP 为 10.0.0.3,可以直接 ping bbox1:

可见 overlay 网络中的容器可以直接通信,同时 docker 也实现了 DNS 服务。
下面我们讨论一下 overlay 网络的具体实现:
docker 会为每个 overlay 网络创建一个独立的 network namespace,其中会有一个 linux bridge br0,endpoint 还是由 veth pair 实现,一端连接到容器中(即 eth0),另一端连接到 namespace 的 br0 上。
br0 除了连接所有的 endpoint,还会连接一个 vxlan 设备,用于与其他 host 建立 vxlan tunnel。容器之间的数据就是通过这个 tunnel 通信的。逻辑网络拓扑结构如图所示:

要查看 overlay 网络的 namespace 可以在 host1 和 host2 上执行 ip netns(请确保在此之前执行过 ln -s /var/run/docker/netns /var/run/netns),可以看到两个 host 上有一个相同的 namespace
这就是 ov_net1 的 namespace,查看 namespace 中的 br0 上的设备。

查看 vxlan1 设备的具体配置信息可知此 overlay 使用的 VNI(VxLAN ID)为 256。

每个Container启动后,都会创建一个Network NameSpace, 可以通过ip netns进行查看

可以看到Container的网卡eth0@if12和宿主机的网卡veth64c08ba@if11是一对veth pair,然后桥接到docker0这个Bridge上的



Docker Overlay 创建的Network NameSpace中有自己的Bridge网络,将vxlan网络和Container的网卡进行连接

Docker 跨主机网络的更多相关文章
- Docker跨主机网络——overlay
前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...
- Docker 跨主机网络 overlay(十六)
目录 一.跨主机网络概述 二.准备 overlay 环境 1.环境描述 2.创建 consul 3.修改 docker 配置文件 4.准备就绪 三.创建 overlay 网络 1.在 host1 中创 ...
- Docker跨主机网络实践
Docker使用中网络管理是最麻烦的,在项目初始化前期就需要进行合理的规划,如果在比较理想的单主机的网络通信是比较简单的,但如果涉及到跨主机的网络就需要使用docker自带的overlay netwo ...
- Docker 跨主机网络方案分析
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- Docker跨主机网络解决方案
前言:前面的部分一直都是单机跑docker,但实际生产环境不可能只用一台来跑.肯定会用到多台,因为他们都是内部私有ip,那么多台主机之间的容器如何通信?这个是个很头疼的问题!目前主流几种方法如下:1. ...
- 安装docker跨主机网络flannel
一.实验环境 机器 操作系统 安装服务 172.16.4.36 centos7 docker etcd flannel 172.16.4.37 centos7 docker etcd flanne ( ...
- docker 跨主机网络:overlay 简介
简介 docker 在早前的时候没有考虑跨主机的容器通信,这个特性直到 docker 1.9 才出现.在此之前,如果希望位于不同主机的容器能够通信,一般有几种方法: 使用端口映射:直接把容器的服务端口 ...
- Docker跨主机网络联通之etcd实现
搭建ETCD集群 查看NODE1机器IP,并启动ETCD ubuntu@docker-node1:~$ ifconfig eth0 eth0: flags=4163<UP,BROADCAST,R ...
- 跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)
前面已经学习了 Docker 的几种网络方案:none.host.bridge 和 joined 容器,它们解决了单个 Docker Host 内容器通信的问题.本章的重点则是讨论跨主机容器间通信的方 ...
随机推荐
- db2将原表列notnull属性修改为null属性的方法
今天把自己遇到的一个小问题跟大家分享一下如何修改db2数据库表中列的属性--将列的非空属性改为允许空的属性,修改数据表的某一列属性其实很简单但是里面有需要细节需要dba注意,毕竟数据的安全才是最重要的 ...
- java 证书 .cer 和 .pfx
作为文件形式存在的证书一般有这几种格式: 1.带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形 ...
- NGUI Checkbox与PlayerPrefs
UICheckboxPrefs.cs 1,bool isChecked:false 为“初始”状态,true为“选中”: 2,bool startsChecked:true,一运行,就显示UISpri ...
- hoj 2739 中国邮局问题
/*若原图的基图不连通, 或者存在某个点的入度或出度为 0 则无解. 统计所有点的入度出度之差 Di, 对于 Di > 0 的点, 加边(s, i, Di, 0); 对于 Di < 0 的 ...
- scaffolding —— 脚手架(转)
Scaffolding — 基架 基于数据库架构生成网页模板的过程.在 ASP .NET 中,动态数据使用基架来简化基于 Web 的 UI 的生成过程.用户可以通过这种 UI 来查看和更新数据库. ...
- C++ 基础知识回顾(string基础、智能指针、迭代器、容器类)
[1] string基础 [1.1] string 的构造 #include <iostream> #include <string> int main() { using n ...
- 《从零开始学Swift》学习笔记(Day 39)——构造函数重载
原创文章,欢迎转载.转载请注明:关东升的博客 构造函数作为一种特殊方法,也可以重载. Swift中构造函数可以多个,他们参数列表和返回值可以不同,这些构造函数构成重载. 示例代码如下: class ...
- 1060 最复杂的数(反素数玄学dfs)
1060 最复杂的数 题目来源: Ural 1748 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中 ...
- git github usage
以gerrit-trigger-plugin为例,下面的链接都是从相应页面上直接拷贝的. 法一:不用github的账号,打开这个库在github上的主页,运行下面命令即可 read only 运行命令 ...
- 如何查看l操作系统是否开启rpc服务
linux操作系统 在linux 5.X以及下的版本你可以通过service portmap status命令查看rpc是否启动.如果提示running,表示正在运行:如果提示stop就是关闭了.如果 ...