Docker网络原理分析_第1页
Docker网络原理分析_第2页
Docker网络原理分析_第3页
Docker网络原理分析_第4页
Docker网络原理分析_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Docker网络原理分析Docker使用linux的bridge和veth虚拟网络设备,以及network namespace对网络进行虚拟化。Bridge看其名字是网桥,但实际上它的功能和交换机(switch)相似。Veth则是一对网络接口,像是用一条网线连接起来的两块网卡。阅读这篇文章前,应该先了解linux的bridge和veth的原理和用法,熟悉brctl, ip, iptables三个重要命令的使用方法。一、Docker 经典网络架构:从上图可知,每个docker容器通过一对veth连入bridge br0。Veth的一端在docker netns中,通常改名为eth0;另一端在de

2、fault或global netns中,通常命名为vethXXXXXXXX。上图中将其命名为vnic11和vnic21。Bridge br0自带一个网络接口,相当于主机的一张网卡,它的名字也叫br0。上图相当于一个bridge br0连接了三台机器:host,docker1,docker2,它们形成了一个独立的LAN。而主机的eth0则将主机连接到外部的交换机,和交换上的其它主机形成一个LAN。现在配置网络的IP:Host的eth0:将主机连接到外部交换机。Ip=81/24, 主机的网关为 dev eth0。Host的br0网络接口: 将主机连接到内

3、部交换机br0。Ip=/16。注意,当同时为主机的eth0和br0设置IP时,它俩不能处于同一网段。Docker1的eth0:将docker1连接到交换机br0。Ip=00/16。Docker1 网关为。Docker2的eth0:将docker2连接到交换机br0。Ip=00/16。Docker2 网关为。这样docker1,docker2以及host所形成的LAN就配置好了,它的网段为/16。现在,docker1、docker2以及主机,这三台设备可以正常通信了。那么,docker1和docker

4、2如何才能访问host以外的世界呢?答案是NAT。也就是需要配置转发机制,在网络接口host:br0和host:eth0之间转发数据包。配置转发机制首先要开启linux的网络转发功能,然后要在iptables中配置SNAT源地址转换。上面就是docker默认使用的网络模式(-net=bridge)。Docker daemon一启动,就会创建bridge,不过名字叫做 docker0。并将网口docker0的IP配成了/16。以后每启动一个容器,就自动为该容器创建veth pair,将一端连到bridge docker0,将另一端放入容器内,改名为eth0。容器内的eth0的

5、ip配置为172.17.x.x/16,容器的网关配置为。下面,我们用命令一步一步创建该网络,以加深对docker网络原理的理解。1. 启动两个docker容器,不要让docker自动配置网络docker run itd -name=docker1 -net=none test/ubuntu:14 /bin/bashdocker run itd -name=docker2 -net=none test/ubuntu:14 /bin/bash2. 找到容器的netns,将其连接到/var/run/netns/下,以便为其配置网卡。先找到docker容器的PID:docker1P

6、id=$(docker inspect -format=.State.Pid docker1)docker2Pid=$(docker inspect -format=.State.Pid docker2)再将docker容器的net namespace链接到/var/run/netns/:mkdir /var/run/netns #如果没有该目录,先创建。ln s /proc/$docker1Pid/ns/net /var/run/netns/docker1nsln s / proc/$docker1Pid/ns/net /var/run/netns/docker2ns现在,就可以查看一下这两

7、个net namespace中的连接情况:ip netns exec docker1ns ip link list3. 创建网桥和虚拟网卡brctl addbr br0ip link add vnic11 type veth peer name vnic12ip link add vnic21 type veth peer name vnic22ip link list #查看所有link将vnic11和vnic21 attach到网桥br0:brctl addif br0 vnic11brctl addif br0 vnic214. 把vnic12和vnic22分别放入docker1ns和d

8、ocker2ns,并重命名为eth0ip link set vnic12 netns docker1nsip link set vnic22 netns docker2nsip netns exec docker1ns ip link set vnic12 name eth0ip netns exec docker2ns ip link set vnic22 name eth05. 为网口br0, docker1ns:eth0, docker2ns:eth0配置IPip addr add /16 dev br0ip netns exec docker1ns ip addr ad

