在容器内部控制Docker是否可行?

7
我尝试将站点部署脚本打包成Docker容器。我的想法是,我的服务都在容器内,然后使用特殊的管理容器来管理其他容器。
我的主机应该尽可能地简单(目前我使用的是CoreOS,唯一的状态是一个systemd配置文件,启动我的管理容器)。
管理容器可用作创建基于我提供的源代码的新容器的推送目标(使用SSH,至少是我现在使用的方式)。脚本还在一个单独的容器中管理持久数据(数据库文件、日志等),并为其管理备份,以便在不接触任何数据的情况下拆除和重建所有内容。为了实现这一点,在启动管理容器时,我使用-v选项转发Docker Unix套接字。
这是一个好的还是坏的主意?我这样做会遇到问题吗?我没有看到任何不鼓励这样做的地方,但我也没有找到很多其他人这样做的例子。

是的,请查看 https://dev59.com/S2Eh5IYBdhLWcg3wrVLW#33183227 答案,了解一些指示和注意事项。 - Dmitriusan
是的,这个问题很久以前就被问过了。现在有许多流行的服务可以做到这一点。 - Krumelur
2个回答

7

这是完全可以的,你并不是唯一这么做的人 :-)

另一个使用示例是使用管理容器来处理Docker REST API的身份验证。它将在EXPOSE的TCP端口上接受连接,并用-p发布自己,然后代理请求到UNIX套接字。


这并不是很好,因为它会让你的服务器对任何人都开放运行docker命令。sock文件存在是有很好的原因的——安全。 - Matej
不,它不会打开您的服务器。它只是提供对容器(以及其中的所有内容)的访问权限;这是不同的。如果您指的是我的回答的第二部分:我并不建议将API公开,而是要打开一个管理容器。这个管理容器将过滤REST API。 - jpetazzo

2
由于这个问题今天仍然很重要,我想详细回答一下:可以使用这种设置,将docker套接字传递到正在运行的容器中。许多解决方案都是这样做的,而且效果很好。但是,您必须考虑以下问题:
1.如果要使用套接字,则必须在容器内部拥有root权限。这允许在容器内执行任何命令。例如,如果入侵者控制此容器,则他控制所有其他docker容器。
2.如果按照jpetzzo的建议使用TCP端口公开套接字,则会更糟,因为现在您甚至不需要破坏容器,只需破坏网络即可。如果过滤连接(如其评论中所建议),则第一个问题仍然存在。
简而言之,您可以这样做,并且它会起作用,但是您必须考虑安全性。

谢谢。自从我提出这个问题以来已经过去了很长时间,而现在我相信在容器内使用套接字是一个相当成熟的模式,特别是对于构建/部署容器(如果我没记错的话,这就是问题所在)。 - Krumelur
嗨Krumelur,当你说使用套接字在容器内(使用root用户)是一种经过验证的模式时,这是否意味着@Jan提出的安全问题已通过某些方法得到缓解?我有类似的需求,并正在思考如何使用非root用户使其工作-主要担心会引起相同的安全问题。非常感谢您的反馈。谢谢。 - Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接