内容简介:在前面我们了解过,命名空间一共有六种: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 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段,那么两个网桥之间的通信也十分简单,我们只需要两个虚拟的网卡将两个网桥进行连接即可。
4.3)两个网桥–不同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之后,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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 虚拟DOM和Diff算法 - 入门级
- VMProtect 3.3.1虚拟机&代码混淆机制入门
- 区块链入门系列 | 什么是虚拟机 Virtual Machine ?
- 入门解读:小白也能看懂的容器和虚拟机介绍
- VMware虚拟机嵌套部署KVM虚拟机指南
- 虚拟化生态系统及实现从虚拟化走向云端
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Software Engineering for Internet Applications
Eve Andersson、Philip Greenspun、Andrew Grumet / The MIT Press / 2006-03-06 / USD 35.00
After completing this self-contained course on server-based Internet applications software, students who start with only the knowledge of how to write and debug a computer program will have learned ho......一起来看看 《Software Engineering for Internet Applications》 这本书的介绍吧!