首页 文章

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

提问于
浏览
116

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

2 回答

  • 138

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

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

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

    • 它与Linux安全模块(LSM)不能很好地配合 .

    • 它在文件系统中创建不匹配,从而为在父容器内创建的容器创建问题 .

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

    [最简单的方法是将Docker套接字暴露给CI容器,方法是将它与-v标志绑定 . 简单地说,当你启动你的CI容器(Jenkins或其他),而不是与Docker-in-Docker一起黑客攻击时,启动它:docker run -v /var/run/docker.sock:/var/run/docker .sock ...
    现在这个容器可以访问Docker套接字,因此可以启动容器 . 除了不启动“子”容器,它将启动“兄弟”容器 .

  • 37

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

    在docker中运行docker绝对是可能的 . 主要的是你运行具有额外特权的外部容器(以--privileged = true开头),然后在该容器中安装docker . 查看此博客文章了解更多信息:Docker-in-Docker . 此条目中描述了一个可能的用例 . 该博客描述了如何在Jenkins docker容器中构建docker容器 . 但是,Docker里面的Docker并不是解决这类问题的推荐方法 . 相反,推荐的方法是创建“兄弟”容器,如本文所述

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

相关问题