如何 docker in docker?

docker run -it \
           --rm \
           --name docker_test \
           --user root \
           -v /var/run/docker.sock:/var/run/docker.sock \
           -v /usr/bin/docker:/usr/bin/docker \
           busybox:latest /bin/sh

在容器的控制台下,执行 docker --version,提示 /bin/sh: docker: not found,请问如何解决?

两个本地路径(/var/run/docker.sock 和 /usr/bin/docker),都检查过了,都存在。

贴个图补充一下吧:


dind 问题已经解决,见 git@github.com:wangding/docker-demo.git 仓库的 07-ci 分支。

gogs/gogs docker 提供的 git web 服务,配置了 webhook,当向仓库推送代码的时候 webhook 推送失败,请求和响应都是 N/A,正常应该是 http 请求头和 http 响应头。截图如下:

阅读 3.3k
2 个回答

指定完全路径:

/usr/bin/docker --version

检查 /usr/bin 是否在环境变量 PATH 里:

echo $PATH

如果不存在,可以添加以下:

echo "export PATH=\$PATH:/usr/bin" >> /etc/profile
source /etc/profile

然后重新试下:

docker --version

UPD:

Ok,我刚查阅了一些资料,也自己尝试了一下,确实不行,甚至在 alpine 里面也是不可以执行 docker 的(alpine 是基于 busybox + musl 的一个 linux 发行版),因为 busybox 里缺少 docker 依赖的一些动态库,如果换成用 centos:7 镜像,是可以的:

docker run -it \
           --rm \
           --name docker_test \
           --user root \
           -v /var/run/docker.sock:/var/run/docker.sock \
           -v /usr/bin/docker:/usr/bin/docker \
           centos:7 /bin/sh
           
# inside container
$ docker --version
Docker version 20.10.7, build f0df350

docker in docker(dind)是docker目前支持的一种特殊技术。简单来说,你要运行的镜像是docker,而不是busybox挂在宿主机的docker可执行程序。

容器中的docker必须要有宿主机的内核权限,因此你还必须加上--privileged参数运行。具体的说明你看dind的文档说明部分吧: https://hub.docker.com/_/docker

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题