Docker in Docker

前言

Docker in Docker,简称 dind,是一种在 docker 容器里面运行 docker 的方法,docker 官方镜像里面自己是有支持的,只不过 docker 现在的镜像是基于 Alpine Linux 的,我不太习惯,所以自己基于 ubuntu 20.04 做了一个 dind 镜像

重要

dind 方式运行容器的时候一定要加参数 --privileged,不然后台 docker 服务起不来

制作流程

运行 ubuntu:20.04 容器

docker pull ubuntu:20.04
docker run -itd --name ubuntu ubuntu:20.04 bash
docker exec -it ubuntu bash

容器内安装软件和配置

apt update
apt install docker.io systemd -y
# 安装完后确认一下是否已经安装 systemd,并确保/sbin/init为systemd的软链接
# ubuntu的docker.io只能通过systemd启动

修改配置

因为第一层容器已经需要运行在 docker 下了,它的文件系统一般是不支持继续运行 docker 的

使用 fuse-overlayfs

fuse-overlayfs 支持所有的 backing filesystem

安装 fuse-overlayfs

apt install fuse-overlayfs

修改配置文件

/etc/docker/daemon.json 文件内容

{
    "storage-driver": "fuse-overlayfs"
}

使用 VFS

VFS 也支持所有的 backing filesystem,但是 VFS 文件系统是一层一层全量叠上去,很浪费空间

/etc/docker/daemon.json 文件内容

{
    "storage-driver": "vfs"
}

使用匿名卷

在 Dockerfile 中加入以下

VOLUME ["/var/lib/docker"]

commit

docker commit ubuntu ubuntu-20.04-dind:0.0.0

build

Dockerfile

FROM ubuntu-20.04-dind:0.0.0
WORKDIR /root
# 启动systemd,这个是systemd的软链接
ENTRYPOINT ["/sbin/init"]

build

docker build -t ubuntu-20.04-dind:0.0.1

上传到服务器

这里以华为云为例,点击生成临时登录指令,在终端运行

01

docker tag ubuntu-20.04-dind:0.0.1 swr.cn-east-3.myhuaweicloud.com/zcteo/ubuntu-20.04-dind:0.0.1
docker push swr.cn-east-3.myhuaweicloud.com/zcteo/ubuntu-20.04-dind:0.0.1

下载地址

目前是 VFS 形式的

阿里云

docker pull registry.cn-chengdu.aliyuncs.com/zcteo/ubuntu-20.04-dind

华为云

docker pull swr.cn-east-3.myhuaweicloud.com/zcteo/ubuntu-20.04-dind