Docker网络

一、Docker网络简介

(1)查看Docker网络

******查看Docker的网络模式
[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
edca3506ab93        bridge              bridge              local        
13dcc19e20b0        host                host                local
80abc22e3804        none                null                local

#Docker的三种模式
bridge:桥接模式,此模式下容器可以通过Docker0网卡和外网通信,也可以和宿主机的其他容器进行通信,但是不能和其他主机的容器进行通信,因为可以会造成ip地址冲突,此模式是docker的默认网络模式
host:仅主机模式,此模式下容器会跟宿主机共享网络地址
none:这个模式没有任何网络,此模式下容器不可以跟其他任何主机或容器进行通信,只有一个lo网卡,地址是127的回环地址
  • 每个容器都有ip,而这个ip是由Docker生成的Docker0网卡分配的,默认分配的网段就是172.17.0.0/16的网段,这个网段是可以自定义的,并且只有容器是bridge模式时,会自动分配

容器ip:
在这里插入图片描述

Docker0 ip:

在这里插入图片描述

可以看到ip都是同网段的

  • 使用 Docker inspect 查看容器的详细信息,可以看到网关是指向Docker0网卡的
    在这里插入图片描述

  • 在查看宿主机ip时,在Docker下面还有一块网卡,那块网卡就是容器的网卡
    在这里插入图片描述

在这里插入图片描述

这里的网卡if12表示是宿主机的序列号为12的网卡,并且宿主机的12网卡后面是if11,可以看到容器的网卡序列号为11,都是互相对应的,而宿主机的veth网卡其实相当于一个虚拟交换机,用于容器和宿主机之间互相通信

二、Docker的bridge网络

bridge网络架构示意图:

宿主机的veth网卡在每一个容器创建后都会存在,作用就是相当于一个虚拟交换机,从下面的图可以看出每个veth网卡都连接这相应的容器和宿主机

在这里插入图片描述

(1)创建使用bridge网络的容器

******查看bridge网络模式的信息
[root@docker ~]# docker network inspect bridge



******查看镜像默认映射的端口
[root@docker ~]# docker inspect nginx 
。。。。。。
            "ExposedPorts": {
                "80/tcp": {}      #这里就是镜像默认的端口
            },
。。。。。。



******查看容器的端口号
[root@docker ~]# docker run -d --name wen --net bridge nginx:latest     #创建一个不带-p或者-P选项的容器
dac2bcfad659ecaf0eff97401f15ad0bbd66b4ae21493ca39755f06334818653  
[root@docker ~]# docker run -d -P --name web2 nginx   #创建一个带-p或-P选项的容器
de7000efdc4a5ccb37c084faac2393542ec68edde723663d122468c640c4d178
[root@docker ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
de7000efdc4a        nginx               "/docker-entrypoint.…"   2 seconds ago       Up 1 second         0.0.0.0:32768->80/tcp   web2
dac2bcfad659        nginx:latest        "/docker-entrypoint.…"   9 minutes ago       Up 9 minutes        80/tcp                  wen
[root@docker ~]# docker port de7000efdc4a    #后面写容器的id,只能查看使用了-p或者-P选项启动的容器端口,容器启动如果没有指定端口映射,那么这个容器的端口就是它使用镜像的默认端口
80/tcp -> 0.0.0.0:32768
[root@docker ~]# docker port dac2bcfad659    #查看不带-P选项的容器是不会输出任何信息的

(2)修改容器的默认网段

#修改容器的默认网段只需要修改daemon.json文件即可
[root@docker ~]# vim /etc/docker/daemon.json    #修改文件
{
  "registry-mirrors": ["https://w4uieobw.mirror.aliyuncs.com"],  #这个是指定Docker Hub镜像仓库的URL
  "log-driver": "journald","bip":"192.168.200.1/24"            #这个就是设置Docker容器分配的网段,不能与宿主机同一网段
}
#保存退出
[root@docker ~]# systemctl restart docker   #重启docker,重启docker时会自动停止所有容器
[root@docker ~]# ip a | grep docker0      #查看docker0网卡网段,成功变成200网段
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    inet 192.168.200.1/24 brd 192.168.200.255 scope global docker0
[root@docker ~]# docker ps -a    #查看容器,发现自动停止了
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
c176da0ed7d2        tomcat:latest       "/bin/bash"         11 minutes ago      Exited (0) About a minute ago                       tomcat
[root@docker ~]# docker rm c176da0ed7d2   #先删除之前创建的容器
c176da0ed7d2
[root@docker ~]# docker run -it --name tomcat  tomcat:latest /bin/bash  #再次开启
root@65f3c83d9657:/usr/local/tomcat# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:c8:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.200.2/24 brd 192.168.200.255 scope global eth0   #查看ip发现成功修改
       valid_lft forever preferred_lft forever

三、none网络

#使用none网络的容器除了lo网卡,没有其他任何网卡,完全与外界隔离,适用于不需要访问外部服务也不运行外部服务访问自己的应用场景
******查看none网络的信息
[root@docker ~]# docker network inspect none


******创建使用none网络的容器
[root@docker ~]# docker run -it --name none --net none busybox:latest 
/ # ip a                       #查看网络发现只有lo一个网卡,只有一个回环地址,所以也无法和外部服务通信
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
/ # 

四、host网络

  • 使用host网络的主机,和宿主机共享网络地址,使用host网络模式可以使容器获得最好的数据转发性能
  • 也正因为和宿主机共享网络地址,所以在使用多个host网络的容器时,多个容器会共享宿主机的网络地址,这样就需要容器上运行服务的端口不能相同,如果有端口相同的服务就需要手动去修改端口号
  • 使用host模式一般只装一台容器,因为共享了宿主机的网络地址
******查看host网络的信息
[root@docker ~]# docker network inspect host


******创建使用host网络的容器
[root@docker ~]# docker run -it --name host --net host 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:30:54:8c brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.202/24 brd 192.168.100.255 scope global ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::34f4:cad:16ae:5b4d/64 scope link 
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:30:54:96 brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.146/24 brd 192.168.8.255 scope global dynamic ens34
       valid_lft 84610sec preferred_lft 84610sec
    inet6 fe80::e6e9:552d:5efd:87ac/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether 02:42:a8:3c:15:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.1/24 brd 192.168.200.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:a8ff:fe3c:15ee/64 scope link 
       valid_lft forever preferred_lft forever
6: veth1faa93d@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 
    link/ether 5e:52:59:44:18:ad brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5c52:59ff:fe44:18ad/64 scope link 
       valid_lft forever preferred_lft forever
8: vethd1ca06a@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 
    link/ether 4e:9e:93:a0:11:c4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::4c9e:93ff:fea0:11c4/64 scope link 
       valid_lft forever preferred_lft forever
#复制一个终端查看宿主机的网络信息
[root@docker ~]# ip a     #可以看到使用host网络的容器,网络信息和宿主机相同
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:30:54:8c brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.202/24 brd 192.168.100.255 scope global ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::34f4:cad:16ae:5b4d/64 scope link 
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:30:54:96 brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.146/24 brd 192.168.8.255 scope global dynamic ens34
       valid_lft 84570sec preferred_lft 84570sec
    inet6 fe80::e6e9:552d:5efd:87ac/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:a8:3c:15:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.1/24 brd 192.168.200.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:a8ff:fe3c:15ee/64 scope link 
       valid_lft forever preferred_lft forever
6: veth1faa93d@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether 5e:52:59:44:18:ad brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::5c52:59ff:fe44:18ad/64 scope link 
       valid_lft forever preferred_lft forever
8: vethd1ca06a@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether 4e:9e:93:a0:11:c4 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::4c9e:93ff:fea0:11c4/64 scope link 
       valid_lft forever preferred_lft forever

五、自定义网络

  • Docker除了提供三种默认的网络模式之外,也允许用户针对一些特殊的应用场景去创建一些自定义的网络模式

  • 使用自定义网络的容器会被单独隔离出来,并且容器之间可以互相通信,而没有使用相同自定义网络的容器是不能直接访问他们的,可以通过添加相同的自定义网络进行通信

  • 一个容器可以属于多个网络,并且同一个自定义网络下的容器可以通过各自的容器名访问到对方,这是因为docker内嵌了一个dns的功能

  • Docker提供的三种自定义网络驱动:

bridge

overlay

macvlan

  • 自定义网络架构图

从下面的图可以看出,想要和不同网络的容器通信,只需要加一个网络即可
在这里插入图片描述

(1)自定义bridge网络

******(1)创建自定义网络
[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
16af5ad6b488        bridge              bridge              local
13dcc19e20b0        host                host                local
80abc22e3804        none                null                local
[root@docker ~]# docker network create --driver bridge my   #--driver用来定义使用的网络驱动
f2309a5c3d2093e12a9fd2a294624e5cde022e51350d4ef3e9217a23df05832c
[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
16af5ad6b488        bridge              bridge              local
13dcc19e20b0        host                host                local
f2309a5c3d20        my                  bridge              local
80abc22e3804        none                null                local
[root@docker ~]# ip a   #在删除所有容器后,可以看到宿主机也加了一块网卡
。。。。。。
9: br-f2309a5c3d20: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:c1:cb:32:45 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global br-f2309a5c3d20
       valid_lft forever preferred_lft forever
[root@docker ~]# docker network create --driver bridge my2  #再创建一个网络模式
2e29454a0894ade347dac9f3997e8a3ad0fd644f5abe0408276a102775054a7c
[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
16af5ad6b488        bridge              bridge              local
13dcc19e20b0        host                host                local
f2309a5c3d20        my                  bridge              local
2e29454a0894        my2                 bridge              local
80abc22e3804        none                null                local
[root@docker ~]# ip a     #可以看到又加了一块网卡
。。。。。。
10: br-2e29454a0894: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:ad:6e:14:0d brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-2e29454a0894
       valid_lft forever preferred_lft forever
       
******(2)使用自定义网络创建容器
#复制两个终端分别开启两个容器
[root@docker ~]# docker run -it --net my --name web httpd:latest /bin/bash
root@05c67e2b1274:/usr/local/apache2# 

[root@docker ~]# docker run -it --net my --name test busybox:latest  #创建使用my自定义网络的容器
/ # 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
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0    #因为my使用的是bridge网络驱动,所以会分配ip
       valid_lft forever preferred_lft forever
       
#切换终端,查看容器运行状态
[root@docker ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
8e74a880ef0d        busybox:latest      "sh"                About a minute ago   Up About a minute                                   test
05c67e2b1274        httpd:latest        "/bin/bash"         7 seconds ago       Up 6 seconds        80/tcp              web

(2)通过指定子网和网关的方式创建自定义网络

******(1)创建一个新的自定义网络my3
[root@docker ~]# docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my3 
966861dba60a47eb7abb1d6a02e147c15af8af3c9b0b41840c80b1ee9a50c3c3
[root@docker ~]# docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
16af5ad6b488        bridge              bridge              local
13dcc19e20b0        host                host                local
f2309a5c3d20        my                  bridge              local
2e29454a0894        my2                 bridge              local
966861dba60a        my3                 bridge              local
80abc22e3804        none                null                local
[root@docker ~]# docker network inspect my3
。。。。。。
            "Config": [
                {
                    "Subnet": "172.22.16.0/24",
                    "Gateway": "172.22.16.1"
                }
            ]
        },
。。。。。。


******(2)创建一个新容器使用自定义网络my3
[root@docker ~]# docker run -it --net my3 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
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff
    inet 172.22.16.2/24 brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever
       
#切换另一个终端查看容器的详细信息  
[root@docker ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
6a4487b801c4        busybox:latest      "sh"                About a minute ago   Up About a minute                                   hungry_cerf
8e74a880ef0d        busybox:latest      "sh"                9 minutes ago        Exited (0) About a minute ago                       test
05c67e2b1274        httpd:latest        "/bin/bash"         11 minutes ago       Exited (0) 10 minutes ago                           web
[root@docker ~]# docker inspect 6a4487b801c4 
。。。。。。
   				   "Gateway": "172.22.16.1",    #可以看到网管和ip都和刚才设定的自定义网络的配置相同
                    "IPAddress": "172.22.16.2",
。。。。。。         

******(3)创建一个容器并且指定其ip
[root@docker ~]# docker rm $(docker ps -aq)
6a4487b801c4
8e74a880ef0d
05c67e2b1274
[root@docker ~]# docker run -it --net my3 --name test --ip=172.22.16.33 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
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:16:10:21 brd ff:ff:ff:ff:ff:ff
    inet 172.22.16.33/24 brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever

#切换回另一个终端
[root@docker ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
084db6cf7491        busybox:latest      "sh"                34 seconds ago      Up 33 seconds                           test
[root@docker ~]# docker inspect 084db6cf7491
。。。。。。
                    "Gateway": "172.22.16.1",
                    "IPAddress": "172.22.16.33",
。。。。。。                    

(3)使用自定义网络和其他网络进行通信

******(1)清楚所有容器
[root@docker ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
084db6cf7491        busybox:latest      "sh"                4 minutes ago       Up 4 minutes                            test
[root@docker ~]# docker stop $(docker ps -aq)
084db6cf7491
[root@docker ~]# docker rm $(docker ps -aq)
084db6cf7491
[root@docker ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

******(2)创建三个容器,分别是使用默认网络bridge的容器,使用my自定义网络的容器,还有使用my3自定义网络的容器,最终的目的是实现my自定义网络可以和另外两个容器进行通信,而其他两个容器互相不能通信
#创建使用默认网络bridge的容器
[root@docker ~]# docker run -it --name bridge 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
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c0:a8:c8:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.2/24 brd 192.168.200.255 scope global eth0
       valid_lft forever preferred_lft forever
       
#创建使用my自定义网络的容器
[root@docker ~]# docker run -it --net my --name my 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
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

#创建使用my3自定义网络的容器
[root@docker ~]# docker run -it --net my3 --name my3 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
28: eth0@if29: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff
    inet 172.22.16.2/24 brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever
       
******(3)想要让my自定义网络的容器可以与默认网络容器以及my3网络容器通信的话,只需要把my网络容器添加另外两个容器的网卡即可
#先使用my网络容器去ping另外两个容器,发现都无法ping通
/ # ping 192.168.200.2             
PING 192.168.200.2 (192.168.200.2): 56 data bytes
^C
--- 192.168.200.2 ping statistics ---
23 packets transmitted, 0 packets received, 100% packet loss
/ # ping 172.22.16.2
PING 172.22.16.2 (172.22.16.2): 56 data bytes
^C
--- 172.22.16.2 ping statistics ---
8 packets transmitted, 0 packets received, 100% packet loss

#添加网卡
[root@docker ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
08d19eaa9a88        busybox:latest      "sh"                4 minutes ago       Up 4 minutes                            my3
0978d9da8119        busybox:latest      "sh"                5 minutes ago       Up 5 minutes                            my
35718e6eff5f        busybox:latest      "sh"                5 minutes ago       Up 5 minutes                            bridge
[root@docker ~]# docker network connect my3 0978d9da8119   #把my3网卡添加到my容器,后面写容器id
[root@docker ~]# docker network connect bridge 0978d9da8119  #把默认网卡添加到my容器

#重新在my网络的容器中进行ping,发现可以正常通信
/ # ping 192.168.200.2
PING 192.168.200.2 (192.168.200.2): 56 data bytes
64 bytes from 192.168.200.2: seq=0 ttl=64 time=0.132 ms
64 bytes from 192.168.200.2: seq=1 ttl=64 time=0.078 ms
^C
--- 192.168.200.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.078/0.105/0.132 ms
/ # ping 172.22.16.2
PING 172.22.16.2 (172.22.16.2): 56 data bytes
64 bytes from 172.22.16.2: seq=0 ttl=64 time=0.134 ms
64 bytes from 172.22.16.2: seq=1 ttl=64 time=0.044 ms
^C
--- 172.22.16.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.044/0.089/0.134 ms


******(4)如果不想让my网络容器可以与my3网络容器进行通信的话,可以把my网络容器的my3网卡删除
[root@docker ~]# docker network disconnect my3 0978d9da8119

#切换到my网络容器进行ping,发现无法通信了,但是bridge网络容器可以正常通信
/ # ping 172.22.16.2
PING 172.22.16.2 (172.22.16.2): 56 data bytes
^C
--- 172.22.16.2 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
/ # ping 192.168.200.2
PING 192.168.200.2 (192.168.200.2): 56 data bytes
64 bytes from 192.168.200.2: seq=0 ttl=64 time=0.114 ms
64 bytes from 192.168.200.2: seq=1 ttl=64 time=0.047 ms
64 bytes from 192.168.200.2: seq=2 ttl=64 time=0.056 ms
^C
--- 192.168.200.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.047/0.072/0.114 ms

六、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头)
  • 网络转发结构图:

在这里插入图片描述

  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.4docker-01192.168.100.202 桥接网卡etcd、flannel、docker
Centos7.4docker-02192.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 112 2021 anaconda-ks.cfg
drwxr-xr-x  3 root    root      4096 723 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

723 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
723 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.311359751+08:00" level=info msg="Graph migration to content...econds"
723 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.311698850+08:00" level=info msg="Loading containers: start."
723 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.435279845+08:00" level=info msg="Default bridge (docker0) i...ddress"
723 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.492989807+08:00" level=info msg="Loading containers: done."
723 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
723 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.505962110+08:00" level=info msg="Daemon has completed initialization"
723 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"
723 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 112 2021 anaconda-ks.cfg
-rw-r--r--  1 root root 11353259 1011 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 1011 2018 Documentation
-rwxr-xr-x  1 6810230 users 19237536 1011 2018 etcd
-rwxr-xr-x  1 6810230 users 15817472 1011 2018 etcdctl
-rw-r--r--  1 6810230 users    38864 1011 2018 README-etcdctl.md
-rw-r--r--  1 6810230 users     7262 1011 2018 README.md
-rw-r--r--  1 6810230 users     7855 1011 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 112 2021 anaconda-ks.cfg
drwxr-xr-x  3 6810230 users      123 1011 2018 etcd-v3.3.10-linux-amd64
-rw-r--r--  1 root    root  11353259 1011 2018 etcd-v3.3.10-linux-amd64.tar.gz
-rw-r--r--  1 root    root   9565743 129 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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值