设为首页 收藏本站
查看: 1291|回复: 0

[经验分享] docker入门之虚拟网络概述

[复制链接]

尚未签到

发表于 2019-2-20 08:39:33 | 显示全部楼层 |阅读模式
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  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
        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)单个网桥
DSC0000.png 单个网桥因为在虚拟网络中,网卡总是以对的方式出现,所以但我们创建了一个容器之后,如果该容器使用了网桥,那么这时候服务器上会多出一个虚拟的网卡,而这个网卡被绑定在网桥上,另个网卡在容器中。
为了验证以上理论,我们可以使用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:  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:  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:  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:  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:  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段
DSC0001.png 两个网桥--同ip段当两个网桥连接的容器处于同一个IP段,那么两个网桥之间的通信也十分简单,我们只需要两个虚拟的网卡将两个网桥进行连接即可。
4.3)两个网桥--不同IP段
DSC0002.png 两个网桥--不同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工作图


DSC0003.png NAT安装了docker之后,docker会在内核开启路由功能
[root@node1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@node1 ~]#
在NAT网络中,docker0作为一个三层设备,既充当了一个交换机又充当了S1和S2的网关,当S1访问外网服务时,流量会送Kernel接收并处理,这中间kernel会查找路由表,确定如何转发。
三、容器网络-桥接模式
如果使用NAT模式,在某种情况下,会显得效率低,因为流量需经过NAT的转换才可以被发送。
桥接模式:即将虚拟网卡直接桥接到物理网卡中(物理网卡此时被作为交换机使用),在桥接模式下,物理网卡可以处理非本网卡的流量。


DSC0004.png 桥接模式使用桥接模式后,物理网卡会虚拟出一个软网卡,专门处理原本到达物理网卡的流量。
在上图中,如果物理网卡收到一个MAC地址为S1的报文,其会将该报文转发给S1容器,收到MAC地址为S2的报文即转发给S2,如果收到一个MAC地址为本地物理网卡的MAC报文,那么将会交给软网卡处理。此时的物理网卡就是一个交换机。
但是使用桥接模式也有一些弊端,比如广播风暴,所以我们以后会介绍隧道协议overlay network




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-674641-1-1.html 上篇帖子: Rancher for docker 下篇帖子: docker 镜像仓库Harbor https访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表