当前位置:首页 » 币种行情 » eth和veth

eth和veth

发布时间: 2024-12-26 11:56:54

❶ 四、Docker网络揭秘

Docker 之所以功能这么强大,其实就是充分利用了Linux Kernel的特性:NameSpace、CGroups、UnionFileSystem。通过这些特性实现了资源隔离、限制与分层等。本文这次就来揭晓Docker中的容器是如何做到网络互通的。

两台机器如果要实现通信,其实就是通过底层的网卡进行数据传输,每个网卡都有一个唯一的MAC地址,网卡又会绑定一个ip地址,只要两台机器的网络可以互通,那么这两台机器就可以进行通信。

想要实现通信,就得有两个同一网段的网卡,两个网卡必须是可以 ping 通的。

Docker在安装成功后,会在宿主机创建一个docker0网卡,这个网卡就是负责容器与宿主机之间通信的桥梁。

通过Docker创建一个容器之后,会在宿主机再创建一个网卡,也就是上面的 veth3543ea3@if7 ,容器内也会创建一个网卡。

一般成对的网卡,网卡组件名称后面的数字是连续的,比如宿主机的 @if7 和容器内的 @if8 ,正是这成对的网卡,才实现了容器与宿主机之间的通信。这其实是利用 Linux Kernel 的特性 NameSpace 实现的网卡隔离,不同NameSpace下的网卡是独立的,就像Java程序中的 package 一样。

从上面的例子中看到容器与宿主机之间的通信好像并不是通过docker0网卡实现的?

其实这只是单容器的状态,可能看不出docker0的作用。用图来表示一下单容器的网卡通信情况。

通过docker生成的 eth0 和 veth 两个网卡实现同一网段内的通信,而这个网卡又是桥接在docker0网卡上的。

再看下有多个容器的情况。

两个容器之间可以互相通信的原因就是因为docker0的存在,因为它们的网卡都是桥接在docker0上,所以也就有了和另一个容器通信的桥。

我们来验证一下是不是这样!

这种网络连接方法我们称为Bridge,这也是docker中默认的网络模式。可以通过命令查看docker中的网络模式:

通过 docker network ls 命令查看到,docker提供了3种网络模式,brige模式我们已经知道了,那 host 和 none 又是什么意思呢?不妨来验证一下:

这种模式只会创建一个本地的环路网卡,无法与其他容器或宿主机进行通信。

在创建自己的network之前先来解释一下为什么要创建新的network。

我们用一个例子来演示一下不同容器之间的通信。

容器之间通过 ip 是可以正常访问的,但是有没有这种情况:如果一个容器出问题了,我们重启之后它的ip变了,那是不是其他用到这个容器的项目配置是不是都得改。

有没有可能直接通过容器名称来访问呢?来验证一下:

发现并不能 ping 通,但是可以使用别的手段来达到这个目的。

通过上面这种方式就可以做到以容器名来 ping 通其他容器,其实它就跟windows系统中在 hosts 文件里加了个映射是一样的。

可以看到创建自定义的 network 自动帮我们实现了这个功能,而且使用自定义的 network 也方便管理,不同业务类型的容器可以指定不同的 network。

不同的 network ip网段也不一样,这样也可以增加单机中可以创建的容器的数量。

在创建一个容器的时候,一般都需要讲容器需要暴露的端口映射到物理主机的相同端口或其他端口,因为在外网环境下是不方便直接连接到容器的,所以需要通过映射端口的方式,让外网访问宿主机的映射端口来访问容器。

如果想建立多个容器,势必需要端口映射,以满足不同容器使用相同端口的情况。

以上这些内容都是在单容器进行操作,容器之间通信也只是通过 docker0 实现的桥接模式。

如果要实现多机之间的docker通信,其实还是通过网卡,只不过需要其他的技术来实现了。

本章节就不在演示,到后面的章节再来分析!

❷ Docker网络

Docker网络

使用docker0网桥,docker0的默认网段是172.17.0.0,网关地址为172.17.0.1,通过bridge模式启动的容器,进入容器日内部并使用ip route show指令可以看到其使用的网关就是docker0的网关地址。

