从 docker 内部运行 docker 可以吗?

新手上路,请多包涵

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

原文由 Johan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 683
3 个回答

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

Jérôme Petazzoni—— 使 Docker 可以在 Docker 容器内运行的特性的作者——实际上写 了一篇博文说不要这样做。他描述的用例与 OP 的 CI Docker 容器的确切用例相匹配,该容器需要在其他 Docker 容器中运行作业。

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

  1. 它不能很好地与 Linux 安全模块 (LSM) 配合使用。
  2. 它会在文件系统中造成不匹配,从而给在父容器中创建的容器带来问题。

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

[最简单的方法是通过 -v 标志将 Docker 套接字公开给 CI 容器。

简而言之,当您启动 CI 容器(Jenkins 或其他)时,不要使用 Docker-in-Docker 来破解某些东西,而是从以下内容开始:

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

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

原文由 predmijat 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

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

因此,在 Docker 中运行 Docker 被许多人认为是解决此类问题的一种很好的解决方案。现在,趋势是改用“兄弟”容器。有关更多信息,请参阅 此页面上@predmijat 的答案

原文由 wassgren 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题