【问题标题】:Execute docker exec command from other container without using ssh or docker.sock不使用 ssh 或 docker.sock 从其他容器执行 docker exec 命令
【发布时间】:2019-11-06 05:24:05
【问题描述】:

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

我已经阅读了两个主要的解决方案,我已经尝试过的第一个解决方案是使用 ssh 在主机中运行脚本,但我不能拥有没有密码的用户,并且在我看来给密码似乎不是最好的方法来做到这一点。第二种方式是使用 docker.sock 和一个 docker compose 文件,但是很多人在 cmets 中说这不是一种安全的方式。

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

【问题讨论】:

  • 这里提到的所有答案你都看完了吗stackoverflow.com/questions/44446472/…
  • 嗨,所提到的答案都是关于 ssh 或 docker.sock 的,除了我不太了解的一个。它使用的是docker机器,你是说这个吗?

标签: docker containers exec communication portia


【解决方案1】:

您基本上强调了在另一个容器中直接运行命令的仅有的两种方法。特别是,允许​​docker exec 访问可以让您的进程对主机进行无限制的根级别控制,并且您设置中的任何安全问题都会打开危害主机的非常现实的可能性(我见过很多 SO 问题对system("docker exec $COMMAND") 类型调用进行简单的shell 注入攻击)。

最佳做法是尽量避免docker exec。这是一个非常有用的调试工具,但它根本不应该出现在您的核心应用程序流程中。 (这非常相当于“ssh 作为服务器的 root 并且...”,这绝不是最佳实践。)。如果一个容器需要请求另一个容器做某事,这通常是通过某种 HTTP 接口完成的。

【讨论】:

    【解决方案2】:

    正如您在问题中提到的,您可以找到两种可能的方式来远程运行 docker 命令。

    • 使用 ssh
    • 使用 docker 套接字

    您认为两者都不安全。

    但事实并非如此。我不确定 ssh,但是可以保护 docker socket。

    签出this

    您必须在您的 docker daemon socket 上启用tls,以确保其安全。然后你就可以安全地远程运行docker了。

    引用上述链接的第一段。

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 是的,看起来是这样。如果您希望以安全的方式使用它。然后继续并按照此链接docs.docker.com/engine/security/https 安全地配置 docker 并尝试按照链接中的说明远程运行命令。如果有帮助,请投票并接受答案。 :)
    • 那么在这种情况下,您认为使用 docker.sock 是最好的方法吗?我是 docker 新手,我在另一个问题中看到过:lhttps://stackoverflow.com/questions/35110146/can-anyone-explain-docker-sock,强烈建议不要使用 docker.sock,因为David Maze 在其他评论中说可能会受到表面攻击。
    • 好的,我会再调查一下你的方法,谢谢你的帮助
    猜你喜欢
    • 2017-06-19
    • 2014-12-12
    • 1970-01-01
    • 2015-10-21
    • 2016-03-19
    • 2021-08-17
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多