安全替代DiD或UNIX套接字?

我想了解更多关于Docker的知识,以及它的function。 为此,我使用docker-compose设置了两个容器:

  • 一个基于Docker的python:3映像的容器运行一些服务
  • 另一个容器,也基于Dockers的python:3图像,包含一个Django应用程序。
    使用Docker的原因是它似乎是确保不同系统function的好方法。

我的目的是有一个HTTP服务的接口(Django应用程序)来pipe理其他容器。 我试图通过Django应用程序向服务容器发出命令。 通常,这将通过docker exec $container_ID <command> 。 但是,Django应用程序当然不能像这样调用docker命令,因为它在一个容器本身。 所有这一切都在我的局域网上,而不是暴露在networking上。

现在,从我的理解,我有这些选项给Django docker exec特权/function在另一个容器上:

  • 使用Docker-in-Docker:但是,从我所收集的内容来看,即使是DiD的作者也build议不要使用DiD ,除非你有一个非常具体的,合适的目的。 相反,他build议你使用:
  • Docker UNIX套接字,使用像docker-py这样的function。 然而,粗略的search表明,这也是可能的:任何有权访问套接字的容器有效地访问主机文件系统[1] [2] ,如果我理解正确(我不完全确定)。 我不希望我的局域网中的恶意软件(敲虚拟木头),但是这个问题仍然让我感到困惑:如果攻击者find了控制Django容器的方法,那么他们实际上可以免费升级到主机系统。 有一个Docker文章,展示了如何处理这个问题,但是它似乎并不是一个完整的Dockerfunction(还是?)。 这个解释是比较技术性的,我还没有完全掌握这个专业水平。
  • 使用共享卷的黑客入侵 。 基本上,Django容器将命令写入共享文件,服务容器定期读取该文件并执行其在内部find的命令。 我不确定这是现实的,还是我最终会陷入networking的混乱,我只是想出了它。

是否有另一个我错过的Dockerfunction可以满足我的容器间pipe理需求?

你可以做你想做的(当然如果我理解的很好的话)

docker run -d -v /var/run/docker.socket:/var/run/docker.socket -v $(which docker):/usr/bin/docker manager-app:latest

然后,您可以使用docker binary访问主机上的其他容器并pipe理您的服务容器。


既然你问了其他的方法,我可以提出两点:

  • 使用Docker TCP socker来代替,并在您的容器中将DOCEKR_HOST env设置为docker host IP,然后您就不再需要socker了(它不太安全,请确保您有适当的防火墙来保护您的docker不受外部世界影响,或者使用未经routerd / NAT)

要么

  • 在您的服务容器中embedded一个小的API来代表您运行命令,这样您就不需要dockerfunction。