Docker单主机容器通信
一、默认网络
Docker 默认创建三种网络,可以使用 docker network ls 查看

其中不同的网络模式意义如下:
-
bridge:docker 网络的默认设置,为容器创建独立的网络命名空间,容器具有独立的网卡等所有单独的网络栈,启动容器时如果不用
--net指定,就默认采用这种网络模式。安装完 docker,系统会自动添加一个供 docker 使用的网桥 docker0,我们创建一个新的容器时,容器通过 DHCP 获取一个与 docker0 同网段的 ip 地址,并默认连接到 docker0 网桥,以此实现容器与宿主机的网络互通。 -
host:直接使用宿主机的网络(即使用宿主机的 ip 和端口),没有自己独立的网络环境。主机模式网络可用于优化性能,尤其是在容器需要处理大量端口的情况下,因为它不需要进行网络地址转换,也没有为每个端口都创建 userland-proxy。
-
none:为容器创建独立网络命名空间,但不为它做任何网络配置,用户可以在此基础上对容器网络做任意定制。
具体可见:docker docs-Networking overview
这些网络模式在相互网络通信方面的对比如下所示:
| 模式 | 是否支持多主机 | 南北向通信机制 | 东西向通信机制 |
|---|---|---|---|
| bridge | 否 | 宿主机端口绑定 | 通过Linux bridge |
| host | 是 | 按宿主机网络通信 | 按宿主机网络通信 |
| none | 否 | 无法通信 | 只能用link通信 |
(南北向指容器与宿主机外界的访问;东西向指与同一宿主机上其他容器相互访问)
二、自定义网络
虽然 Docker 提供的默认网络使用比较简单,但是为了保证安全性,在实际开发中更推荐使用自定义的网络进行容器管理

1. 创建网络
使用的命令为 docker network create,默认为 bridge 模式

如创建一个基于 bridge 网络模式的自定义网络 testb,并使用 docker network ls 查看
docker network create testb

通过 testb 创建容器
docker run -itd --name bsbox --net testb busybox
使用 docker inspect 容器名称|ID 查看容器的网络信息,在 Networks 中可以看到详细信息

2. 连接网络

通过 docker network connect 网络名称 容器名称 为容器连接新的网络模式,再次查看网络信息
docker network connect bridge bsbox

3. 断开网络
通过 docker network disconnect 网络名称 容器名称 命令断开网络,再次查看
docker network disconnect bridge bsbox

4. 移除网络
通过 docker network rm 网络名称 命令移除自定义网络模式,网络模式移除成功会返回网络模式名称

三、容器间通信
创建基于 bridge 网络模式自定义网络 test,然后创建两个基于自定义网络模式的容器
docker run -itd --name bbox1 --net test busybox
docker run -itd --name bbox2 --net test busybox
通过 docker network inspect test 查看两容器的具体 ip 信息

测试两容器间是否可以进行网络通信
docker exec -it bbox1 ping bbox2

Docker跨主机容器通信
一、概述
跨主机通信方案主要有以下几种:
-
容器使用 host 模式:容器直接使用宿主机的网络,这样天生就可以支持跨主机通信。虽然可以解决跨主机通信问题,但这种方式应用场景很有限,容易出现端口冲突,也无法做到隔离网络环境,一个容器崩溃很可能引起整个宿主机的崩溃。
-
端口映射:通过绑定容器端口到宿主机端口,跨主机通信时,使用
主机IP + 端口的方式访问容器中的服务。显而易见,这种方式仅能支持网络栈的四层及以上的应用,并且容器与宿主机紧耦合,很难灵活的处理,可扩展性不佳。 -
容器网络接口(CNI):CNI 综合考虑了灵活性、扩展性、IP 分配、多网卡等因素,旨在为容器平台提供网络的标准化,不同的容器平台能够通过相同的接口调用不同的网络组件。基于实现方式可分为两种:
-
隧道方案
通过隧道,或者说
Overlay Networking的方式:-
Weave:能够创建一个虚拟网络,用于连接部署在多台主机上的 Docker 容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息
-
Flannel:预先留出一个网段,为每个主机分配一个 subnet,容器从这其中分配 ip,这样所有的容器就认为大家都在同一个直连的网络。底层通过 UDP、VxLan 等进行报文的封装和转发
-
-
路由方案
-
Calico:它与其他虚拟网络最大的不同在于它没有采用 Overlay 网络做报文转发,而是提供了纯三层网络模型。整个过程都是根据 BGP 协议进行路由转发,并没有进行封包,解包过程,这样转发效率就会快得多,这是 Calico 容器网络的技术优势
-
Macvlan:允许在主机的一个网络接口上配置多个虚拟的网络接口,这些网络接口有自己独立的 MAC 地址,也可以配置上 IP 地址进行通信。
-
-
四种模式的对比如下所示:
| Calico | Flannel | Macvlan | Weave | |
|---|---|---|---|---|
| 网络模型 | 三层网络 | VxLan / UDP Channel | 二层网络 | VxLan / UDP Channel |
| 应用隔离 | 策略方式 | cidr | cidr | cidr |
| 支持的协议 | TCP UDP ICMP ICMPv6 | all | all | all |
| DNS支持 | no | no | no | yes |
| 分布式存储的要求 | yes | yes | no | no |
| 加密通道 | no | TLS | NaCl library | no |
| 容器子网限制 | no | no | no | no |
虽然这些方案在实现细节上存在很多差异,但其思路无非分为两种:二层 VLan 网络和 Overlay 网络。
二层 Vlan 网络把网络架构改造为互通的大二层网络,通过特定网络设备直接路由,实现容器点到点的之间通信。这种方案在传输效率上比 Overlay 网络占优,然而它需要二层网络设备支持,通用性和灵活性不如后者。
Overlay 网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在 IP 报文之上的新的数据格式。这样不但能够充分利用成熟的 IP 路由协议进程数据分发;而且在 Overlay 技术中采用扩展的隔离标识位数,能够突破 Vlan 的 4000 可用数量限制,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。
因此,Overlay 网络实际上是目前最主流的容器跨节点数据传输和路由方案。
参考: