前言
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
非常感谢你分享这篇文章,我从中学到了很多新的知识。