有没有办法消除docker exec的开销?例如,当我在一个已经运行的容器上调用docker exec ls时,返回结果需要0.15秒。
root@min:/# time docker exec 6f ls
bin
boot
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
real 0m0.159s
user 0m0.028s
sys 0m0.028s但是,如果我启动附加的容器,并从容器的命令行执行ls,它只需要几毫秒。
root@min:/# docker start -ai 6f
[root@6f384443d3a6 /]# time ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
real 0m0.004s
user 0m0.003s
sys 0m0.000s容器的创建方式如下:
$ docker create -t -i fedora bash
6f8af538ec541dd581ebc2a24153a28329acb5268abe5ef868c1f1a261221752
$ docker start 6fdocker exec的开销是多少?有没有办法减少它?(我正在尝试创建一个服务,该服务托管正在运行的容器,并在其中调用可执行文件并返回结果。但如果每次调用需要150毫秒,那就不好了)。
发布于 2020-11-18 22:55:49
Docker被实现为基于HTTP的服务,通常通过Unix套接字调用。例如,您可以在Docker API文档中看到"create an exec instance"请求。运行一个docker exec命令至少需要两次往返,外加启动主机端docker进程的开销。在原生Linux上,HTTP调用将通过Unix套接字进行;在其他平台上,根据您的设置,它可能需要跨越VM边界,甚至需要通过TCP。
对我来说,一次docker exec调用150ms直观地感觉有点慢,但并没有超出合理的范围。由于所有这些机制都在docker客户端工具和服务器守护进程中,因此您不能做太多的事情来加快速度。
典型的Docker设置会有运行长时间运行的服务器进程的容器(不是一个空的fedora容器,也不是一个bash外壳作为主容器进程)。您应该能够向容器发出网络请求,这可能比docker exec更快(并且不需要管理员权限)。
https://stackoverflow.com/questions/64894654
复制相似问题