9、d 00/16 dev eth0ip netns exec docker1ns ip link set eth0 upip netns exec docker1ns ip route add default via ip netns exec docker2ns ip addr add 00/16 dev eth0ip netns exec docker2ns ip link set eth0 upip netns exec docker2ns ip route add default via 注意,必须先激活网口,才能配置网关。

10、6. 启动所有网口ip link set br0 upip link set vnic11 upip link set vnic21 up至此,docker1,dockr2和主机可以相互通信了。7. 开启linux的转发功能:sysctl w net.ipv4.ip_forward=1,或者 echo 1 > /proc/sys/net/ipv4/ip_forward这样,当从br0收到包后,若目的地址不是host,则选择合适的网络接口(如eth0)发出去。从eth0收到包后,也会按一样的规则做转发处理。8. 配置SNAT, 将从docker来的包的源地址改为81i

11、ptables t nat A POSTROUTING s 00 j SNAT -to 81iptables t nat A POSTROUTING s 00 j SNAT -to 81至此,docker1和docker2就可以ping通host以外的世界了。可以尝试一下:docker attach docker1ping 85 #到你的LAN中的其它机器。要想暂时离开(detach)docker容器,连续按Ctrl+p, Ctrl+q。下次还可以attach。注意,不要用exit命令,exit会

12、关闭容器,前面为容器所做的修改都会消失。9. 配置DNAT, 将docker容器内的某个端口对外开放,允许主机外的程序访问docker容器内的服务:iptables t nat A PREROUTING d 81 p tcp -dport 8080 j DNAT -to 00:80至此,有人通过tcp协议访问81:8080时,如用浏览器访问81:8080,linux会将其映射到docker2的80端口,即00:80。二、将docker容器加入本地网络(和主机在同一网段192.168.1

13、.0/24)要将docker容器加入本地网络,即让docker容器和host处于同一网段(/24),需要把虚拟交换机(bridge br1)与外部交换级联,形成一个广播域。级联的方法是:把host:eth0直接attach到bridge br1。这样一来,host:eth0就不是host的有效网口了,故需要删除host:eth0的ip,而要把host的ip设到网口br1上。另外,host的网关也要用dev br1。按照上述网络拓扑,IP设置如下:host:eth0: 删除其IP,将其直接连接到网桥br1。br1网口:设置为eth0原来的IP,即81/

14、24。主机的网关还是,但访问外部的网口要换为br1。docker3:eth0:ip为85, 网关为。docker4:eth0:ip为86,网关为。下面,我们用命令一步一步创建该网络。1. 启动两个docker容器,不要让docker自动配置网络docker run itd -name=docker3 -net=none test/ubuntu:14 /bin/bashdocker run itd -name=docker4 -net=none test/ubuntu:14 /bin/b

15、ash2. 找到容器的netns,将其连接到/var/run/netns/下,以便为其配置网卡。先找到docker容器的PID:docker3Pid=$(docker inspect -format=.State.Pid docker3)docker4Pid=$(docker inspect -format=.State.Pid docker4)再将docker容器的net namespace链接到/var/run/netns/:mkdir /var/run/netns #如果没有该目录,先创建。ln s /proc/$docker3Pid/ns/net /var/run/netns/dock

16、er3nsln s / proc/$docker4Pid/ns/net /var/run/netns/docker4ns现在,就可以查看一下这两个net namespace中的连接情况:ip netns exec docker4ns ip link list3. 创建网桥和虚拟网卡brctl addbr br1ip link add vnic31 type veth peer name vnic32ip link add vnic41 type veth peer name vnic42ip link list #查看所有link将vnic31和vnic41 attach到网桥br1:brct

17、l addif br1 vnic31brctl addif br1 vnic414. 把vnic32和vnic42分别放入docker3ns和docker4ns,并重命名为eth0ip link set vnic32 netns docker3nsip link set vnic42 netns docker4nsip netns exec docker3ns ip link set vnic32 name eth0ip netns exec docker4ns ip link set vnic42 name eth05. 为网口docker3ns:eth0, docker4ns:eth0配置

18、IP和网关ip netns exec docker3ns ip addr add 83/24 dev eth0ip netns exec docker3ns ip link set eth0 upip netns exec docker3ns ip route add default via ip netns exec docker4ns ip addr add 84/24 dev eth0ip netns exec docker4ns ip link set eth0 upip netns exec docker4ns ip route add d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论