jenkins 是否可以从docker内部运行docker?

7eumitmz  于 2022-11-21  发布在  Jenkins
关注(0)|答案(5)|浏览(241)

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

mbjcgjjk

mbjcgjjk1#

在Docker(a.k.a. dind)中运行Docker,虽然是可能的,但应该尽可能避免。(下面提供了源代码。)相反,您希望设置一种方法,使主容器能够生成 * 兄弟 * 容器并与之通信。
Jérôme Petazzoni-使Docker能够在Docker容器内运行的特性的作者-实际上编写了a blog post saying not to do it。他描述的用例与OP的CI Docker容器的用例完全匹配,该CI Docker容器需要在其他Docker容器内运行作业。
Petazzoni列出了dind麻烦的两个原因:
1.它不能很好地与Linux安全模块(LSM)协作。
1.它会在文件系统中造成不匹配,从而导致在父容器内创建的容器出现问题。
在那篇博文中,他描述了以下替代方案,
[The]最简单的方法是通过使用-v标志绑定挂载Docker套接字,将其公开给CI容器。
简单地说,当您启动CI容器(Jenkins或其他)时,不要使用Docker-in-Docker一起进行黑客攻击,而是使用以下命令启动它:

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

现在,这个容器将可以访问Docker套接字,并因此能够启动容器。只是它将启动“兄弟”容器,而不是“子”容器。

iswrvxsc

iswrvxsc2#

我 以前 回答 过 一 个 类似 的 问题 , 关于 如何 在 Docker 中 运行 Docker 容器 。
在 docker 内部 运行 docker 是 完全 可能 的 , 主要 的 是 你 用 额外 的 特权 ( 从 --privileged=true 开始 ) run 外部 容器 , 然后 在 那个 容器 中 安装 docker 。
查看 此 博客 文章 以 了解 更多 信息 :Docker-in-Docker 的 最 大 值 。
this entry 中 描述 了 一 个 可能 的 用例 , 该 博客 描述 了 如何 在 Jenkins Docker 容器 中 构建 Docker 容器 。
但是 , Docker 内部 的 Docker 并 不是 解决 这 类 问题 的 推荐 方法 。
因此 , 在 Docker 中 运行 Docker 被 许多 人 认为 是 解决 这 类 问题 的 一 种 好 方法 。 现在 , 趋势 是 使用 " 兄弟 " 容器 来 代替 。 更多 信息 请 参见 the answer by @predmijat on this page

pprl5pva

pprl5pva3#

运行Docker-in-Docker(DinD)是可以的,事实上Docker(公司)有一个official DinD image
但是,需要注意的是,它需要一个特权容器,根据您的安全需要,这可能不是一个可行的替代方案。
使用同级容器运行Docker的替代解决方案(也称为Docker-out-of-Docker或DooD)不需要特权容器,但有一些缺点,这些缺点源于这样一个事实,即您是在与运行该容器的上下文不同的上下文中启动该容器的(也就是说,您从容器中启动容器,但它是在主机级别运行的,而不是在容器中)。
我写了一篇博客,描述了DinD与DooD here的优缺点。
话虽如此,Nestybox(我刚刚成立的一家初创公司)正在开发一个解决方案,它可以安全地运行真正的Docker-in-Docker(不使用特权容器)。

yzckvree

yzckvree4#

是的,我们可以在docker中运行docker,我们需要使用-v /var/run/docker.sock:/var/run/docker.sock将docker守护进程默认监听的unix套接字/var/run/docker.sock作为卷连接到父docker。有时,您可以为其写入sudo chmod 757 /var/run/docker.sock的docker守护进程套接字可能会出现权限问题。
此外,还需要在特权模式下运行Docker,因此命令如下:

sudo chmod 757 /var/run/docker.sock

docker run --privileged=true -v /var/run/docker.sock:/var/run/docker.sock -it ...
hfwmuf9z

hfwmuf9z5#

过去的几天里,我一直在尽最大努力在容器中运行容器,就像你一样。浪费了很多时间。到目前为止,大多数人都建议我做一些事情,比如使用Docker的DIND映像,这不适用于我的情况,因为我需要主容器是Ubuntu操作系统,或者运行一些特权命令并将守护进程套接字Map到容器中。(这对我从来都不起作用)
我找到的解决方案是在我的Ubuntu 20.04系统上使用Nestybox,它运行得最好。它的执行也非常简单,只要你的本地系统是Ubuntu(他们最支持),因为容器运行时是专门为这样的应用程序设计的。它也有最灵活的选项。免费版的NestyBox可能是截至2022年11月的最佳方法。强烈建议你不要去尝试其他人建议的繁琐的设置。他们有很多预先构建的解决方案,可以用一个简单的命令行来解决这些特定的需求。
Nestybox为新创建的Docker容器提供特殊的运行时环境,他们还提供了一些内置了docker和systemd的ubuntu/common操作系统镜像。他们的目标是让主容器的功能和虚拟机的功能完全一样。你也可以通过ssh进入你的ubuntu主容器,而不需要访问主容器中的任何东西。从你的主容器你可以像一个普通的本地系统一样创建各种容器。这个systemd对你在容器中方便地设置docker是非常重要的。
执行sysbox的一个简单通用命令:

dock run --runtime=sysbox-runc -it any_image

如果你认为这就是你正在寻找的,你可以在他们的github找到更多:https://github.com/nestybox/sysbox
有关如何部署简单的sysbox运行时环境容器的说明的快速链接:https://github.com/nestybox/sysbox/blob/master/docs/quickstart/README.md

相关问题