Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker容器可以在其他docker容器中运行吗?_Docker_Jupyterhub - Fatal编程技术网

docker容器可以在其他docker容器中运行吗?

docker容器可以在其他docker容器中运行吗?,docker,jupyterhub,Docker,Jupyterhub,我在docker spawner中使用jupyterhub,第二种方法是,当用户进入jupyterhub时,它为他运行docker容器。我现在想将jupyterhub内容化,并使用类似的东西:但我的问题是(我是新手)如果jupyterhub在容器中运行并且它生成用户容器,那么这个容器是在第一个容器中运行,还是在我的计算机上单独运行?是的。您需要使用特权模式创建容器,并共享docker套接字。除此之外,您还需要在实际图像中提供docker客户端: docker run -ti --privileg

我在docker spawner中使用jupyterhub,第二种方法是,当用户进入jupyterhub时,它为他运行docker容器。我现在想将jupyterhub内容化,并使用类似的东西:但我的问题是(我是新手)如果jupyterhub在容器中运行并且它生成用户容器,那么这个容器是在第一个容器中运行,还是在我的计算机上单独运行?

是的。您需要使用特权模式创建容器,并共享docker套接字。除此之外,您还需要在实际图像中提供docker客户端:

docker run -ti --privileged -v /var/run/docker.sock:/var/run/docker.sock <your image>
docker-run-ti--privileged-v/var/run/docker.sock:/var/run/docker.sock

参考资料:

是的,这是可能的,通常称为docker中的docker或short dind,不推荐使用(即使是Jérôme Petazzoni贡献了补丁使之成为可能。您可以在中找到更详细的解释。)

但是,如果您只是希望能够从主机上的另一个容器中构建和运行docker容器,则可以将容器设置为“具有docker功能”:

支持docker的容器通常只需要两样东西(docker将从中使用的容器,在您的例子中是jupyterhub容器):

  • docker套接字必须安装在容器中(例如:
    docker run/var/run/docker.sock:/var/run/docker.sock-v
  • docker cli(docker客户端)必须安装在docker容器中
  • 请注意,支持docker的容器没有自己的docker守护程序。它只能够使用主机docker守护程序,这意味着在支持docker的容器和任何docker容器(从主机和支持docker的容器开始)内不会有另一个“docker层”在主机的同一上下文中运行

    这意味着您将无法获得任何额外的隔离,尤其是当您使用主机装载时,这可能会令人困惑。考虑这个例子:

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

  • 还要注意的是,通过访问已安装docker套接字的容器,即使不使用--privileged运行支持docker的容器,该容器中docker组的任何用户都可以以根用户身份访问主机。(这仅适用于真正的dind)

    运行
    --privileged
    显式允许容器转义,这会破坏容器的安全性,因此不要在生产中这样做。使用主机的Docker后台程序不需要
    --privileged
    ;但是如果你可以使用主机的Docker守护进程,那么接管整个主机就很容易了。我习惯于“Docker in Docker”,字面意思是在Docker内部运行Docker–在容器内启动第二个Docker守护进程。我偶尔会看到你在这里描述的(更简单、更常见的)设置被称为“Docker of Docker”,与之形成对比。@DavidMaze你有没有见过关于“Docker of Docker”的官方字面描述?有时候我真的很难用一个词来解释这个解决方案<代码>国防部<代码>码头工人离开码头工人?看起来不专业…@DavidMaze你实际上是对的,我更新了我的答案,以澄清我不是在描述docker中真正的docker。我从未在任何生产工作中使用过real dind,因为它会引起头痛。我想这就是为什么我开始用docker in docker这个名字来称呼你所谓的“docker out of docker”,现在我在回答中称之为“docker capable”。