![Docker远征](https://img.tnblog.net/arcimg/hb/656ec4beace04f5e9a7b1d58b6368639.jpg "Docker远征")
>#使用iPerf比较不同Docker网络设置的性能
[TOC]
IPerf的介绍
------------
tn>iperf是一种命令行工具,用于通过测量服务器可以处理的最大网络吞吐量来诊断网络速度问题。它在遇到网络速度问题时特别有用,通过该工具可以确定哪个服务器无法达到最大吞吐量。
更多详细基本请参考:https://www.jianshu.com/p/15f888309c72
下载IPerf
------------
```bash
curl -LO https://iperf.fr/download/archlinux/iperf-2.0.5-9-x86_64.pkg.tar.xz
# Pacman 是一个软件包管理器 -U 表示安装本地包
yes | pacman -U iperf-2.0.5-9-x86_64.pkg.tar.xz
```
测试:主机连接主机
------------
>这复制了运行在同一主机上的两个进程,通过 TCP 相互连接。
- nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行;
- Jobs: 通过`jobs`或`jobs -l`显示后台运行的任务,可以通过命令`kill -9 `杀死。
```bash
# -s 表示服务器
# -p 表示服务器端口
nohup iperf -s -p 5002 >/dev/null 2>&1 &
# -c 表示客户端要测试的服务器地址
iperf -c localhost -p 5002
```
![](https://img.tnblog.net/arcimg/hb/c4f8db78e47e4add91137da254f97570.png)
tn>10秒,传输`39.5 G`的数据,带宽为:`33.9 Gbits/sec`
测试:主机的客户端连接 Docker 的服务器
------------
>这复制了主机上的一个进程和一个容器内的一个进程,它们通过 TCP 相互连接。
```bash
docker run -d -p 5001:5001 --name mapped-iperf benhall/iperf iperf -s
iperf -c localhost
```
![](https://img.tnblog.net/arcimg/hb/758baa6c70b44442be148cea54bb0602.png)
tn>10秒,传输`7.09 G`的数据,带宽为:`6.09 Gbits/sec`,性能不如主机连主机。
测试: Docker 的进程通过链接进行通信
------------
>创建两个容器之间的链接,以便它们通过友好名称进行通信。
```bash
docker run -d --name link-server benhall/iperf iperf -s
docker run -it --link link-server:server benhall/iperf iperf -c server
```
![](https://img.tnblog.net/arcimg/hb/3d21399fb9e54b07889b6c38e78ce8d1.png)
tn>10秒,传输`31.7 G`的数据,带宽为:`27.2 Gbits/sec`,性能良好。
测试: Docker 的进程通过网络进行通信
------------
>这使用 Docker 网络来创建桥。容器通过该桥进行通信。
```bash
# 创建iperf网络
docker network create iperf
# 服务器
docker run -d --net=iperf --name network-server benhall/iperf iperf -s
# 客户端
docker run -it --net=iperf benhall/iperf iperf -c network-server
```
![](https://img.tnblog.net/arcimg/hb/5148c642d456469b8249bb3a2b5e0fe4.png)
tn>10秒,传输`30.6 G`的数据,带宽为:`26.3 Gbits/sec`,性能良好。
测试: Docker 的进程通过共享网络命名空间进行通信(container)
------------
>使用共享网络的容器。
```bash
docker run -d --name shared-server benhall/iperf iperf -s
docker run -it --net=container:shared-server benhall/iperf iperf -c localhost
```
![](https://img.tnblog.net/arcimg/hb/ce23316187d449e28db64ddf86483170.png)
tn>10秒,传输`47.8 G`的数据,带宽为:`47.8 Gbits/sec`,性能超高。
测试:使用主机网络的进程
------------
### 容器客户端,通过主机网络连接到主机
```bash
docker run -it --net=host benhall/iperf iperf -c 172.19.0.1 -p 5002
```
![](https://img.tnblog.net/arcimg/hb/d05567c5e5d24a0486fc7cb23b8bc557.png)
tn>10秒,传输`37.9 G`的数据,带宽为:`32.6 Gbits/sec`,性能比较高。
### 容器服务器,通过主机网络连接到主机上的客户端
```bash
docker rm -f mapped-iperf
docker run -d --net=host benhall/iperf iperf -s
iperf -c localhost
```
![](https://img.tnblog.net/arcimg/hb/e1e159efdefd412db42d23daee40981b.png)
tn>10秒,传输`40.5 G`的数据,带宽为:`34.8 Gbits/sec`,性能比较高。