从docker里面运行docker是否可以?

Joh*_*han 156 jenkins docker docker-dind

我在Docker容器中运行Jenkins.我想知道Jenkins容器是否也可以成为Docker主机?我正在考虑的是从Jenkins内部为每个集成测试构建启动一个新的docker容器(以启动数据库,消息代理等).因此,在完成集成测试后应关闭容器.有没有理由避免以这种方式从另一个docker容器内运行docker容器?

pre*_*jat 187

如果可能的话,应尽可能避免在Docker(也称为dind)内运行Docker .(下面提供了源代码.)相反,您希望为主容器设置一种生成兄弟容器并与之通信的方法.

JérômePetazzoni - 使Docker可以在Docker容器内运行的功能的作者 - 实际上写了一篇博文,说不要这么做.他描述的用例匹配OP的CI Docker容器的确切用例,该容器需要在其他Docker容器中运行作业.

Petazzoni列出了dind麻烦的两个原因:

  1. 它与Linux安全模块(LSM)不能很好地配合.
  2. 它在文件系统中创建不匹配,从而为在父容器内创建的容器创建问题.

从该博客文章中,他描述了以下替代方案,

[最简单的方法是将Docker套接字暴露给CI容器,方法是将其与-v标志绑定挂钩.

简单地说,当您启动CI容器(Jenkins或其他)时,不要与Docker-in-Docker一起攻击某些东西,而是启动它:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Run Code Online (Sandbox Code Playgroud)

现在这个容器可以访问Docker套接字,因此可以启动容器.除了不启动"子"容器,它将启动"兄弟"容器.

  • [Jérôme Petazzoni](https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/) 改变了他的观点 (2020),因为有像这样的新工具[sysbox](https://github.com/nestybox/sysbox) 使其更加方便。他更新了答案中链接的博客文章反映了这一点。 (7认同)
  • 您需要将用户添加到docker组:sudo usermod -aG docker $ USER。之后,您需要重新登录。 (3认同)
  • 如何在硬币容器内重新记录? (2认同)
  • 窗户呢?我没有`/var/run/docker.sock` (2认同)

was*_*ren 48

关于如何在Docker中运行Docker容器,我之前回答了类似的问题.

在docker里面运行docker肯定是可能的.主要的是你run有外部容器的额外权限(从开始--privileged=true)然后在该容器中安装docker.

查看此博客文章了解更多信息:Docker-in-Docker.

其中一个潜在的使用案例中描述该条目.该博客描述了如何在Jenkins docker容器中构建docker容器.

但是,Docker里面的Docker并不是解决这类问题的推荐方法.相反,推荐的方法是创建"兄弟"容器,如本文所述

因此,在Docker中运行Docker被认为是解决此类问题的一种很好的解决方案.现在,趋势是使用"兄弟"容器代替.有关详细信息,请参阅此页面上@predmijat的答案.


cta*_*edo 11

运行 Docker-in-Docker (DinD) 是可以的,事实上 Docker(公司)有一个官方的 DinD 镜像

然而需要注意的是,它需要一个特权容器,这取决于您的安全需求可能不是一个可行的替代方案。

使用兄弟容器(又名 Docker-out-of-Docker 或 DooD)运行 Docker 的替代解决方案不需要特权容器,但有一些缺点,因为您是从上下文中启动容器不同于它在其中运行的那个(即,您从容器内启动容器,但它在主机级别运行,而不是在容器内运行)。

我写的描述DIND的优点/缺点VS杜德一个博客在这里

话虽如此,Nestybox(我刚刚创立的一家初创公司)正在开发一种解决方案,该解决方案可以安全地运行真正的 Docker-in-Docker(不使用特权容器)。您可以在www.nestybox.com 上查看


小智 10

是的,我们可以在 docker 中运行 docker,我们需要将/var/run/docker.sockdocker 守护进程默认侦听的 unix 套接字作为卷附加到父 docker,使用-v /var/run/docker.sock:/var/run/docker.sock. 有时,您可以为其编写的 docker 守护进程套接字可能会出现权限问题sudo chmod 757 /var/run/docker.sock

并且还需要在特权模式下运行 docker,因此命令为:

sudo chmod 757 /var/run/docker.sock

docker run --privileged=true -v /var/run/docker.sock:/var/run/docker.sock -it ...
Run Code Online (Sandbox Code Playgroud)

  • @Proximo你必须将它安装在容器内。 (3认同)