在docker里面运行docker可以吗?

我在Docker容器中运行Jenkins。 我不知道Jenkins容器是否也是Docker主机? 我在想的是从Jenkins内部为每个集成testing版本启动一个新的Docker容器(以启动数据库,消息代理等)。 集成testing完成后,容器应该closures。 有没有这样的理由,以避免从另一个docker集装箱内运行docker集装箱?

如果可能,应尽可能避免在Docker(又名dind )中运行Docker。 (下面提供的源代码。)相反,你想要为你的主容器设置一个方法来产生和与兄弟容器进行通信。

JérômePetazzoni – 这个特性的作者,使得Docker能够在Docker容器中运行 – 实际上写了一篇博客文章说不要这样做 。 他描述的用例与OP需要在其他Docker容器中运行作业的CI Docker容器的确切用例相匹配。

Petazzoni列出了为什么后者很麻烦的两个原因:

  1. 它与Linux安全模块(LSM)不协调。
  2. 它在文件系统中创build了一个不匹配的问题,导致父容器中创build的容器出现问题。

从那篇博文中,他介绍了下面的替代scheme,

最简单的方法就是将Docker套接字暴露给你的CI容器,通过用-v标志绑定它。

简单地说,当你启动你的CI容器(Jenkins或者其他)时,不要用Docker-in-Docker把一些东西一起篡改,你可以这样做:

 docker run -v /var/run/docker.sock:/var/run/docker.sock ... 

现在这个容器将有权访问Docker套接字,因此将能够启动容器。 除了启动“子”容器,它将启动“兄弟”容器。

我之前就如何在Docker中运行Docker容器回答了类似的问题。

在docker里面运行docker是绝对有可能的。 主要的是你run外部容器的额外特权 (以--privileged=true ),然后在该容器中安装--privileged=true

请查看此博客post了解更多信息: Docker-in-Docker 。

这个条目描述了一个潜在的用例。 博客描述了如何在Jenkinsdocker集装箱内build立docker集装箱。

但是Docker里面的Docker并不是解决这类问题的推荐方法。 相反,推荐的方法是创build本文所述的“兄弟”容器

所以,在Docker中运行Docker被很多人认为是解决这类问题的好方法。 现在,趋势是使用“兄弟”容器来代替。 请参阅本页上@predmijat的答案以获取更多信息。

Interesting Posts