一尘不染

从docker内部运行docker可以吗?

docker

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


阅读 452

收藏
2020-06-17

共1个答案

一尘不染

如果可能,应尽可能避免在Docker内部运行Docker(aka dind )。(下面提供了源。)相反,您想为主容器建立一种方式来产生 同级
容器并与之进行通信。

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

佩塔佐尼列举了导致麻烦的两个原因:

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

他在该博客文章中介绍了以下替代方案,

[最简单的方法是通过将Docker套接字与-v标志绑定安装,从而将Docker套接字公开给您的CI容器。

简而言之,当您启动CI容器(Jenkins或其他)时,不要与Docker-in-Docker一起入侵某些东西,而应使用:

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

现在,此容器将可以访问Docker套接字,因此将能够启动容器。除了代替启动“子”容器之外,它将启动“同级”容器。

2020-06-17