在docker容器中运行的服务。
假设容器的ip为172.18.0.4,并且端口forword为'-p 1234:8888'。
所以在主机上访问服务,哪种方式更快?
答案 0 :(得分:1)
我使用命令dd if=/dev/zero of=~/file bs=8k count=20000
创建了一个157 MB的文件。命令netcat
将用于将此文件从主机传输到容器(具有已发布的端口)。有关如何使用netcat传输文件的详细信息,请参见联机帮助页。
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
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