作者:手机用户2502937805 | 来源:互联网 | 2023-05-27 14:01
我在Docker容器中运行Jenkins.我想知道Jenkins容器是否也可以成为Docker主机?我正在考虑的是从Jenkins内部为每个集成测试构建启动一个新的docker容器(以启动数据库,消息代理等).因此,在完成集成测试后应关闭容器.有没有理由避免以这种方式从另一个docker容器内运行docker容器?
1> predmijat..:
如果可能的话,应尽可能避免在Docker(也称为dind)内运行Docker .(下面提供了源代码.)相反,您希望为主容器设置一种生成兄弟容器并与之通信的方法.
JérômePetazzoni - 使Docker可以在Docker容器内运行的功能的作者 - 实际上写了一篇博文,说不要这么做.他描述的用例匹配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套接字,因此可以启动容器.除了不启动"子"容器,它将启动"兄弟"容器.
您需要将用户添加到docker组:sudo usermod -aG docker $ USER。之后,您需要重新登录。
如何在硬币容器内重新记录?
2> wassgren..:
关于如何在Docker中运行Docker容器,我之前回答了类似的问题.
在docker里面运行docker肯定是可能的.主要的是你run
有外部容器的额外权限(从开始--privileged=true
)然后在该容器中安装docker.
查看此博客文章了解更多信息:Docker-in-Docker.
其中一个潜在的使用案例中描述该条目.该博客描述了如何在Jenkins docker容器中构建docker容器.
但是,Docker里面的Docker并不是解决这类问题的推荐方法.相反,推荐的方法是创建"兄弟"容器,如本文所述
因此,在Docker中运行Docker被认为是解决此类问题的一种很好的解决方案.现在,趋势是使用"兄弟"容器代替.有关详细信息,请参阅此页面上@predmijat的答案.