docker容器网络管理应用

1. Docker 单主机容器通信的四种方式

(1).host 模式

由于容器和宿主机共享同一个网络命名空间,容器的 IP 地址即为宿主机的 IP 地址。 所以容器可以和
宿主机一样,使用宿主机的任意网卡,实现和外界的通信。其网络模型可以参照该图
 

 

       采用 host 模式的容器,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机具有公有 IP ,那么 容器也拥有这个公有 IP 。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。此时, 容器不再拥有隔离、独立的网络栈,而且容器内部将不再拥有所有的端口资源。

(2) bridge 模式

      该模式是 docker 默认的,也是开发者最常使用的网络模式。在这种模式下, docker 为容器创建独立的 网络栈,保证容器内的进程使用独立的网络环境,实现容器之间、容器与宿主机之间的网络栈隔离。同时, 通过宿主机上的 docker0 网桥,容器可以与宿主机乃至外界进行网络通信。其网络模型可以参考下图
        从网络模型可以看出,容器可以与宿主机乃至外界的其他机器通信的。同一宿主机上,容器之间都是 连接到 docker0 这个网桥上的,它可以作为虚拟交换机使容器可以相互通信。然而,由于宿主机的 IP 地址 与容器 veth pair IP 地址均不在同一个网段,为了使外界可以访问容器, docker 采用了端口绑定的方式, 也就是通过 iptables NAT ,将宿主机上的端口流量转发到容器内的端口上。例如,将宿主机的 3306 端口 绑定到容器的 3306 端口( docker run -tid --name db -p 3306:3306 MySQL )。很明显, bridge 模式的容器与 外界通信时,会占用宿主机上的端口,从而与宿主机竞争端口资源。

 (3) none 模式

       在这种模式下,容器有独立的网络栈,但不包含任何网络配置,只具有 lo 这个 loopback 网卡用于进程 通信。也就是说,none 模式为容器做了最少的网络设置,但是俗话说得好 少即是多 ,在没有网络配置的 情况下,通过第三方工具或者手工的方式,开发这 任意定制容器的网络 ,提供了最高的灵活性。

(4) container 模式

container docker 中一种较为特别的网络模式。在这个模式下的容器,会使用其他容器的网络命名 空间。当容器共享其他容器的网络命名空间,则在这两个容器之间不存在网络隔离,而她们又与宿主机以 及除此之外其他的容器存在网络隔离。其网络模型可以参考此图

 

       在这种模式下的容器可以通过 localhost 来访问同一网络命名空间下的其他容器,传输效率较高。而且, 这种模式还节约了一定数量的网络资源,但它并没有改变容器与外界通信的方式。

2. Docker 跨主机容器通信

目前比较流行的跨主机通信方案主要有以下几种:

(1) 基于隧道的 overlay 网络:

docker 原生的 overlay 网络就是基于 vxlan 隧道实现的。 Flannel 最新版本也 开始默认基于 vxlan 实现 overlay 网络。

(2) 基于包封装的 overlay 网络:

基于 UDP 封装等数据包包装方式,在 docker 集群上实现跨主机网络。典 型实现方案有 Weave Flannel 的早期版本。

(3) 基于三层实现 SDN 网络:

基于三层协议和路由,直接在三层上实现跨主机网络,并且通过 iptables 实 现网络的安全隔离。典型的方案为 Calico

利用 busybox 镜像建立容器,容器名称为 test_busybox1 test_busybox2,将网络模式设置为 none,将容器 test_busybox1 test_busybox2 IP 分别设置为 172.17.0.101 172.17.0.102,并实现两容器互通。

1. 建立容器 test_busybox1,设置网络模式为 none

进入容器 test_busybox1,查知该容器无 IP 地址。

Busybox 是一个集成了 100 多个最常用 Linux 命令的软件工具箱,他在单一的可执行文件中提供了精简

UNIX 工具集。该工具箱中包含了常见简单实用的工具如 catechogrepfindmounttelnet 等。

Busybox Linux 系统的瑞士军刀

(2) 建立容器 test_busybox2,设置网络模式为 none

 进入容器 test_busybox2,查知该容器无 IP 地址。

2. 配置容器 IP 地址

(1) 为容器 test_busybox1 设置 IP 地址 172.17.0.101(此处无需按学号要求更改 IP)。

① 查看虚拟网桥

 ② 安装网桥工具包

 ③ 添加一个 veth 对,指定 veth0 的对端是 veth1

 ④ 将 veth0 加入网桥

说明:从上述显示结果看出,veth0 已经加入网桥 docker0

⑤ 启动新端口 veth0

 ⑥ 查看容器 test_busybox1 的进程号

 ⑦ 制作软连接

 ⑧ 将 veth1 端口连接容器网络

 ⑨ 将端口 veth1 重命名为 eth0

 ⑩ 启用端口 eth0

 namespace 中指定 IP 地址及网关

 

在宿主机和容器内分别创建一个虚拟接口,并让它们彼此连通,这样的一对接口叫做 veth pair。它的 作用就是要把从一个 network namespace 发出的数据包转发到另一个 network namespace。而仅有 veth pair 设备,容器还是无法访问网络的。因为容器发出的数据包,实质上直接进入了 veth 设备的协议栈里。如果 容器需要访问网络,需要使用 bridge 等技术,将 VETH 接收到的数据包通过某种方式转发出去。

(2) 为容器 test_busybox2 设置 IP 地址 172.17.0.102(此处无需按学号要求更改 IP)。

① 添加一个 veth 对,指定 veth2 的对端是 veth3

 ② 将 veth2 加入网桥

说明:从上述显示结果看出,veth2 已经加入网桥 docker0

③ 启动新端口 veth2

 ④ 查看容器 test_busybox2 的进程号

 ⑤ 制作软连接

 ⑥ 将 veth3 端口连接容器网络

 ⑦ 将端口 veth3 重命名为 eth0

 ⑧ 启用端口 eth0

 ⑨ 在 namespace 中指定 IP 地址及网关

 3. 测试容器网络互通情况

(1) 进入容器 test_busybox1,测试容器与容器、容器与宿主机、容器与外部之间是否互通。

 

 (2) 进入容器 test_busybox2,测试容器与容器、容器与宿主机、容器与外部之间是否互通。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值