Docker容器中运行docker命令

问题

在使用 docker 部署程序的时候,经常需要用到 docker 命令,但是容器内部默认是无法使用 docker 命令的。

解决方案

方法一:
示例:

1
2
3
4
5
docker run --privileged \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /mnt/vpn-data:/mnt/vpn-data \
-d demo:v1

使用 --privileged ,挂载 docker.sock 以及 /usr/bin/docker

此方法安全性较差。

方法二:
A、使用 docker in docker 镜像,不过仍需要挂载 -v /var/run/docker.sock:/var/run/docker.sock

命令: docker run -itd -v /var/run/docker.sock:/var/run/docker.sock --name=docker-cmd --privileged docker

B、使用 dind 标签的docker in docker 镜像,采用--privileged方式,此时操作将在 容器内部进行,不会涉及docker宿主机,不需要挂载 docker.sock;该镜像有完整的docker命令。
注意点: 使用dind作为基础镜像打包程序时可能出现无法运行docker命令问题,进入容器后可以先运行: dockerd & ,之后就可正常使用;

C、使用 dind 标签的docker in docker 镜像,采用Sysbox Runtime(需要另行安装),不需要privileged权限,更安全,但资源配置有要求。
https://github.com/nestybox/sysbox#installing-sysbox

命令示例: docker run --runtime=sysbox-runc --name sysbox-dind -d docker:dind

参考:https://devopscube.com/run-docker-in-docker/

此方法安全性较好,隔离性比较高。