从其他容器执行docker exec命令,而无需使用ssh或docker.sock

时间:2019-06-24 11:52:01

标签: docker containers exec communication portia

主要问题是我有两个容器:containerA和containerB。 containerB是Portia的容器,该容器正在运行,由于外部原因,我无法停下来。在containerA中,我需要执行containerB的docker exec。

我已经阅读了两个主要的解决方案,第一个已经尝试并且可以使用的解决方案是使用ssh在主机中运行脚本,但是我无法让没有密码的用户使用密码,在我看来,提供密码似乎不是最好的方法。第二种方法是使用docker.sock和docker compose文件,但是很多人在评论中说这不是安全的方法。

有人可以用其他方式向我解释,或者我错了,为什么? 感谢您的宝贵时间。

2 个答案:

答案 0 :(得分:0)

您基本上已经强调了直接在另一个容器中运行命令的两种方法。特别是,允许​​docker exec访问权限使您的进程可以不受限制地对主机进行根级控制,而且您设置中的任何安全问题都可能导致损害主机的可能性很大(我已经看到很多SO问题,对system("docker exec $COMMAND")类型的调用进行了简单的shell注入攻击。)

最佳做法是尽量避免使用docker exec。这是一个非常有用的调试工具,但它根本不应该出现在核心应用程序流程中。 (这在很大程度上等同于“ ssh作为服务器的根目录,并...”,这从来都不是最佳实践。)如果一个容器需要请求另一个容器做某事,通常可以通过某种HTTP接口来完成。

答案 1 :(得分:0)

正如您在问题中提到的那样,您发现有两种可能的方法可以远程运行docker命令。

  • 使用ssh
  • 使用docker套接字

两者都不安全。

但这不是事实。我不确定ssh,但可以保护docker socket。

检出this

您必须在docker daemon套接字上启用tls,以使其安全。然后您就可以以安全的方式远程运行docker。

在上述链接中引用第一段。

  

默认情况下,Docker通过未联网的UNIX套接字运行。它可以   还可以选择使用HTTP套接字进行通信。

     

如果您需要通过网络安全地访问Docker   方式,您可以通过指定tlsverify标志和   将Docker的tlscacert标志指向受信任的CA证书。

     

在守护程序模式下,它仅允许来自客户端的连接   由该CA签署的证书进行身份验证。在客户端模式下,   它仅连接到具有该CA签名的证书的服务器。

希望这会有所帮助。