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

时间:2015-01-10 18:29:54

标签: jenkins docker docker-dind

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

4 个答案:

答案 0 :(得分:150)

如果可能的话,应该尽可能避免在Docker中运行Docker(a.k.a。 dind )。 (下面提供了源代码。)相反,您希望为主容器设置一种方法来生成同级容器并与之通信。

Jérôme Petazzoni - 使Docker可以在Docker容器内运行的功能的作者 - 实际上写了a blog post saying not to do it。他描述的用例匹配OP的CI Docker容器的确切用例,该容器需要在其他Docker容器中运行作业。

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

  1. 它与Linux安全模块(LSM)不能很好地配合。
  2. 它会在文件系统中造成不匹配,从而为在父容器中创建的容器带来问题。
  3. 从博客文章中,他描述了以下替代方案,

      

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

         

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

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

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

答案 1 :(得分:41)

我之前在how to run a Docker container inside Docker上回答了类似的问题。

  

在docker里面运行docker绝对是可能的。主要的是你run外部容器extra privileges(从--privileged=true开始)然后在该容器中安装docker。

     

查看此博文以获取更多信息:Docker-in-Docker

     

this entry中描述了一个可能的用例。该博客描述了如何在Jenkins docker容器中构建docker容器。

     

然而,Docker里面的Docker并不是解决这类问题的推荐方法。相反,建议的方法是将“兄弟”容器创建为described in this post

因此,在Docker中运行Docker被认为是解决此类问题的一种很好的解决方案。现在,趋势是使用“兄弟”容器代替。有关详细信息,请参阅the answer by @predmijat on this page

答案 2 :(得分:1)

是的,我们可以在docker中运行docker,我们需要将unix sockeet“ /var/run/docker.sock”附加到docker守护进程默认使用“ -v /”作为默认监听的父docker上。 var / run / docker.sock:/var/run/docker.sock”。 有时,泊坞窗守护程序套接字可能会出现权限问题,您可以为其编写“ 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 ...

答案 3 :(得分:0)

可以运行Docker-in-Docker(DinD),实际上Docker(该公司)为此拥有official DinD image

但是需要注意的是,它需要一个特权容器,根据您的安全需要,它可能不是可行的选择。

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

我写了一个博客,描述了DinD vs DooD here的优缺点。

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