首页 > 解决方案 > docker 容器可以在其他 docker 容器中运行吗?

问题描述

我将 jupyterhub 与 docker spawner 一起使用,第二个所做的是,当用户进入 jupyterhub 时,它会为他运行 docker 容器。我现在想对 jupyterhub 进行竞争,并使用这样的东西:https : //hub.docker.com/r/jupyterhub/jupyterhub/ 但我的问题是(我是新手)如果 jupyterhub 在容器内运行并且它产生用户容器,这个容器是在第一个容器内运行,还是在我的计算机上与它分开运行?

标签: dockerjupyterhub

解决方案


是的,这是可能的,通常被称为 docker in docker 或 short dind 并且不推荐(即使是 Jérôme Petazzoni 贡献了补丁以使其成为可能。您可以在他的博客文章中找到更长的解释。)

但是,如果您只想能够从主机上的另一个容器中构建和运行 docker 容器,则可以使您的容器“支持 docker”:

对于支持 docker 的容器,它通常只需要两件事(将要使用 docker 的容器,在您的情况下是 jupyterhub 容器):

  1. docker socket 必须安装在容器中(例如docker run /var/run/docker.sock:/var/run/docker.sock -v <image>:)
  2. docker-cli(docker 客户端)必须安装在 docker 容器中

请注意,支持 docker 的容器没有自己的 docker 守护进程。它将能够使用主机 docker 守护进程,这意味着在您的支持 docker 的容器内不会有另一个“docker 层”,并且任何 docker 容器(从主机和支持 docker 的容器开始)在相同的上下文中运行你主持。

这意味着您不会获得任何额外的隔离,并且可能会令人困惑,尤其是在您使用主机安装时。考虑这个例子:

  1. 您的主机上有 /data 文件夹,其中包含文件 test1.txt 和 test2.txt
  2. 容器 A 是一个支持 docker 的容器,具有文件夹 /data 和文件 test3.txt 和 test4.txt(容器 A 没有任何主机安装卷)
  3. docker run --name B -v /data:/data debian:stretch ls /data从容器 A 中执行 --> 在您的主机上启动一个新的容器 B,通过容器 A 启动 --> 输出将是test1.txt test2.txt因为它仍将在您的主机上下文中运行,并且主机挂载始终引用您的主机文件系统。

另请注意,即使没有使用 --privileged 运行支持 docker 的容器,也可以访问安装了 docker 套接字的容器,从而使该容器中 docker 组中的任何用户都可以访问您的主机。(只有真正的dind才需要)


推荐阅读