ker网络原理揭秘.pdf

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ker网络原理揭秘

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;另一端在default或 global netns 中,通常命名为 vethXXXXXXXX。上图中将其命名为 vnic11和vnic21。 Bridge br0 自带一个网络接口,相当于主机的一张网卡,它的名字也 叫br0。上图相当于一个bridgebr0 连接了三台机器:host,docker1, docker2,它们形成了一个独立的LAN。而主机的eth0 则将主机连接 到外部的交换机,和交换上的其它主机形成一个LAN。 现在配置网络的IP: Host 的eth0:将主机连接到外部交换机。Ip=81/24, 主 机的网关为 dev eth0。 Host 的 br0 网络接口: 将主机连接到内部交换机 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 和docker2 如何才能访问host 以外的世界呢?答案 是NAT。也就是需要配置转发机制,在网络接口host:br0和host:eth0 之间转发数据包。配置转发机制首先要开启linux 的网络转发功能, 然后要在iptables 中配置SNAT 源地址转换。 上面就是 docker 默认使用的网络模式(--net=bridge)。Docker daemon 一启动,就会创建bridge,不过名字叫做 docker0。并将网 口docker0 的IP 配成了 /16。以后每启动一个容器,就 自动为该容器创建vethpair,将一端连到bridge docker0,将另一 端放入容器内,改名为 eth0 。容器内的 eth0 的 ip 配置为 172.17.x.x/16,容器的网关配置为。 下面,我们用命令一步一步创建该网络,以加深对docker 网络原理 的理解。 1. 启动两个docker 容器,不要让docker 自动配置网络 docker run –itd --name=docker1 --net=none test/ubuntu:14 /bin/bash docker run –itd --name=docker2 --net=none test/ubuntu:14 /bin/bash 2. 找到容器的 netns,将其连接到/var/run/netns/下,以便为其配 置网卡。 先找到docker 容器的PID: docker1Pid=$(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/docker1ns ln –s / proc/$docker1Pid/ns/net /var/run/netns/docker2ns 现在,就可以查看一下这两个net namespace 中的连接情况: ip netns exec docker1ns

您可能关注的文档

文档评论(0)

yigang0925 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档