前言
DooD (Docker-outside-Docker) 是一种实现在 Docker 容器内部运行 Docker 的方法。与 DinD(Docker-inside-of-Docker)不同的是,DooD 使用的是宿主机的 Docker Engine。通过 DooD,我们可以在容器中构建镜像,并直接将其保存在宿主机的 Images 列表中。
Docker 采用客户端-服务器架构。Docker 客户端负责与 Docker 守护进程进行通信,而 Docker 守护进程则负责执行构建、运行和分发 Docker 容器的重要任务。Docker 客户端和守护进程可以在同一系统上运行,或者你可以将 Docker 客户端连接到远程的 Docker 守护进程。Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信。Docker Compose 是另一个 Docker 客户端,它允许你处理由多个容器组成的应用程序[1]。下图是对上述内容的抽象。

根据 Docker 官网文档的描述,我们可以尝试在容器中安装 Docker Client,通过将主机上的 Docker 套接字映射到容器内部,实现容器内的 Docker 客户端与主机上运行的 Docker 守护进程通信。
实验过程
创建一个 debian 容器,将 /var/run
映射到容器内,并安装 Docker CLI。
apt-get update apt-get install -y ca-certificates curl gnupg install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update apt-get install -y docker-ce-cli
接下来执行 docker ps -a
如果在宿主机中执行的输出结果一样,则说明 DooD 启动成功。
在 Drone CI 中使用
本文以在 DooD 中构建一个 nextcloud 镜像为例,通过将宿主机的 /var/run
目录映射到容器内,在容器内安装 DooD,然后启动镜像构建过程。值得注意的是,需要为容器赋予 privileged 权限,否则 Drone 无法启动容器。
kind: pipeline type: docker name: nextcloud steps: - name: build image image: debian privileged: true volumes: - name: dockersock path: /var/run commands: - apt-get update - apt-get install -y ca-certificates curl gnupg - install -m 0755 -d /etc/apt/keyrings - curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg - chmod a+r /etc/apt/keyrings/docker.gpg - echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null - apt-get update - apt-get install -y docker-ce-cli - docker ps -a - cd nextcloud - docker build -t nextcloud . volumes: - name: dockersock host: path: /var/run
非常感谢你分享这篇文章,我从中学到了很多新的知识。