Docker网络(下)

简介: Docker网络(下)

六、Flannel网络


(1)简介


  • 在公司中不可能只有一台机器上安装容器,肯定会出现不同主机容器通信的情况,而使用上面的网络模式可能会出现一些问题,比如ip地址冲突等
  • Flannel是一种基于overlay(二层,数据链路层)网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信
  • Flannel是CoreOS开发,专门用于docker多机互联的一个工具,让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟ip地址
  • Flannel使用go语言编写的第三方软件,并不是Docker官方的,最终实现了不同主机容器的互相通信
  • 在使用Flannel时还需要安装etcd用来存放网络配置等信息,并且Flannel是C/S架构,需要在每台主机上安装agent端


(2)Flannel网络实现原理


Flannel为每个host主机分配一个subnet,每个容器从subnet中分配ip地址。subnet可以看做是一个地址池


每个subnet都是从一个更大的ip地址池中划分的,flannel会在每个主机上运行一个叫flanneld的agent进程,它的作用就是负责从更大的ip地址池中分配自己所在主机的subnet


Flannel使用etcd来存放网络配置、已经分配的subnet以及host主机的ip等信息,也正是因为这个去记录每个主机容器的subnet地址池,所以才实现了不同主机容器之间的互相通信(解决了ip地址冲突)


Flannel数据包在主机之间的转发是由backend实现的,目前支持的类型有UDP、VXLAN,host-gw、AWS VPC和GCE路由等多种backend,默认为UDP但是一般都使用VXLAN


VXLAN全称Virtual Extensible LAN,是一种虚拟化隧道通信技术,主要是为了突破VLAN的最多4096个子网的数量限制,以满足大规模云计算数据中心的需求。VLAN技术的缺陷是VLAN Header预留的长度只有12 bit,故最多只能支持2的12次方即4096个子网的划分,无法满足云计算场景下主机数量日益增长的需求。当前VXLAN的报文Header内有24 bit,可以支持2的24次方个子网,并通过VNI(Virtual Network Identifier)来区分不同的子网,相当于VLAN当中的VLAN ID。
不同于其他隧道协议,VXLAN是一个一对多的网络,并不仅仅是一对一的隧道协议。一个VXLAN设备能通过像网桥一样的学习方式学习到其他对端的IP地址,也可以直接配置静态转发表。
当采用VXLAN模式时,flanneld在启动时会通过Netlink机制与Linux内核通信,建立一个VTEP(Virtual Tunnel Access End Point)设备flannel.1 (命名规则为flannel.[VNI],VNI默认为1),类似于交换机当中的一个网口,并将VTEP设备的相关信息上报到etcd当中。网络包在通过宿主机发出前先是加上了UDP头(8个字节),再然后加上了IP头(20个字节)进行封装,因此flannel0的MTU要比eth1的MTU小28个字节(MAC头加IP头)。
  • 网络转发结构图:


e4a40ce3600e498eb5b4307a25b0d33a.png


  1. 容器直接使用目标容器的ip进行访问,数据默认通过容器内部的eth0发送出去。
  2. 报文通过veth pair被发送到vethXXX。
  3. vethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。
  4. 查找路由表,外部容器ip的报文都会转发到flannel.1虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。
  5. flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。
  6. 报文通过主机之间的网络找到目标主机。
  7. 报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。
  8. 数据被解包,然后发送给flannel0虚拟网卡。
  9. 查找路由表,发现对应容器的报文要交给docker0。
  10. docker0找到连到自己的容器,把报文发送过去。


(3)Flannel网络安装配置


-实验环境


系统 主机名 ip地址 安装软件
Centos7.4 docker-01 192.168.100.202 桥接网卡 etcd、flannel、docker
Centos7.4 docker-02 192.168.100.203 桥接网卡 flannel、docker


-实验步骤


1.在两台主机上都安装Docker并且开启

