CNI Plugins Example

下面使用单个 CNI 插件以及链式调用插件分别配置 Docker 容器网络。

本实验使用的是笔者自己制作的镜像,监听在 8080 端口,收到 GET 请求,返回请求的 IP 地址、端口以及容器的 IP 地址、端口。

目录结构

$ ls *
bridge.json  portmap.conflist

bin:
bandwidth  dhcp      host-device  ipvlan    macvlan  ptp  static  vlan
bridge     firewall  host-local   loopback  portmap  sbr  tuning  vrf

cni 相关信息文件存在于 /var/lib/cni 目录下

单个插件 bridge

  • 指定 --net=none 创建了容器,容器所在网络命名空间只有 loopback 设备。

$ docker run -d --rm --name http-test --net=none  registry.cn-hangzhou.aliyuncs.com/ericwvi/http-test
71ad9b005af450ee7d40e0959b6b340f0c929824cd9ae7a2f6f3c1f5a369241d

$ docker inspect -f '{{.State.Pid}}' 71a
23986

$ nsenter -t 23986 -n ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
  • 使用 bridge 插件为容器创建网络接口,并连接到主机网桥。

  • 主机 veth 设备 veth495fddad@if2 中 2 对应容器命名空间里的 2 号设备。容器命名空间里 eth0@if5 中 5 对应主机的 5 号设备。

  • 删除设备

  • 删除网桥 ip link delete mybridge0 type bridge

链式调用 bridge & portmap

  • 为了避免配置文件格式转换的繁琐工作,使用 cnitool 进行链式调用的配置 go install github.com/containernetworking/cni/cnitool@latest

  • 配置文件:设置 bridge 及 端口映射,文件后缀为 .conflist

  • 配置

  • 访问验证

  • 删除网络

  • 删除网桥 ip link delete mynet0 type bridge

Last updated