在宿主机上通过brctl show docker0可以看到docker0桥接的网卡与启动的容器的veth一致。

容器之间的通讯:
从a容器ping b容器
1、数据包从a容器对应的veth流到docker0
2、docker0广播arp寻找b容器对应的地址
3、b容器的veth收到广播并回复docker0自己就是目标
4、a容器与b容器建立连接并实现通信

容器与外网通讯
1、veth数据流到docker0网桥
2、docker0网桥流量流向eth0
3、eth0流量流向对应的目标
只要是eth0可以访问到的,容器就可以访问到

直接使用宿主机的网络,无法指定出入的流量以及暴露的端口,默认暴露出去的地址是0.0.0.0:xxxx,可以直接访问(TODO())。

通过docker指令创建自定义的网桥,由于默认的bridge模式无法为container指定ip,所以需要通过自定义网桥的方式来实现,且自定义网桥可以限制容器之间的相互访问,跨网桥无法互相访问。

使用指定网桥的时候只要通过network指定网桥名称即可,且使用自定义的网桥可以指定容器的IP。并且由于是固定IP,就可以通过iptable来做各种的规则。

这个模式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的。

这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。

Docker是通过iptable的方式实现流量的控制的

通过添加iptable规则实现

该指令添加了一条nat规则,把所有来自 172.17.0.0/16 网段且即将流出本主机的数据包的源 IP 地址都修改为 10.0.0.100(建议通过添加自定义网桥的方式来做)。

直接通过-p的方式暴露一个端口出去,默认使用的是0.0.0.0,所有网卡均可访问,也可以在参数中指定特定的网卡,例如:-p 192.168.1.1:80:80来指定只能通过该网卡来访问。

查看nat表
iptables -L -n -t nat --line-numbers
查看路由规则
route -n

❸ 单host下Docker的默认网络配置

本文用到的环境如下:
host: centos7
docker: 通过 yum install -y docker 安装,版本号为1.10.3
docker镜像:
# Version: 0.0.1 FROM ubuntu:latest MAINTAINER paul liu "[email protected]" RUN apt-get update RUN apt-get install -y net-tools RUN apt-get install -y iputils-ping CMD /bin/bash

场景图:

我的host主机接有无线路由器,通过ADSL拨号上网,网卡eth0固定IP为192.168.0.200,网关为路由器的IP 192.168.0.1。
在host上安装docker,并运行容器。

通过以下命令安装docker,
yum install -y docker
启用docker,
systemctl start docker
然后在host主机运行 ifconfig 或 ip a 命令,可以看到除去host原有的网卡eth0和回环lo外,多了个docker0。

docker0 IP为172.17.0.1,所在的网段默认为B类私网地址172.17.0.0/16。可以将docker0看做是host主机的一块虚拟网卡。这样host主机就等同于配置了双网卡,两块网卡之间可以通信,但前提是启用ip_forward。
这是docker0的第一个身份。

运行两个容器docker1,docker2,然后在host主机上运行 brctl show 查看,

这里可以看出docker0的第二个身份,一个虚拟交换机。每运行一个容器,就会产生一对veth,其中一端连接到docker0上,另一端连接到容器的eth0上。这样,所有连接到docker0的容器组成了一个局域网。如下图:

在host主机上运行 ifconfig ,也会发现多了两个veth这样的网络接口。

在host主机上运行 ip addr show veth6d9a691 ,可以查看到该veth具有mac地址,这也正说明了docker0的虚拟交换机的身份,交换机是通过mac地址通信的,连接到交换机的设备必须具有mac地址。

由于docker0自身也具有mac地址,这个与纯二层交换机是不同的,并且绑定了IP 172.17.0.1,容器默认把docker0作为了网关。也就是docker0还兼具路由的功能,因此可以把docker0看做是一个三层交换机,可以做二层数据包转发,也可以做三层路由转发。

在容器中运行 route -n 查看路由如下:

在host主机上运行 route -n 查看路由如下:

在host中,访问本网段192.168.0.0是通过eth0转发数据包的,访问172.17.0.0网段是通过docker0转发数据包的,而对于其他如公网是通过eth0将数据包转发给网关192.168.0.1,再由该网关进行数据包转发的,比如上网。

