访问docker容器中的服务时哪种方式更快?

时间:2016-04-01 08:18:55

标签: service docker

在docker容器中运行的服务。

假设容器的ip为172.18.0.4,并且端口forword为'-p 1234:8888'。

所以在主机上访问服务,哪种方式更快?

  • 172.18.0.4:8888
  • 127.0.0.1:1234

2 个答案:

答案 0 :(得分:1)

如何衡量

我使用命令dd if=/dev/zero of=~/file bs=8k count=20000创建了一个157 MB的文件。命令netcat将用于将此文件从主机传输到容器(具有已发布的端口)。有关如何使用netcat传输文件的详细信息,请参见联机帮助页。

使用容器IP地址

user@host:~$ time nc -x 172.20.0.2 8888 < file
nc -x 172.20.0.2 8888 < file  0.00s user 0.07s system 38% cpu 0.178 total
user@host:~$ time nc -x 172.20.0.2 8888 < file
nc -x 172.20.0.2 8888 < file  0.00s user 0.05s system 36% cpu 0.152 total
user@host:~$ time nc -x 172.20.0.2 8888 < file
nc -x 172.20.0.2 8888 < file  0.00s user 0.06s system 35% cpu 0.169 total

使用localhost IP地址

user@host:~$ time nc -x 127.0.0.1 8888 < file
nc -x 127.0.0.1 8888 < file  0.00s user 0.06s system 33% cpu 0.180 total
user@host:~$ time nc -x 127.0.0.1 8888 < file
nc -x 127.0.0.1 8888 < file  0.00s user 0.06s system 38% cpu 0.158 total
user@host:~$ time nc -x 127.0.0.1 8888 < file
nc -x 127.0.0.1 8888 < file  0.00s user 0.06s system 40% cpu 0.137 total

平均

使用命令的六个传输持续时间,平均持续时间为:   - 使用容器IP地址0.166。   - 使用本地主机IP地址0.158。 有8毫秒的差异。

结论

免责声明:该文件不是我的$HOMEDIR,而是/tmp,它被映射到内存中。然后读取更快。我不确定time命令何时停止:   - 发送最后一个TCP数据包?   - 当最后一个TCP数据包被缓冲?   - 收到最后一个ACK? 我会打赌这个

在任何方面,8毫秒的差异,IMO,并不是什么大不了的事。即使加载页面8毫秒有时会产生很大的差异,缓存静态文件可以比这种差异更快地提供更好的结果。

答案

使用本地主机IP地址似乎更快。

更多测试..

..确认localhost IP地址具有较小的标准偏差(0.045对0.024)。请注意,差异(9 ms)约为平均传输持续时间的5%(169 ms)。

答案 1 :(得分:0)

我的猜测是它会是一样的。

可以提高性能的一个选项是配置容器以使用主机的网络堆栈。

docker run --net=host ...

这可以保证最佳性能,但容器中的所有端口都将暴露给主机。

参考:https://docs.docker.com/engine/reference/run/#network-host