主要问题是我有两个容器:containerA和containerB。 containerB是Portia的容器,该容器正在运行,由于外部原因,我无法停下来。在containerA中,我需要执行containerB的docker exec。
我已经阅读了两个主要的解决方案,第一个已经尝试并且可以使用的解决方案是使用ssh在主机中运行脚本,但是我无法让没有密码的用户使用密码,在我看来,提供密码似乎不是最好的方法。第二种方法是使用docker.sock和docker compose文件,但是很多人在评论中说这不是安全的方法。
有人可以用其他方式向我解释,或者我错了,为什么? 感谢您的宝贵时间。
答案 0 :(得分:0)
您基本上已经强调了直接在另一个容器中运行命令的两种方法。特别是,允许docker exec
访问权限使您的进程可以不受限制地对主机进行根级控制,而且您设置中的任何安全问题都可能导致损害主机的可能性很大(我已经看到很多SO问题,对system("docker exec $COMMAND")
类型的调用进行了简单的shell注入攻击。)
最佳做法是尽量避免使用docker exec
。这是一个非常有用的调试工具,但它根本不应该出现在核心应用程序流程中。 (这在很大程度上等同于“ ssh作为服务器的根目录,并...”,这从来都不是最佳实践。)如果一个容器需要请求另一个容器做某事,通常可以通过某种HTTP接口来完成。
答案 1 :(得分:0)
正如您在问题中提到的那样,您发现有两种可能的方法可以远程运行docker命令。
两者都不安全。
但这不是事实。我不确定ssh,但可以保护docker socket。
检出this。
您必须在docker daemon套接字上启用tls
,以使其安全。然后您就可以以安全的方式远程运行docker。
在上述链接中引用第一段。
默认情况下,Docker通过未联网的UNIX套接字运行。它可以 还可以选择使用HTTP套接字进行通信。
如果您需要通过网络安全地访问Docker 方式,您可以通过指定tlsverify标志和 将Docker的tlscacert标志指向受信任的CA证书。
在守护程序模式下,它仅允许来自客户端的连接 由该CA签署的证书进行身份验证。在客户端模式下, 它仅连接到具有该CA签名的证书的服务器。
希望这会有所帮助。