
本项目的灵感来源于两个现有仓库:
有时需要在Docker容器内运行其他Docker容器,这通常需要变通解决方案,尤其是在CI/CD流水线或需要大量虚拟化的软件中。
有两种方法可以执行DinD:
此策略通过-v /var/run/docker.sock:/var/run/docker.sock共享主机系统的/var/run/docker.sock套接字。本质上,这种技术允许我们从主容器中生成由主机系统管理的容器。然而,在这些次级容器中创建的任何容器实际上只在主机系统上出现,而不在发起容器内部。这种方法通常会遇到两个主要挑战:
网络挑战:在DooD系统中,当在一个容器内实例化另一个容器时,两个容器均由主机系统管理。因此,如果从DooD容器运行一个暴露端口3306的容器,该端口对主机可见,但发起它的容器无法访问。
目录卷:假设计划在"container-2"内运行"container-1",并尝试使用卷将"container-1"的目录共享到"container-2",这将无法工作。原因在于套接字共享——我们实际上不是从主容器共享目录,而是从主机共享目录。尽管这些挑战有解决方案,但往往复杂且繁琐。
这种方法虽然安全性较低(--privileged选项绕过了许多容器化安全特性),但能够在需要时创建一个内部带有Docker的新容器,有效解决网络和卷问题。现在可以将"container-1"的文件夹共享给由其创建的"container-2",并从"container-2"暴露可被"container-1"访问的端口。
但实际上有安全运行此容器的方法。可以使用https://github.com/nestybox/sysbox%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9D%A5%E5%AE%89%E5%85%A8%E5%9C%B0%E8%BF%90%E8%A1%8C%E6%AD%A4%E5%AE%B9%E5%99%A8%E3%80%82%E8%AF%A5%E8%BF%90%E8%A1%8C%E6%97%B6%E6%98%AF%E4%B8%80%E7%A7%8D%E5%AE%B9%E5%99%A8%E8%BF%90%E8%A1%8C%E6%97%B6%EF%BC%8C%E6%94%AF%E6%8C%81%E5%AE%89%E5%85%A8%E4%B8%94%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84Docker-in-Docker (DinD),是--privileged选项的理想替代方案。
您可以在使用指南部分查看如何不安全或安全地运行此容器。
测试或使用此镜像非常简单,有两种选择:
要使用此Docker-in-Docker镜像,运行以下命令:
bashdocker run -it --privileged cruizba/ubuntu-dind
如果需要systemd环境,也可以使用systemd-latest标签:
bashdocker run -d --name ubuntu-dind --privileged cruizba/ubuntu-dind:systemd-latest docker exec -it ubuntu-dind bash
此选项需要在系统中安装Sysbox。您可以查看https://github.com/nestybox/sysbox/blob/master/docs/user-guide/install-package.md%E4%BA%86%E8%A7%A3%E5%AE%89%E8%A3%85%E6%96%B9%E6%B3%95%EF%BC%88%E9%81%97%E6%86%BE%E7%9A%84%E6%98%AF%EF%BC%8C%E5%8C%85%E5%AE%89%E8%A3%85%E4%BB%85%E9%80%82%E7%94%A8%E4%BA%8E%E5%9F%BA%E4%BA%8Edebian%E7%9A%84%E5%8F%91%E8%A1%8C%E7%89%88%EF%BC%89%E3%80%82
要在更安全的环境中使用此Docker-in-Docker镜像,运行以下命令:
bashdocker run -it --runtime=sysbox-runc cruizba/ubuntu-dind
如果需要systemd环境,也可以使用systemd-latest标签:
bashdocker run -d --name ubuntu-dind --runtime=sysbox-runc cruizba/ubuntu-dind:systemd-latest docker exec -it ubuntu-dind bash
只需运行镜像即可获得干净的环境来测试您的Docker镜像:
bashdocker run -it --privileged cruizba/ubuntu-dind
bashdocker run -it --runtime=sysbox-runc cruizba/ubuntu-dind
这将在容器内启动一个root bash终端,您可以在其中运行docker命令。
可以直接运行命令来测试镜像:
bashdocker run -it --privileged cruizba/ubuntu-dind docker run hello-world
bashdocker run -it --runtime=sysbox-runc cruizba/ubuntu-dind docker run hello-world
您可以扩展此镜像以添加自己的工具和配置。下面创建一个示例,使用此镜像构建项目并测试,展示其扩展性和强大功能:
DockerfileFROM cruizba/ubuntu-dind:latest # 安装依赖 RUN apt-get update && apt-get install git -y COPY entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/entrypoint.sh
entrypoint.sh:
bash#!/bin/bash # 启动docker start-docker.sh # 此处添加你的命令 git clone https://github.com/cruizba/ubuntu-dind cd ubuntu-dind || exit 1 docker build . -f ubuntu-jammy.Dockerfile -t ubuntu-dind-test docker run --privileged ubuntu-dind-test docker run hello-world
此脚本将克隆此仓库、构建镜像并从中运行容器。
需要特别注意的是,在使用docker命令前需要运行start-docker.sh脚本,该脚本将启动容器内的docker守护进程。
您可以在examples文件夹中找到此示例。
[!NOTE] 对于systemd镜像,入口点脚本不同,且不需要
start-docker.sh脚本。要在systemd镜像中执行命令,需要docker exec进入容器并运行命令。
您可以在https://hub.docker.com/r/cruizba/ubuntu-dind%E6%89%BE%E5%88%B0%E5%8F%AF%E7%94%A8%E9%95%9C%E5%83%8F%E3%80%82%E4%B9%9F%E5%8F%AF%E4%BB%A5%E6%9F%A5%E7%9C%8BReleases%E9%83%A8%E5%88%86%E4%BA%86%E8%A7%A3%E5%8F%AF%E7%94%A8%E6%A0%87%E7%AD%BE%EF%BC%9Ahttps://github.com/cruizba/ubuntu-dind/releases
所有标签均以下列格式发布:
bash# 普通镜像 cruizba/ubuntu-dind:focal-<docker-version> cruizba/ubuntu-dind:jammy-<docker-version> cruizba/ubuntu-dind:noble-<docker-version> # Systemd镜像 cruizba/ubuntu-dind:focal-systemd-<docker-version> cruizba/ubuntu-dind:jammy-systemd-<docker-version> cruizba/ubuntu-dind:noble-systemd-<docker-version>
bash# 普通镜像 cruizba/ubuntu-dind:focal-<docker-version>-r<revision> cruizba/ubuntu-dind:jammy-<docker-version>-r<revision> cruizba/ubuntu-dind:noble-<docker-version>-r<revision> # Systemd镜像 cruizba/ubuntu-dind:focal-systemd-<docker-version>-r<revision> cruizba/ubuntu-dind:jammy-systemd-<docker-version>-r<revision> cruizba/ubuntu-dind:noble-systemd-<docker-version>-r<revision>
bash# 普通镜像 cruizba/ubuntu-dind:focal-latest cruizba/ubuntu-dind:jammy-latest cruizba/ubuntu-dind:noble-latest # Systemd镜像 cruizba/ubuntu-dind:focal-systemd-latest cruizba/ubuntu-dind:jammy-systemd-latest cruizba/ubuntu-dind:noble-systemd-latest
bash# 普通镜像 cruizba/ubuntu-dind:latest # Systemd镜像 cruizba/ubuntu-dind:systemd-latest
如果您喜欢我的工作,可以通过GitHub Sponsor支持我。非常感谢您的支持。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务