Joh*_*han 156 jenkins docker docker-dind
我在Docker容器中运行Jenkins.我想知道Jenkins容器是否也可以成为Docker主机?我正在考虑的是从Jenkins内部为每个集成测试构建启动一个新的docker容器(以启动数据库,消息代理等).因此,在完成集成测试后应关闭容器.有没有理由避免以这种方式从另一个docker容器内运行docker容器?
pre*_*jat 187
如果可能的话,应尽可能避免在Docker(也称为dind)内运行Docker .(下面提供了源代码.)相反,您希望为主容器设置一种生成兄弟容器并与之通信的方法.
JérômePetazzoni - 使Docker可以在Docker容器内运行的功能的作者 - 实际上写了一篇博文,说不要这么做.他描述的用例匹配OP的CI Docker容器的确切用例,该容器需要在其他Docker容器中运行作业.
Petazzoni列出了dind麻烦的两个原因:
从该博客文章中,他描述了以下替代方案,
[最简单的方法是将Docker套接字暴露给CI容器,方法是将其与
-v标志绑定挂钩.简单地说,当您启动CI容器(Jenkins或其他)时,不要与Docker-in-Docker一起攻击某些东西,而是启动它:
Run Code Online (Sandbox Code Playgroud)docker run -v /var/run/docker.sock:/var/run/docker.sock ...现在这个容器可以访问Docker套接字,因此可以启动容器.除了不启动"子"容器,它将启动"兄弟"容器.
was*_*ren 48
关于如何在Docker中运行Docker容器,我之前回答了类似的问题.
在docker里面运行docker肯定是可能的.主要的是你
run有外部容器的额外权限(从开始--privileged=true)然后在该容器中安装docker.查看此博客文章了解更多信息:Docker-in-Docker.
其中一个潜在的使用案例中描述该条目.该博客描述了如何在Jenkins docker容器中构建docker容器.
但是,Docker里面的Docker并不是解决这类问题的推荐方法.相反,推荐的方法是创建"兄弟"容器,如本文所述
因此,在Docker中运行Docker被认为是解决此类问题的一种很好的解决方案.现在,趋势是使用"兄弟"容器代替.有关详细信息,请参阅此页面上@predmijat的答案.
cta*_*edo 11
运行 Docker-in-Docker (DinD) 是可以的,事实上 Docker(公司)有一个官方的 DinD 镜像。
然而需要注意的是,它需要一个特权容器,这取决于您的安全需求可能不是一个可行的替代方案。
使用兄弟容器(又名 Docker-out-of-Docker 或 DooD)运行 Docker 的替代解决方案不需要特权容器,但有一些缺点,因为您是从上下文中启动容器不同于它在其中运行的那个(即,您从容器内启动容器,但它在主机级别运行,而不是在容器内运行)。
我写的描述DIND的优点/缺点VS杜德一个博客在这里。
话虽如此,Nestybox(我刚刚创立的一家初创公司)正在开发一种解决方案,该解决方案可以安全地运行真正的 Docker-in-Docker(不使用特权容器)。您可以在www.nestybox.com 上查看。
小智 10
是的,我们可以在 docker 中运行 docker,我们需要将/var/run/docker.sockdocker 守护进程默认侦听的 unix 套接字作为卷附加到父 docker,使用-v /var/run/docker.sock:/var/run/docker.sock. 有时,您可以为其编写的 docker 守护进程套接字可能会出现权限问题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 ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
71503 次 |
| 最近记录: |