docker入门之虚拟网络概述

docker 入门之虚拟网络概述

一、什么是虚拟化网络1)命名空间2)设备和命名空间3)虚拟网络设备4)虚拟网桥4.1)单个网桥4.2)两个网桥--同IP段4.3)两个网桥--不同IP段二、容器网络-NAT模式三、容器网络-桥接模式

一、什么是虚拟化网络

1)命名空间

在前面我们了解过,命名空间一共有六种:
1.UTS:主机名和域名
2.User:用户和用户组
3.Mount:文件系统
4.IPC:信号量、消息队列和共享内存
5.PID:进程编号
6.Network:网络设备、网络栈、端口等

今天我们要了解的是Network

2)设备和命名空间

一个设备只能属于一个命名空间,如果将一个网卡分配给单独的命名空间,那么这个网卡对于其他命名空间来说是不可见的。

3)虚拟网络设备

Linux支持的二层设备三层设备的虚拟化,其中网卡属于二层设备。

虚拟网卡:在Linux中,虚拟网卡总是成出现

虚拟网桥设备:用一个软件模拟一个交换机

4)虚拟网桥

在服务器安装了docker之后,docker应用会创建一个名为docker0的网桥,地址为172.17.0.1

[root@node1 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:ceff:fe71:2880  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ce:71:28:80  txqueuelen 0  (Ethernet)
        RX packets 15  bytes 1164 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31  bytes 3052 (2.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

4.1)单个网桥

单个网桥单个网桥

因为在虚拟网络中,网卡总是以的方式出现,所以但我们创建了一个容器之后,如果该容器使用了网桥,那么这时候服务器上会多出一个虚拟的网卡,而这个网卡被绑定在网桥上,另个网卡在容器中。

为了验证以上理论,我们可以使用docker container ps 查看容器个数,然后再使用ifconfig 查看虚拟网卡个数。其中以vet开头的网卡为docker的虚拟网卡。

[root@node1 ~]# docker container ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d1745c9b3c8e        web1:v2             "/bin/httpd -f -h /d…"   7 days ago          Up 7 days                               http_1
2e45357a5285        busybox             "sh"                     7 days ago          Up 7 days                               b1
[root@node1 ~]# ip add
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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:8b:ab:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.75/24 brd 192.168.100.255 scope global dynamic ens160
       valid_lft 52420sec preferred_lft 52420sec
    inet6 fe80::3781:c50a:ba27:fb89/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ce:71:28:80 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
    inet6 fe80::42:ceff:fe71:2880/64 scope link 
       valid_lft forever preferred_lft forever
13: veth3487b78@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether 8e:8d:c8:b2:44:d0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::8c8d:c8ff:feb2:44d0/64 scope link 
       valid_lft forever preferred_lft forever
17: vethc9f32ca@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether 2a:24:5c:84:e5:c3 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::2824:5cff:fe84:e5c3/64 scope link 
       valid_lft forever preferred_lft forever
[root@node1 ~]

可以看出现在服务器上有两个容器,相对应的,服务器多了两块虚拟的网卡,那么怎么去验证这两个虚拟网卡是否真的如我们所说的一样,是属于docker0网桥的呢?我们可以使用brctl去查看

[root@node1 ~]# brctl show
bridge name    bridge id       STP enabled interfaces
docker0        8000.0242ce712880   no      veth3487b78
                                            vethc9f32ca

通过上下对比,我们应该能验证之前的结论了吧!

单个网桥的通信:在上图中,不难发现,假设S1和S2需要通信,可以直接通过网桥doker0进行通信。

4.2)两个网桥--同IP段

两个网桥--同ip段两个网桥--同ip段

当两个网桥连接的容器处于同一个IP段,那么两个网桥之间的通信也十分简单,我们只需要两个虚拟的网卡将两个网桥进行连接即可。

4.3)两个网桥--不同IP段

两个网桥--不同IP段两个网桥--不同IP段

当两个docker网桥所连接的容器处于不同的IP地址段时,S1和S3之间的通信就显得没那么容易了…
S1和S3所属的网段不同,意味着两个容器必须要通过网关才能寻找到对方,即使他们在一台服务器中!如果是简单的通信,那么我们可以开启Linux Kernel中的转发功能,实现两个网段的通信。在上图中,我们在两个docker网桥中间多加了一个容器,该容器可以只用来处理转发流量或者实现NAT等功能,这样也可以实现同一服务器上不同的网桥之间通信。

二、容器网络-NAT模式

在docker中,默认的网络模式为NAT模式,在安装了docker之后,可以发现iptables的NAT链多了几条规则。

[root@node1 ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 404K packets, 36M bytes)
 pkts bytes target     prot opt in     out     source               destination         
   80  5420 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 82399 packets, 8968K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 12551 packets, 755K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 12551 packets, 755K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
[root@node1 ~]# 

我们可以查看docker的虚拟网络列表:

[root@node1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1013a713a33f        bridge              bridge              local
f40346977195        host                host                local
b911a3cde6ad        none                null                local
[root@node1 ~]

docker中NAT工作图

NATNAT

安装了docker之后,docker会在内核开启路由功能

[root@node1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@node1 ~]

在NAT网络中,docker0作为一个三层设备,既充当了一个交换机又充当了S1和S2的网关,当S1访问外网服务时,流量会送Kernel接收并处理,这中间kernel会查找路由表,确定如何转发。

三、容器网络-桥接模式

如果使用NAT模式,在某种情况下,会显得效率低,因为流量需经过NAT的转换才可以被发送。
桥接模式:即将虚拟网卡直接桥接到物理网卡中(物理网卡此时被作为交换机使用),在桥接模式下,物理网卡可以处理非本网卡的流量。

桥接模式桥接模式

使用桥接模式后,物理网卡会虚拟出一个软网卡,专门处理原本到达物理网卡的流量。

在上图中,如果物理网卡收到一个MAC地址为S1的报文,其会将该报文转发给S1容器,收到MAC地址为S2的报文即转发给S2,如果收到一个MAC地址为本地物理网卡的MAC报文,那么将会交给软网卡处理。此时的物理网卡就是一个交换机。

但是使用桥接模式也有一些弊端,比如广播风暴,所以我们以后会介绍隧道协议overlay network


猜你喜欢

转载自blog.51cto.com/xiaowangzai/2334297
今日推荐