在容器中运行 ping sohu.com 或 ping 192.168.0.200 都可以ping通。

默认情况下,不需要再额外做任何配置,在一台host主机上,通过docker0,各容器之间可以互通,并且可以通过host的eth0连接外网。
通俗的讲,通过docker0组成了一个网段为172.17.0.0/16的以太网,docker容器发起请求时,如果是相同网段则经由docker0转发到目标机器,如果是不同网段,则经由docker0,转发到host的另一块网卡eth0上,由eth0负责下一步的数据包转发,比如公网地址。

下面进一步分析一下报文是怎么发送到外面的。

容器内部发送一条公网请求报文,通过eth0,在veth被接收。此时报文已经来到了主机上,通过查询主机的路由表( route -n ),如果发现报文应该通过主机的eth0,从默认网关发送出去,那么报文就被从docker0转发给主机的eth0,但前提是首先启用ip_forward功能,才能在host主机的docker0和eth0两个网卡间传递数据包。

由于目标地址并不属于host主机所在网段,那么会匹配机器上的 iptables中的nat表POSTROUTING链中的规则。
在host主机运行命令 iptables -L -n -t nat --line-numbers ,查看nat表,这里只看POSTROUTING链:

第一行中说明,对于源地址为172.17.0.0/16网段的数据包,发出去之前通过MQSQUERADE伪装。linux内核会修改数据包源地址为host主机eth0的地址(也就是192.168.0.200),然后把报文转发出去。对于外部来说,报文是从主机eth0发送出去的。

局域网内的机器由于都是私有IP,是无法直接访问互联网的(数据包可以发出去,但回不来。)如果要上网,除了可以通过硬件路由器,也可以通过软件路由,在iptables的nat表中的POSTROUTING链中添加SNAT规则。

测试一下,在host主机运行命令 iptables -t nat -D POSTROUTING 1 将第一条规则删掉,那么在容器中就运行命令 ping sohu.com 就ping不通了。但仍然可以ping通host主机。

在host主机运行命令以下命令恢复:
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -o eth0 -j SNAT --to-source 192.168.0.200
或者
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -j MASQUERADE

关于SNAT和MASQUERADE,这篇文章已经有过描述,可以参考: Docker前传之linux iptables

新建一Dockerfile,用以运行nginx容器:
# Version: 0.0.1 FROM paulliu/ubuntu_ip RUN apt-get install -y nginx EXPOSE 80

在host主机运行构建命令构建镜像 docker build -t paulliu/nginx .
在host主机运行容器启动命令 docker run -d -p 80 --name nginx1 paulliu/nginx nginx -g "daemon off;"
在host主机查看容器的端口映射 docker port nginx1 80

在host主机运行命令 iptables -nat -L -n 可以看到在PREROUTING链中多了以下DNAT规则:

也就是在容器启动时通过 -p 80 将host主机192.168.0.200:32773映射为容器172.17.0.4:80。
注意:docker容器每次启动时获取的IP地址未必是一样的,而且 -p 80 是在host主机上随机选择一个端口号进行映射,每次启动的端口号也未必是一样的。但iptables中相关的规则是自动变更的。

在host主机运行 curl localhost:32773 或者在其他主机运行 curl 192.168.0.200:32773 结果如下:

热点内容
eth和veth 发布:2024-12-26 11:56:54 浏览:9
明日之后采集挖矿哪个好 发布:2024-12-26 11:52:27 浏览:620
挖矿模拟器下载最新版本 发布:2024-12-26 10:52:24 浏览:881
期货现货合约怎么买 发布:2024-12-26 10:48:09 浏览:601
如何去正规医院体检中心 发布:2024-12-26 10:40:05 浏览:354
华南理工区块链 发布:2024-12-26 10:35:46 浏览:854
trx4回正抖动 发布:2024-12-26 10:26:14 浏览:897
刀塔传奇挖矿什么时 发布:2024-12-26 10:22:46 浏览:420
比特币冷钱包看余额 发布:2024-12-26 09:49:19 浏览:929
区块链技术在票据业务的应用 发布:2024-12-26 09:44:32 浏览:255