docker入门之虚拟网络

栏目: 编程工具 · 发布时间: 6年前

内容简介:在前面我们了解过,命名空间一共有六种:1.2.

docker 入门之虚拟网络概述

一、什么是虚拟化网络

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入门之虚拟网络
单个网桥

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

为了验证以上理论,我们可以使用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段

docker入门之虚拟网络
两个网桥–同ip段

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

4.3)两个网桥–不同IP段

docker入门之虚拟网络
两个网桥–不同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工作图

docker入门之虚拟网络
NAT

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

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

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

三、容器网络-桥接模式

如果使用NAT模式,在某种情况下,会显得效率低,因为流量需经过NAT的转换才可以被发送。

桥接模式:即将虚拟网卡直接桥接到物理网卡中(物理网卡此时被作为交换机使用),在桥接模式下,物理网卡可以处理非本网卡的流量。

docker入门之虚拟网络
桥接模式

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

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

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Hacker's Delight

Hacker's Delight

Henry S. Warren Jr. / Addison-Wesley / 2002-7-27 / USD 59.99

A collection useful programming advice the author has collected over the years; small algorithms that make the programmer's task easier. * At long last, proven short-cuts to mastering difficult aspec......一起来看看 《Hacker's Delight》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具