前言
Docker in Docker(DinD)是一种在容器内运行 Docker 的解决方案,但在未为 DinD 容器使用 Volume 时,内部容器的 Copy-on-Write(写时复制)存储驱动会严重影响性能。
分析
当试图在容器内使用 Docker,且不使用 Volume 为内部 Docker 提供存储时,内部 Docker 将无法使用 OverlayFS 作为 Storage Driver,而是使用了 Copy-on-Write(写时复制)作为 Storage Driver。
由于 Copy-on-Write 存储驱动的特性,写操作需要在容器的副本中进行,需要进行额外的复制和写入操作。这会导致写操作的性能严重下降,特别是在频繁的写入场景下。
但如果在外部 Docker 使用 Volume 为内部 Docker 提供存储(即将 Volume 挂载至 /var/lib/docker
)时,便可使用 OverlayFS(overlay2)作为内部 Docker 的容器存储驱动。
解决方案
在编写 Dockerfile 时,为 DinD 镜像声明内部 Docker 存储位置的存储卷(/var/lib/docker
)即可。
FROM ubuntu:jammy
RUN apt -y install docker-compose
VOLUME ["/var/lib/docker"]
CMD ["/lib/systemd/systemd"]