从docker内部运行docker可以吗?


184

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


11
另一种可能性是将主机上的Docker套接字作为卷安装在容器中。这样就可以创建“同级”容器,并具有能够重用缓存的优点。
Adrian Mouat 2015年

4
我发现从主机使用docker套接字时,如果要挂载外部卷,则必须设置相对于主机的卷路径,因为这是docker守护程序运行的地方。除非路径重合,否则相对于启动容器的容器进行设置不一定有效。
雅各布·朗格

Answers:


224

如果可能,应尽可能避免在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套接字,因此将能够启动容器。除了代替启动“子”容器之外,它将启动“同级”容器。


1
如何在没有sudo这样做的情况下运行docker命令?谢谢
c4k

3
您需要将用户添加到docker组:中sudo usermod -aG docker $USER。之后,您需要重新登录。
predmijat

2
如何在硬币容器内重新记录?
thiagowfx

1
@AlexanderMills这是相同的,因为/var/run/docker.sock当您在macOS机器上为Mac运行docker时,您的docker套接字也位于此位置。
布鲁斯·孙

1
窗户呢?我没有/var/run/docker.sock
Abdelhafid

54

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

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

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

此条目中描述了一个可能的用例。该博客介绍了如何在Jenkins Docker容器中构建Docker容器。

但是,在Docker内部使用Docker并不是解决此类问题的推荐方法。取而代之的是,推荐的方法是创建“兄弟”容器中,作为在这个职位描述

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


请参阅以下有关在docker中避免docker的评论。
Dan Poltawski

6

可以运行Docker-in-Docker(DinD),实际上Docker(该公司)对此具有正式的DinD映像

需要注意的是,它需要一个特权容器,根据您的安全需要,这可能不是一个可行的选择。

使用同级容器(又名Docker-out-of-Docker或DooD)运行Docker的替代解决方案不需要特权容器,但是存在一些缺点,这是因为您是从以下环境中启动容器的:与运行该容器的容器不同(即,您是从容器内部启动容器的,但是它是在主机级别而不是容器内部运行的)。

我写的描述DIND的优点/缺点VS杜德一个博客在这里

话虽如此,Nestybox(我刚刚成立的一家初创公司)正在研究一种可以安全地运行真正的Docker-in-Docker(不使用特权容器)的解决方案。您可以在www.nestybox.com上进行检查。


0

是的,我们可以在docker中运行docker,我们需要将unix sockeet“ /var/run/docker.sock”附加到docker守护程序默认使用“ -v / var / run”作为父监听器的卷上。 /docker.sock:/var/run/docker.sock”。有时,泊坞窗守护程序套接字可能会出现权限问题,您可以为其编写“ sudo chmod 757 /var/run/docker.sock”。

并且还需要以特权模式运行docker,因此命令为:

须藤chmod 757 /var/run/docker.sock

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.