在 docker 桌面 WSL2 中使用 /dev/random 性能缓慢

Slow performance using /dev/random in docker desktop WSL2

上下文:

我在 Docker Linux 容器 上有一个 JAVA Web 应用程序 运行。该应用程序使用 FIPS 3RD 方库来执行一些加密操作。这样的库在 Linux 环境中部署时会大量使用 /dev/random。我既不能修改库也不能替换它。

对于 develop/test 应用程序,我使用 Docker Desktop for Windows。如果我使用 WSL1 引擎部署应用程序,应用程序会顺利运行。但是,如果我指示 Docker Desktop 使用 WSL2 引擎,应用程序在加密操作期间开始滞后...

问题:

有解决办法吗?

应用任何这些解决方案之前,检查熵丢失是否是您真正的问题...为此执行这些命令(在您的 docker 主机和在你的容器中):

cat /proc/sys/kernel/random/entropy_avail

它应该 return 一个大于 1000 的数字 ...

dd if=/dev/random of=/dev/null bs=1024 count=1 iflag=fullblock

应该return快! (来源:haveged and rng-tools

解法:

对于 Windows 用户(运行 Docker停止 Windows 的用户):

  1. 继续将 WSL1 引擎与 Docker 桌面一起使用。
  2. 如果前面的方案不行,执行this:

docker pull harbur/haveged

docker run --privileged -d harbur/haveged

说明:这将运行一个docker容器执行haveged daemon/process作为CMD。这样的过程,加上 --privileged 标志,将为您的 host /dev/random 提供熵,避免阻塞问题。

对于 Linux 用户(那些 运行宁 Linux 作为 docker 主机):

  1. 将主机的 /dev/urandom 映射为 volume/mount-point 到容器的 /dev/random。这会欺骗你的容器,当它使用 /dev/random 时,它会使用你主机的 /dev/urandom,它不会被设计阻塞。人们可能 argue 这是不安全的,但这超出了这个问题的范围。

  2. 在您的docker主机中安装一个增加熵池的软件,例如haveged or rng-tools(如果您有硬件TRNG)

最后的想法和结论:

  1. /dev/random/dev/urandom 在 docker 容器中指向 docker 主机的 /dev/random/dev/urandom .我没有任何文档来备份这个,除了这些: and ...以及如果我访问 WSL2 docker-desktop-distro(使用 wsl -d docker-desktop)和实验事实我执行前面描述的 dd 命令,我可以看到主机和容器(反之亦然)中的熵是如何减少的......这就是为什么使用解决方案,比如部署 haveged 容器或安装 haveged docker宿主,工作。

  2. 根据 haveged link,此类软件已被弃用,因为其逻辑现在包含在 linux 内核 v5.6 中......这可能意味着如果您的 docker 主机 运行 正在使用等于或高于 5.6 版的 Linux 内核,则您无需执行任何操作,因为 /dev/random 永远不会阻塞。

  3. 我尝试在 WSL2 docker 发行版 (docker-desktop) 中安装 haveged,但是这样的发行版不允许您执行 apt-get ...