一、 背景介绍
有时候,我们需要在容器内执行 docker 命令,比如:在 jenkins 容器内运行 docker 命令执行构建镜像
直接在 docker 容器内嵌套安装 docker 未免太过臃肿
更好的办法是:容器内仅部署 docker 命令行工具(作为客户端),实际执行交由宿主机内的 docker-engine(服务器)
二、 实现示例
2.1 编写 Dockerfile
FROM ubuntu:14.04
MAINTAINER shida <qiushida@ctsi.com.cn>
RUN apt-get update
RUN sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
RUN apt-get update
RUN apt-get install docker-ce -y
2.2 构建镜像
# cd <Dockerfile所在路径>
# docker build -t dockerindocker:1.0 .
2.3 测试镜像
关键点是:将宿主机 docker.sock 文件挂载到容器,实现容器内 docker 操作宿主机 docker 的目的
# docker run -it -v /var/run/docker.sock:/var/run/docker.sock dockerindocker:1.0 /bin/bash
容器内实际并未运行 docker server,但是能够通过宿主机完成 docker 构建任务
从而实现 轻量级 docker in docker
====================
Update 2018-04-17
====================
三、 新版实现
后来发现,其实容器内完全可以不安装 Docker 程序,直接挂载宿主机的 /usr/bin/docker 就可以了,
我们只需要安装 Docker 执行需要的库文件即可
更新 Dockerfile
FROM ubuntu:14.04
MAINTAINER shida <qiushida@ctsi.com.cn>
RUN apt-get update && apt-get install -y libltdl7
运行命令
# docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker dockerindocker:1.0 /bin/bash