没有足够的熵来支持在boot2docker中运行的docker容器中的/ dev / random

在虚拟化的Linux系统中用尽熵似乎是一个常见的问题(例如/ dev / random极慢 , 让linux缓冲/ dev / random )。 尽pipe使用了硬件随机数发生器(HRNG), 但是经常会build议使用像HAVEGED这样的熵收集守护进程。 然而,熵收集守护进程(EGD)不能在Docker容器中运行,它必须由主机提供。

使用EGD对于基于Linux发行版(如Ubuntu,RHEL等)的docker主机来说工作得很好。在boot2docker(基于Tiny Core Linux(TCL))内部获得这样的守护进程似乎是另一回事。 虽然TCL有扩展机制,但熵收集守护进程的扩展似乎不可用 。

所以EGD似乎是在(生产)托pipe环境中运行docker容器的合适解决scheme,但是如何解决它在boot2docker中的开发/testing呢?

由于在boot2docker中运行EGD似乎太困难了,所以我想简单地使用/ dev / urandom而不是/ dev / random。 使用/ dev / urandom是一个不太安全的方法,但对于大多数不会生成长期密钥的应用程序来说仍然很好。 至less在boot2docker里面开发/testing应该没问题。

我刚刚意识到,把主机的/ dev / urandom作为/ dev / random装入容器很简单:

 $ docker run -v /dev/urandom:/dev/random ... 

结果如预期:

 $ docker run --rm -it -v /dev/urandom:/dev/random ubuntu dd if=/dev/random of=/dev/null bs=1 count=1024 1024+0 records in 1024+0 records out 1024 bytes (1.0 kB) copied, 0.00223239 s, 459 kB/s 

至less我知道如何build立自己的boot2docker图像;-)

我发现的最优雅的解决scheme是在单独的容器中运行Haveged:

 docker pull harbur/haveged docker run --privileged -d harbur/haveged 

检查是否有足够的熵可用:

 $ cat /proc/sys/kernel/random/entropy_avail 2066 

由于我不喜欢修改我的Docker容器进行开发/testing,我试图修改boot2docker映像。 幸运的是,boot2docker映像是用Docker构build的,可以很容易地扩展 。 所以我build立了自己的Docker build boot2docker-urandom 。 它使用这里find的udev规则来扩展标准boot2docker映像。

构build自己的boot2docker.iso映像很简单

 $ docker run --rm mbonato/boot2docker-urandom > boot2docker.iso 

要replaceboot2docker附带的标准boot2docker.iso,您需要:

 $ boot2docker stop $ boot2docker delete $ mv boot2docker.iso ~/.boot2docker/ $ boot2docker init $ boot2docker up 

编辑:

但是 ,从Docker容器内部/ dev / random仍然会阻塞。 最有可能的是,因为Docker容器不直接使用主机的/ dev / random,而是使用相应的内核设备 – 这仍然会阻塞。

有什么build议么?

高山Linux可能是一个轻量级docker主机更好的select。 高山LXCdocker图像只有5mb(而boot2docker boot2docker

我使用Alpine for LXC游客和Debian上的haveged客人。 它提供足够的熵来生成容器中的gpg / ssh密钥和openssl证书。 阿尔卑斯现在有一个官方的docker回购 。

或者为Tiny Core构build一个haveged包 – 有一个包构build系统可用。

另一种select是安装rng-tools软件包并将其映射为使用/ dev / urandom

  yum install rng-tools rngd -r /dev/urandom 

有了这个,我不需要在Docker容器中映射任何卷。