对于基本上所有日常使用,包括您需要自己配置的 CI 系统,将主机的 Docker 套接字绑定安装到环境中并使用它。在大多数情况下,您根本不应该使用 Docker-in-Docker。
对此的规范参考(仍然是 5 年后)是 Jérôme Petazzoni 的Using Docker-in-Docker for your CI or testing environment?三思而后行。 我建议使用 Docker-in-Docker 是合适的:
- 如果您正在积极地在 Docker 本身上进行开发(您已经查看了https://github.com/moby/moby并正在编辑源代码)并且您需要一个沙箱来运行您修改后的守护程序;或者
- 如果您对 Docker 概念有非常深刻的理解,并且您和您一起工作的任何人都不会被“错误”的 Docker 守护进程中的映像或来自错误“主机系统”的绑定挂载所迷惑;或者
- 如果您有一个 CI 系统或其他工具非常特别地支持它作为零配置选项。
有几个“罐头”解决方案打破了大多数正常规则,但仍然运作良好。这里我能想到的最突出的例子是kind(“Kubernetes in Docker”),它打破了“不要运行 Docker-in-Docker”和“每个容器一个进程”的规则,运行整个 Kubernetes 集群在单个 Docker 容器中。它真的很有用,但它也向你隐藏了几乎所有关于“我的容器在哪里”的细节。这是我正在考虑的那种“零配置选项”。
我不会担心某个开发人员的 Docker 版本与您的 CI 或生产系统略有不同。我只遇到了一个与 Docker 不兼容的版本。就目前而言,“经典”与 BuildKit 构建系统可能会做一些不同的事情,但我不会引入非常复杂的替代设置来防止这种情况。