******两台主机安装步骤相同
[root@Centos7 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2   #安装依赖
。。。。。。
完毕!
[root@docker-01 ~]# vim /etc/yum.repos.d/centos.repo 
[aaa]
name=aaa
baseurl=file:///mnt
enabled=1
gpgcheck=0
[docker]
name=docker
baseurl=file:///root/docker
enabled=1
gpgcheck=0
#保存退出
[root@docker-01 ~]# ll
总用量 54876
-rw-------. 1 root    root      1264 1月  12 2021 anaconda-ks.cfg
drwxr-xr-x  3 root    root      4096 7月  23 13:56 docker      #上传yum源仓库
[root@docker-01 ~]# yum -y install docker-ce
。。。。。。
完毕!
[root@docker-01 ~]# mkdir -p /etc/docker/
[root@docker-01 ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://w4uieobw.mirror.aliyuncs.com"]
}
#保存退出
[root@docker-01 ~]# systemctl start docker
[root@docker-01 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 五 2021-07-23 14:01:14 CST; 3s ago
     Docs: https://docs.docker.com
 Main PID: 1570 (dockerd)
   Memory: 30.6M
   CGroup: /system.slice/docker.service
           └─1570 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.306578716+08:00" level=info msg="pickfirstBalancer: HandleS...le=grpc
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.306643635+08:00" level=info msg="pickfirstBalancer: HandleS...le=grpc
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.311359751+08:00" level=info msg="Graph migration to content...econds"
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.311698850+08:00" level=info msg="Loading containers: start."
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.435279845+08:00" level=info msg="Default bridge (docker0) i...ddress"
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.492989807+08:00" level=info msg="Loading containers: done."
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.505914133+08:00" level=info msg="Docker daemon" commit=481b...18.09.6
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.505962110+08:00" level=info msg="Daemon has completed initialization"
7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.528081887+08:00" level=info msg="API listen on /var/run/docker.sock"
7月 23 14:01:14 docker-01 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.


2.在docker-01主机上安装etcd、Flannel


******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname docker-01
[root@Centos7 ~]# su
[root@docker-01 ~]# systemctl stop firewalld
[root@docker-01 ~]# setenforce 0
setenforce: SELinux is disabled
[root@docker-01 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
******(2)安装etcd,上传(下载)软件包
#etcd下载地址:https://github.com/coreos/etcd/releases
#wget下载:wget https://github.com/coreos/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz
[root@docker-01 ~]# ll
总用量 20436
-rw-------. 1 root root     1264 1月  12 2021 anaconda-ks.cfg
-rw-r--r--  1 root root 11353259 10月 11 2018 etcd-v3.3.10-linux-amd64.tar.gz
[root@docker-01 ~]# tar xf etcd-v3.3.10-linux-amd64.tar.gz 
[root@docker-01 ~]# cd etcd-v3.3.10-linux-amd64
[root@docker-01 etcd-v3.3.10-linux-amd64]# ll
总用量 34296
drwxr-xr-x 11 6810230 users     4096 10月 11 2018 Documentation
-rwxr-xr-x  1 6810230 users 19237536 10月 11 2018 etcd
-rwxr-xr-x  1 6810230 users 15817472 10月 11 2018 etcdctl
-rw-r--r--  1 6810230 users    38864 10月 11 2018 README-etcdctl.md
-rw-r--r--  1 6810230 users     7262 10月 11 2018 README.md
-rw-r--r--  1 6810230 users     7855 10月 11 2018 READMEv2-etcdctl.md
[root@docker-01 etcd-v3.3.10-linux-amd64]# cp etcd* /usr/bin/   #优化命令执行路径
******(3)启动etcd,启动是放在前台运行的
[root@docker-01 etcd-v3.3.10-linux-amd64]# etcd --name etcd-202 -data-dir /var/lib/etcd --advertise-client-urls http://192.168.100.202:2379,http://127.0.0.1:2379 --listen-client-urls http://192.168.100.202:2379,http://127.0.0.1:2379
。。。。。。会输出信息
#注释:
--name:etc取名
--data-dir:定义数据路径
--advertise-client-urls: 建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信,即服务的url。etcd是可以做集群的,这个是集群之间要连接的url
--listen-client-urls: 监听的用于客户端通信的url,对外提供服务的地址,客户端会连接到这里和 etcd 交互,同样可以监听多个。这个是客户端要连接的url
#复制一个终端
[root@docker-01 ~]# ps -ef|grep etcd   #确认服务已经启动
root       1228   1169  0 19:10 pts/1    00:00:00 etcd --name etcd-202 -data-dir /var/lib/etcd --advertise-client-urls http://192.168.100.202:2379,http://127.0.0.1:2379 --listen-client-urls http://192.168.100.202:2379,http://127.0.0.1:2379
root       1259   1239  0 19:14 pts/0    00:00:00 grep --color=auto etcd
————————————————————————————————————————使用etcdctl工具————————————————————————————————————————
2版本和3版本的命令语法是不一样的,这里使用2版本的
#####etcdctl是一个客户端的连接工具
[root@docker-01 ~]# etcdctl member list      #查看集群的成员
8e9e05c52164694d: name=etcd-202 peerURLs=http://localhost:2380   clientURLs=http://127.0.0.1:2379,http://192.168.100.202:2379 isLeader=true  #isLeader=True,表示202为领导者,peerURLs表示集群的URL
#####使用etcdctl连接etcd数据库,检查etcd的连通性
[root@docker-01 ~]# etcdctl --endpoints http://127.0.0.1:2379 member list
8e9e05c52164694d: name=etcd-202 peerURLs=http://localhost:2380 clientURLs=http://127.0.0.1:2379,http://192.168.100.202:2379 isLeader=true  #出现这个表示连通性正常
[root@docker-01 ~]# etcdctl --endpoints http://192.168.100.202:2379 member list
8e9e05c52164694d: name=etcd-202 peerURLs=http://localhost:2380 clientURLs=http://127.0.0.1:2379,http://192.168.100.202:2379 isLeader=true
#####查看etcdctl版本
[root@docker-01 ~]# etcdctl --version
etcdctl version: 3.3.10
API version: 2   #API表示版本
———————————————————————————————————————————————————————————————————————————————————————————————
******(4)安装Flannel,上传(下载)软件包
#flannel下载地址:https://github.com/coreos/flannel/releases
#wget下载:wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz
[root@docker-01 ~]# ll
总用量 20436
-rw-------. 1 root    root      1264 1月  12 2021 anaconda-ks.cfg
drwxr-xr-x  3 6810230 users      123 10月 11 2018 etcd-v3.3.10-linux-amd64
-rw-r--r--  1 root    root  11353259 10月 11 2018 etcd-v3.3.10-linux-amd64.tar.gz
-rw-r--r--  1 root    root   9565743 1月  29 2019 flannel-v0.11.0-linux-amd64.tar.gz
[root@docker-01 ~]# tar xf flannel-v0.11.0-linux-amd64.tar.gz 
[root@docker-01 ~]# cp flanneld /usr/bin/
[root@docker-01 ~]# cp mk-docker-opts.sh /usr/bin/   #命令和脚本优化命令执行路径
******(5)配置etcd分配的地址池的范围、backend类型等信息
[root@docker-01 ~]# etcdctl set /coreos.com/network/config '{"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0", "Backend": {"Type": "vxlan"}}'
{"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0", "Backend": {"Type": "vxlan"}}
#如果不是本机可以加参数:--endpoints http://IP:2379
#注释
Network:用于指定Flannel地址池
SubnetLen:用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度
SubnetMin:用于指定最小能够分配的ip段
SudbnetMax:用于指定最大能够分配的ip段,在上面的示例中,表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.0.1.0/24到10.0.20.0/24,也就意味着在这个网段中,最多只能有20台宿主机
Backend:用于指定数据包以什么方式转发,默认为udp模式,host-gw模式性能最好,但不能跨宿主机网络
[root@docker-01 ~]# etcdctl get /coreos.com/network/config   #确认配置成功
{"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0", "Backend": {"Type": "vxlan"}}
******(6)启动Fannel,进行docker配置
[root@docker-01 ~]# /usr/bin/flanneld --etcd-endpoints="http://192.168.100.202:2379" --iface=192.168.100.202 --etcd-prefix=/coreos.com/network &  #启动时指定etcd的utl等信息并且放到后台运行
[1] 1106
。。。。。。
[root@docker-01 ~]# ip a     #在启动fannel后,查看网络信息,发现多了一块fannel.1的网卡,并且网段就是配置etcd指定的
。。。。。。
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:77:13:b9:a3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN 
    link/ether d6:08:ca:5c:f8:81 brd ff:ff:ff:ff:ff:ff
    inet 10.0.6.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::d408:caff:fe5c:f881/64 scope link 
       valid_lft forever preferred_lft forever
[root@docker-01 ~]# ps aux | grep fannel   #确认成功启动
root       1600  0.0  0.0 112676   984 pts/1    R+   14:11   0:00 grep --color=auto fannel
#可以使用flannel提供的脚本mk-docker-opts.sh 将subnet.env转写成Docker启动参数,创建好启动参数
[root@docker-01 ~]# mk-docker-opts.sh       #执行脚本
[root@docker-01 ~]# cat /run/flannel/subnet.env   #可以看到都自动写入了参数
FLANNEL_NETWORK=10.0.0.0/16
FLANNEL_SUBNET=10.0.6.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
[root@docker-01 ~]# cat /run/docker_opts.env  #自动写入了配置
DOCKER_OPT_BIP="--bip=10.0.6.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_OPTS=" --bip=10.0.6.1/24 --ip-masq=true --mtu=1450"
[root@docker-01 ~]# vim /usr/lib/systemd/system/docker.service    #修改docker的启动项
  1 [Unit]
  2 Description=Docker Application Container Engine
  3 Documentation=https://docs.docker.com
  4 BindsTo=containerd.service
  5 After=network-online.target firewalld.service containerd.service
  6 Wants=network-online.target
  7 Requires=docker.socket
  8 
  9 [Service]
 10 Type=notify
 11 # the default is not to use systemd for cgroups because the delegate issues still
 12 # exists and systemd currently does not support the cgroup feature set required
 13 # for containers run by docker
 14 EnvironmentFile=/run/docker_opts.env     #添加14行修改15行,使docker引用刚才上面的文件
 15 ExecStart=/usr/bin/dockerd  $DOCKER_OPTS  -H fd:// --containerd=/run/containerd/containerd.sock
 16 ExecReload=/bin/kill -s HUP $MAINPID
 17 TimeoutSec=0
 18 RestartSec=2
 19 Restart=always
 。。。。。。
 #保存退出
 [root@docker-01 ~]# systemctl daemon-reload   #重载系统服务
[root@docker-01 ~]# systemctl restart docker   #重启docker
[root@docker-01 ~]# ip a
。。。。。。
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:77:13:b9:a3 brd ff:ff:ff:ff:ff:ff
    inet 10.0.6.1/24 brd 10.0.6.255 scope global docker0      #再次查看网卡,发现docker0网卡已经变成了之前etcd配置的网段,之后容器的网络地址都是有docker0去分配的
       valid_lft forever preferred_lft forever
5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN 
    link/ether d6:08:ca:5c:f8:81 brd ff:ff:ff:ff:ff:ff
    inet 10.0.6.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::d408:caff:fe5c:f881/64 scope link 
       valid_lft forever preferred_lft forever
[root@docker-01 ~]# etcdctl ls /coreos.com/network/
/coreos.com/network/config
/coreos.com/network/subnets      
————————————————————————————————————————————注释————————————————————————————————————————————
Flannel启动过程解析:
1.  从etcd中获取network的配置信息
2.  划分subnet,并在etcd中进行注册
3.  将子网信息记录到/run/flannel/subnet.env中
4.  Flannel必须先于Docker启动
————————————————————————————————————————————————————————————————————————————————————————————
******(7)验证Fannel网络
[root@docker-01 ~]# etcdctl ls /coreos.com/network/subnets
/coreos.com/network/subnets/10.0.6.0-24
[root@docker-01 ~]# etcdctl get  /coreos.com/network/subnets/10.0.6.0-24
{"PublicIP":"192.168.100.202","BackendType":"vxlan","BackendData":{"VtepMAC":"d6:08:ca:5c:f8:81"}}
[root@docker-01 ~]# cat /run/flannel/subnet.env    #在Fannel运行后,会产生一个环境变量文件,包含了当前主机要使用flannel网络的相关参数
FLANNEL_NETWORK=10.0.0.0/16
FLANNEL_SUBNET=10.0.6.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

3.在docker-02主机上安装Flannel

******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname docker-02
[root@Centos7 ~]# su
[root@docker-02 ~]# systemctl stop firewalld
[root@docker-02 ~]# setenforce 0
setenforce: SELinux is disabled
[root@docker-02 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
******(2)上传flannel软件包,安装flannel
[root@docker-02 ~]# /usr/bin/flanneld --etcd-endpoints="http://192.168.100.202:2379" --iface=192.168.100.203 --etcd-prefix=/coreos.com/network &
[1] 2936
。。。。。。
[root@docker-02 ~]# ps aux | grep flannel
root       2936  0.2  2.0 300508 20472 pts/0    Sl   14:36   0:00 /usr/bin/flanneld --etcd-endpoints=http://192.168.100.202:2379 --iface=192.168.100.203 --etcd-prefix=/coreos.com/network
root       2965  0.0  0.0 112676   980 pts/0    S+   14:37   0:00 grep --color=auto flannel
[root@docker-02 ~]# mk-docker-opts.sh 
[root@docker-02 ~]# cat /run/docker_opts.env 
DOCKER_OPT_BIP="--bip=10.0.12.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_OPTS=" --bip=10.0.12.1/24 --ip-masq=true --mtu=1450"
[root@docker-02 ~]# vim /usr/lib/systemd/system/docker.service 
。。。。。。   #同样修改docker启动文件
 13 # for containers run by docker
 14 EnvironmentFile=/run/docker_opts.env
 15 ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd:// --containerd=/run/containerd/containerd.sock
 16 ExecReload=/bin/kill -s HUP $MAINPID
。。。。。。
#保存退出
[root@docker-02 ~]# systemctl daemon-reload
[root@docker-02 ~]# systemctl restart docker
[root@docker-02 ~]# ip a
。。。。。。
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:2d:ef:10:10 brd ff:ff:ff:ff:ff:ff
    inet 10.0.12.1/24 brd 10.0.12.255 scope global docker0   #docker0网卡ip成功修改
       valid_lft forever preferred_lft forever 
5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN 
    link/ether 62:a3:d4:19:36:9b brd ff:ff:ff:ff:ff:ff
    inet 10.0.12.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::60a3:d4ff:fe19:369b/64 scope link 
       valid_lft forever preferred_lft forever


4.在docker-01主机上查看docker-02主机是否加入


[root@docker-01 ~]# etcdctl ls /coreos.com/network/subnets  #可以看到subnets目录多了一个目录
/coreos.com/network/subnets/10.0.6.0-24
/coreos.com/network/subnets/10.0.12.0-24
[root@docker-01 ~]# etcdctl get /coreos.com/network/subnets/10.0.12.0-24  #查看发现是203也就是docker-02主机
{"PublicIP":"192.168.100.203","BackendType":"vxlan","BackendData":{"VtepMAC":"62:a3:d4:19:36:9b"}}
[root@docker-01 ~]# etcdctl get /coreos.com/network/subnets/10.0.6.0-24   #而另一个就是自己的
{"PublicIP":"192.168.100.202","BackendType":"vxlan","BackendData":{"VtepMAC":"d6:08:ca:5c:f8:81"}}

5.验证不同主机间容器互通

******(1)在docker-01主机上创建容器
[root@docker-01 ~]# docker load -i busybox.tar    #需要上传一个可以使用ip a的镜像
5b8c72934dfc: Loading layer [==================================================>]  1.455MB/1.455MB
Loaded image: busybox:latest
[root@docker-01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              69593048aa3a        6 weeks ago         1.24MB
[root@docker-01 ~]# docker run -it busybox:latest  #开启容器
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:06:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.6.2/24 brd 10.0.6.255 scope global eth0  #看到容器ip为6.2
       valid_lft forever preferred_lft forever
******(2)在docker-02主机上创建容器
[root@docker-02 ~]# docker load -i busybox.tar   #同样先导入镜像
5b8c72934dfc: Loading layer [==================================================>]  1.455MB/1.455MB
Loaded image: busybox:latest
[root@docker-02 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              69593048aa3a        6 weeks ago         1.24MB
[root@docker-02 ~]# docker run -it busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:0c:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.12.2/24 brd 10.0.12.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 10.0.6.2    #pingdocker-01主机的容器,发现成功通信
PING 10.0.6.2 (10.0.6.2): 56 data bytes
64 bytes from 10.0.6.2: seq=0 ttl=62 time=0.509 ms
64 bytes from 10.0.6.2: seq=1 ttl=62 time=0.360 ms
^C
--- 10.0.6.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.360/0.434/0.509 ms


至此,配置Flannel网络完成!!!


七、Flannel的backend其他类型


(1)host-gw


  • host-gw bakcend是flannel的另一个backend。
  • 与vxlan不同,host-gw不会封装数据包,而是在主机的路由表中创建到其他主机的subnet的路由条目,从而实现容器网络跨主机通信。
  • 需要说明的是,host-gw不能跨宿主机网络通信,或者说跨宿主机网络通信需要物理路由支持。性能最好


(2)calico


calico网络:


  • bgp转发:相当于host-gw转发,不能跨网段进行转发
  • ipip转发:相当于vxlan转发模式


calico优势:


  • 同时开启了两种转发模式,但是flannel只能开启其中一种转发模式
  • 自动判断,如果宿主机跨网段,就是用ipip的方式转发,如果没有跨网段,就使用bgp方式转发
  • 有流量策略管理,控制流量
目录
相关文章
|
1月前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
172 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
1月前
|
安全 Docker 容器
docker的默认网络模式有哪些
Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
47 6
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
151 7
|
2月前
|
安全 网络安全 数据安全/隐私保护
利用Docker的网络安全功能来保护容器化应用
通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
56 5
|
3月前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
62 5
|
3月前
|
调度 Docker 容器
docker swarm创建覆盖网络
【10月更文挑战第16天】
62 5
|
3月前
|
负载均衡 网络协议 关系型数据库
docker swarm 使用网络启动服务
【10月更文挑战第15天】
48 4
|
2月前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
|
2月前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
|
2月前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。