Docker网络原理分析.docx
- 文档编号:15019335
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:8
- 大小:141.10KB
Docker网络原理分析.docx
《Docker网络原理分析.docx》由会员分享,可在线阅读,更多相关《Docker网络原理分析.docx(8页珍藏版)》请在冰点文库上搜索。
Docker网络原理分析
Docker网络原理分析
Docker使用linux的bridge和veth虚拟网络设备,以及networknamespace对网络进行虚拟化。
Bridge看其名字是网桥,但实际上它的功能和交换机(switch)相似。
Veth则是一对网络接口,像是用一条网线连接起来的两块网卡。
阅读这篇文章前,应该先了解linux的bridge和veth的原理和用法,熟悉brctl,ip,iptables三个重要命令的使用方法。
一、Docker经典网络架构:
从上图可知,每个docker容器通过一对veth连入bridgebr0。
Veth的一端在dockernetns中,通常改名为eth0;另一端在default或globalnetns中,通常命名为vethXXXXXXXX。
上图中将其命名为vnic11和vnic21。
Bridgebr0自带一个网络接口,相当于主机的一张网卡,它的名字也叫br0。
上图相当于一个bridgebr0连接了三台机器:
host,docker1,docker2,它们形成了一个独立的LAN。
而主机的eth0则将主机连接到外部的交换机,和交换上的其它主机形成一个LAN。
现在配置网络的IP:
Host的eth0:
将主机连接到外部交换机。
Ip=192.168.1.181/24,主机的网关为192.168.1.1deveth0。
Host的br0网络接口:
将主机连接到内部交换机br0。
Ip=10.0.0.1/16。
注意,当同时为主机的eth0和br0设置IP时,它俩不能处于同一网段。
Docker1的eth0:
将docker1连接到交换机br0。
Ip=10.0.0.100/16。
Docker1网关为10.0.0.1。
Docker2的eth0:
将docker2连接到交换机br0。
Ip=10.0.0.200/16。
Docker2网关为10.0.0.1。
这样docker1,docker2以及host所形成的LAN就配置好了,它的网段为10.0.0.0/16。
现在,docker1、docker2以及主机,这三台设备可以正常通信了。
那么,docker1和docker2如何才能访问host以外的世界呢?
答案是NAT。
也就是需要配置转发机制,在网络接口host:
br0和host:
eth0之间转发数据包。
配置转发机制首先要开启linux的网络转发功能,然后要在iptables中配置SNAT源地址转换。
上面就是docker默认使用的网络模式(--net=bridge)。
Dockerdaemon一启动,就会创建bridge,不过名字叫做docker0。
并将网口docker0的IP配成了172.17.0.1/16。
以后每启动一个容器,就自动为该容器创建vethpair,将一端连到bridgedocker0,将另一端放入容器内,改名为eth0。
容器内的eth0的ip配置为172.17.x.x/16,容器的网关配置为172.17.0.1。
下面,我们用命令一步一步创建该网络,以加深对docker网络原理的理解。
1.启动两个docker容器,不要让docker自动配置网络
dockerrun–itd--name=docker1--net=nonetest/ubuntu:
14/bin/bash
dockerrun–itd--name=docker2--net=nonetest/ubuntu:
14/bin/bash
2.找到容器的netns,将其连接到/var/run/netns/下,以便为其配置网卡。
先找到docker容器的PID:
docker1Pid=$(dockerinspect–-format=’{{.State.Pid}}’docker1)
docker2Pid=$(dockerinspect–-format=’{{.State.Pid}}’docker2)
再将docker容器的netnamespace链接到/var/run/netns/:
mkdir/var/run/netns#如果没有该目录,先创建。
ln–s/proc/$docker1Pid/ns/net/var/run/netns/docker1ns
ln–s/proc/$docker1Pid/ns/net/var/run/netns/docker2ns
现在,就可以查看一下这两个netnamespace中的连接情况:
ipnetnsexecdocker1nsiplinklist
3.创建网桥和虚拟网卡
brctladdbrbr0
iplinkaddvnic11typevethpeernamevnic12
iplinkaddvnic21typevethpeernamevnic22
iplinklist#查看所有link
将vnic11和vnic21attach到网桥br0:
brctladdifbr0vnic11
brctladdifbr0vnic21
4.把vnic12和vnic22分别放入docker1ns和docker2ns,并重命名为eth0
iplinksetvnic12netnsdocker1ns
iplinksetvnic22netnsdocker2ns
ipnetnsexecdocker1nsiplinksetvnic12nameeth0
ipnetnsexecdocker2nsiplinksetvnic22nameeth0
5.为网口br0,docker1ns:
eth0,docker2ns:
eth0配置IP
ipaddradd10.0.0.1/16devbr0
ipnetnsexecdocker1nsipaddradd10.0.0.100/16deveth0
ipnetnsexecdocker1nsiplinkseteth0up
ipnetnsexecdocker1nsiprouteadddefaultvia10.0.0.1
ipnetnsexecdocker2nsipaddradd10.0.0.200/16deveth0
ipnetnsexecdocker2nsiplinkseteth0up
ipnetnsexecdocker2nsiprouteadddefaultvia10.0.0.1
注意,必须先激活网口,才能配置网关。
6.启动所有网口
iplinksetbr0up
iplinksetvnic11up
iplinksetvnic21up
至此,docker1,dockr2和主机可以相互通信了。
7.开启linux的转发功能:
sysctl–wnet.ipv4.ip_forward=1,
或者
echo1>/proc/sys/net/ipv4/ip_forward
这样,当从br0收到包后,若目的地址不是host,则选择合适的网络接口(如eth0)发出去。
从eth0收到包后,也会按一样的规则做转发处理。
8.配置SNAT,将从docker来的包的源地址改为192.168.1.181
iptables–tnat–APOSTROUTING–s10.0.0.100–jSNAT--to192.168.1.181
iptables–tnat–APOSTROUTING–s10.0.0.200–jSNAT--to192.168.1.181
至此,docker1和docker2就可以ping通host以外的世界了。
可以尝试一下:
dockerattachdocker1
ping192.168.1.185#到你的LAN中的其它机器。
要想暂时离开(detach)docker容器,连续按Ctrl+p,Ctrl+q。
下次还可以attach。
注意,不要用exit命令,exit会关闭容器,前面为容器所做的修改都会消失。
9.配置DNAT,将docker容器内的某个端口对外开放,允许主机外的程序访问docker容器内的服务:
iptables–tnat–APREROUTING–d192.169.1.181–ptcp–-dport8080–jDNAT–-to10.0.0.200:
80
至此,有人通过tcp协议访问192.168.1.181:
8080时,如用浏览器访问http:
//192.168.1.181:
8080,linux会将其映射到docker2的80端口,即10.0.0.200:
80。
二、将docker容器加入本地网络(和主机在同一网段192.168.1.0/24)
要将docker容器加入本地网络,即让docker容器和host处于同一网段(192.168.1.0/24),需要把虚拟交换机(bridgebr1)与外部交换级联,形成一个广播域。
级联的方法是:
把host:
eth0直接attach到bridgebr1。
这样一来,host:
eth0就不是host的有效网口了,故需要删除host:
eth0的ip,而要把host的ip设到网口br1上。
另外,host的网关也要用devbr1。
按照上述网络拓扑,IP设置如下:
host:
eth0:
删除其IP,将其直接连接到网桥br1。
br1网口:
设置为eth0原来的IP,即192.168.1.181/24。
主机的网关还是192.168.1.1,但访问外部的网口要换为br1。
docker3:
eth0:
ip为192.168.1.185,网关为192.168.1.1。
docker4:
eth0:
ip为192.168.1.186,网关为192.168.1.1。
下面,我们用命令一步一步创建该网络。
1.启动两个docker容器,不要让docker自动配置网络
dockerrun–itd--name=docker3--net=nonetest/ubuntu:
14/bin/bash
dockerrun–itd--name=docker4--net=nonetest/ubuntu:
14/bin/bash
2.找到容器的netns,将其连接到/var/run/netns/下,以便为其配置网卡。
先找到docker容器的PID:
docker3Pid=$(dockerinspect–-format=’{{.State.Pid}}’docker3)
docker4Pid=$(dockerinspect–-format=’{{.State.Pid}}’docker4)
再将docker容器的netnamespace链接到/var/run/netns/:
mkdir/var/run/netns#如果没有该目录,先创建。
ln–s/proc/$docker3Pid/ns/net/var/run/netns/docker3ns
ln–s/proc/$docker4Pid/ns/net/var/run/netns/docker4ns
现在,就可以查看一下这两个netnamespace中的连接情况:
ipnetnsexecdocker4nsiplinklist
3.创建网桥和虚拟网卡
brctladdbrbr1
iplinkaddvnic31typevethpeernamevnic32
iplinkaddvnic41typevethpeernamevnic42
iplinklist#查看所有link
将vnic31和vnic41attach到网桥br1:
brctladdifbr1vnic31
brctladdifbr1vnic41
4.把vnic32和vnic42分别放入docker3ns和docker4ns,并重命名为eth0
iplinksetvnic32netnsdocker3ns
iplinksetvnic42netnsdocker4ns
ipnetnsexecdocker3nsiplinksetvnic32nameeth0
ipnetnsexecdocker4nsiplinksetvnic42nameeth0
5.为网口docker3ns:
eth0,docker4ns:
eth0配置IP和网关
ipnetnsexecdocker3nsipaddradd192.168.1.183/24deveth0
ipnetnsexecdocker3nsiplinkseteth0up
ipnetnsexecdocker3nsiprouteadddefaultvia192.168.1.1
ipnetnsexecdocker4nsipaddradd192.168.1.184/24deveth0
ipnetnsexecdocker4nsiplinkseteth0up
ipnetnsexecdocker4nsiprouteadddefaultvia192.168.1.1
注意,必须先激活网口,才能配置网关。
6.启动所有网口
iplinksetbr1up
iplinksetvnic31up
iplinksetvnic41up
7.配置主机的IP和网关
需要删除eth0的IP,配置br1的IP,并把网关配置到网口br1。
如果是远程操作,必须用一条命令完成,因为更换网口IP时会断网。
ipaddrdel192.168.1.181/24deveth0;\
ipaddradd192.168.1.181/24devbr1;\
iproutedeldefault;\
iprouteadddefaultvia192.168.1.1devbr1;\
brctladdifbr1eth0
上述命令执行完成后,可能需要重新登录到192.168.1.181。
至此,docker1,dockr2以及host都成为LAN上的一员了。
注意:
如果host是一台VirtualBoxVM,那么,必须将VM的虚拟网卡AdapterType设置为PCnet-FastIII(Am79c973),PromiscuousMode设为AllowAll。
否则,VM的虚拟网卡只会让带有自己的MAC地址的包通过,而docker3:
eth0和docker4:
eth0由于有自己的MAC,它们的包会被过滤掉。
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Docker 网络 原理 分析