我可以在不使用--privileged标志的情况下运行Docker-in-Docker

Mic*_*ton 9 security docker

我想使用Docker-in-Docker,但是--privileged提供了对设备的全面访问.有没有办法使用卷和封面添加等的组合来运行它?

Mic*_*ael 8

不幸的是,你必须使用--privileged旗帜在Docker中运行Docker,你可以看看他们声明的官方公告,这是--privileged旗帜的众多目的之一.

基本上,您需要更多访问主机系统设备来运行docker,而不是在没有运行时运行--privileged.

  • Docker中的docker特别需要哪些设备?有一个`--device`选项,它意味着一种侵入性较小的特权选项.[见文档](https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities) (3认同)

Rya*_*ugh 5

是的,您可以在没有--privileged标志的情况下在 docker 中运行 docker 。它涉及将 docker socket 安装到容器上,如下所示:

   docker run -it -v /var/run/docker.sock:/var/run/docker.sock \
               -v $(which docker):/bin/docker \
               alpine docker ps -a
Run Code Online (Sandbox Code Playgroud)

这会将 docker socket 和可执行文件挂载到容器中并docker ps -a在 alpine 容器中运行。Jérôme Petazzoni 是 dind 示例的作者并在--privileged标志上做了很多工作,他对 docker 中的 docker有以下看法:

https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

我已经使用这种方法有一段时间了,效果很好。

这种方法的警告是存储变得时髦。最好使用数据卷容器或命名数据卷,而不是安装目录。由于您使用来自主机的 docker 套接字,因此您要在子容器中安装的任何目录都需要来自主机的上下文,而不是父容器。它变得奇怪。我在数据量容器方面有更好的运气。

  • 不,不应该,让容器访问主机 docker socket 并不能真正解决问题。 (7认同)
  • 实际上这不是 dind (Docker-in-Docker) 的意思。您只是在 docker 容器中运行 docker 客户端,而不是在 docker 容器 (dind) 中运行 docker 服务器。此外,通过暴露主机套接字实际上提供了更多的攻击面,而不仅仅是将 `--privileged` 标志添加到 dind 容器并让它拥有自己的套接字。 (4认同)
  • 我不同意 Socket 比“--privileged”更危险。至少从我在实现特权标志的开发人员的博客文章中了解到的:https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ (2认同)