前言

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"]