在可能的情况下,应该避免在 Docker 容器内运行 Docker(即所谓的 dind)。(以下提供源代码。)相反,您希望设置一种方式,使您的主容器能够生成并与同级容器进行通信。
Jérôme Petazzoni - 使 Docker 可以在 Docker 容器内运行的功能的作者 - 实际上发布了一篇博客文章,不建议进行此操作。他描述的用例与 OP 的确切用例相匹配,都是需要在其他 Docker 容器中运行作业的 CI Docker 容器。
Petazzoni 列出了 dind 有问题的两个原因:
从那篇博客文章中,他描述了以下替代方案,
[The] simplest way is to just expose the Docker socket to your CI container, by bind-mounting it with the
-v
flag.Simply put, when you start your CI container (Jenkins or other), instead of hacking something together with Docker-in-Docker, start it with:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Now this container will have access to the Docker socket, and will therefore be able to start containers. Except that instead of starting "child" containers, it will start "sibling" containers.
sudo usermod -aG docker $USER
。之后您需要重新登录。 - predmijat/var/run/docker.sock
。 - Bruce Sun/var/run/docker.sock
。 - Abdelhafid我之前回答过一个类似的问题,关于如何在Docker内部运行另一个Docker容器。
要在Docker内运行Docker是完全可能的。主要是需要使用额外特权(从--privileged=true
开始)运行外部容器,然后在该容器中安装Docker。在 Docker 中运行 Docker-in-Docker(DinD)是可以的,事实上 Docker 公司为此提供了官方 DinD 镜像。
然而需要注意的是,这需要一个特权容器,根据您的安全需求可能不是可行的选择。
使用同级容器运行 Docker 的替代解决方案(也称为 Docker-out-of-Docker 或 DooD)不需要特权容器,但由于您从与其运行环境不同的上下文中启动容器(即您从容器内部启动容器,但它在主机层级而不是容器内部运行),因此具有一些缺点。
我写了一篇博客,介绍了 DinD 与 DooD 的优缺点这里。
话虽如此,Nestybox(我刚刚创立的初创公司)正在开发一种可以安全运行真正的 Docker-in-Docker 的解决方案(不使用特权容器)。您可以访问www.nestybox.com进行了解。
/var/run/docker.sock
作为卷连接到父容器中,它是Docker守护程序默认监听的地址,使用命令-v /var/run/docker.sock:/var/run/docker.sock
。有时,Docker守护程序的套接字可能存在权限问题,您可以通过写入sudo chmod 757 /var/run/docker.sock
来解决。sudo chmod 757 /var/run/docker.sock
docker run --privileged=true -v /var/run/docker.sock:/var/run/docker.sock -it ...
dock run --runtime=sysbox-runc -it any_image
如果您认为这就是您正在寻找的内容,您可以在他们的Github上了解更多信息: https://github.com/nestybox/sysbox
快速链接到有关如何部署简单的sysbox运行时环境容器的说明:https://github.com/nestybox/sysbox/blob/master/docs/quickstart/README.md