安全的DiD或UNIX套接字替代品?

时间:2016-10-08 19:24:25

标签: python docker docker-compose

我试图了解有关Docker的更多信息,它的用途以及它的功能。为此,我使用docker-compose设置了两个容器:

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

我的目的是拥有一个HTTP服务接口(Django应用程序)来管理另一个容器。我寻求能够通过Django应用程序向服务容器发出命令。通常,这将通过docker exec $container_ID <command>完成。但是,Django应用程序当然不能像这样调用docker命令,因为它在容器本身中。所有这些都在我的局域网上提供,而不是暴露在网络上。

现在,根据我的理解,我有这些选项可以在另一个容器上提供Django docker exec权限/功能:

  • 使用Docker-in-Docker 但是,根据我收集的内容,即使是DiD的作者也建议against using DiD,除非您有非常具体,合适的目的。相反,他建议你使用:
  • Docker UNIX套接字使用类似docker-py之类的东西来实现魔力。但是,粗略搜索显示这也是不确定的:任何有权访问套接字的容器都有对主机文件系统[1] [2]的root访问权限,如果我理解正确的话(我是这样的话)不完全确定)。我很快就不期待局域网上的恶意软件了(敲击虚拟木头),但事情仍然让我感到困惑:如果攻击者找到了控制Django容器的方法,他们实际上会有一个免费的权限升级到主机系统。有Docker post显示你如何处理这个问题,但它似乎不是一个成熟的Docker功能(但是?)。解释是相对技术性的,我还没有达到完全掌握它的专业水平。
  • Hackity hack 使用共享卷。基本上Django容器将命令写入共享文件,服务容器定期读取该文件并执行它在内部找到的命令。我不确定这是否真实,或者我是否会最终陷入网络地狱,我只是想出来。

我错过了另一个Docker功能,这使我能够满足我的容器间管理需求吗?

1 个答案:

答案 0 :(得分:0)

你可以做你想做的事(当然,如果我理解的话):

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

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

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

  • 使用Docker TCP socker代替并将容器中的DOCEKR_HOST env设置为停靠主机IP,然后您不再需要socker(它不太安全,请确保您有适当的防火墙来保护您的Docker不受外界影响或使用网络不是routerd / nat)

或者

  • 在您的服务容器中嵌入一个小API以代表您运行命令,这样您就不需要所有的终结器功能。