Docker网络原理分析.docx

上传人:b****1 文档编号:15019335 上传时间:2023-06-29 格式:DOCX 页数:8 大小:141.10KB
下载 相关 举报
Docker网络原理分析.docx_第1页
第1页 / 共8页
Docker网络原理分析.docx_第2页
第2页 / 共8页
Docker网络原理分析.docx_第3页
第3页 / 共8页
Docker网络原理分析.docx_第4页
第4页 / 共8页
Docker网络原理分析.docx_第5页
第5页 / 共8页
Docker网络原理分析.docx_第6页
第6页 / 共8页
Docker网络原理分析.docx_第7页
第7页 / 共8页
Docker网络原理分析.docx_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Docker网络原理分析.docx

《Docker网络原理分析.docx》由会员分享,可在线阅读,更多相关《Docker网络原理分析.docx(8页珍藏版)》请在冰点文库上搜索。

Docker网络原理分析.docx

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,它们的包会被过滤掉。

 

欢迎您的下载,

资料仅供参考!

 

致力为企业和个人提供合同协议,策划案计划书,学习资料等等

打造全网一站式需求

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2