惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
Jina AI
Jina AI
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
I
InfoQ
L
LangChain Blog
The Cloudflare Blog
IT之家
IT之家
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
罗磊的独立博客
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
F
Fortinet All Blogs
博客园 - 聂微东
美团技术团队
博客园_首页

Jacky's Blog

2025 年终总结 – Jacky's Blog Cursor Tab – Jacky's Blog JetKVM 初体验 – Jacky's Blog 🎉 Nginx UI 获得 10k Stars – Jacky's Blog 2024 年终总结 – Jacky's Blog Home Assistant 自定义模板开关 – Jacky's Blog Docker 容器日志监控方案 Grafana + Loki + Promtail – Jacky's Blog 23 – Jacky's Blog 2023 年终总结 – Jacky's Blog 22 – Jacky's Blog Drone Bark 通知发送插件 – Jacky's Blog
在 Drone CI 中使用 DooD – Jacky's Blog
Jacky 23 4 月, 2023 · 2023-04-23 · via Jacky's Blog

前言

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]。下图是对上述内容的抽象。

在 Drone CI 中使用 DooD-Jacky's Blog
Docker 架构图

根据 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

引用

[1] Docker overview, https://docs.docker.com/get-started/overview/