【问题标题】:Is it posible to send cli proccess comand from one container to another in docker? [duplicate]是否可以将 cli 进程命令从一个容器发送到 docker 中的另一个容器? [复制]
【发布时间】:2019-07-30 21:58:21
【问题描述】:

我有一个容器运行 java 应用程序和另一个容器运行 nginx 服务器

运行java app的容器有时需要更新nginx容器中的nginx.config文件并向其发送reload命令

我知道我可以共享容器的目录,但是我可以将 cli 命令发送到另一个容器吗?

是否可以使用 docker 并在不同的容器中运行 java 应用和 nginx 来实现这个场景?

【问题讨论】:

  • 这听起来像是一个糟糕的设计。为什么会这样?
  • @ThorbjørnRavnAndersen 问题是我想要一个隔离的 nginx 容器,用于通过 rtmp 流式传输一些视频,以及一个 java 应用程序来组织这项工作,并将其写入 nginx 配置文件。写入 nginx.conf 文件真的很容易,问题是告诉 nginx 重新加载它的配置文件
  • 可以,但更直接的方法是让调用容器不受限制地对主机进行根级别访问以及一系列潜在的安全灾难。即使没有 Docker,这对我来说也是一个不寻常的设计。

标签: java docker nginx


【解决方案1】:

如果您只需要重新加载 nginx 配置,则不必 在容器中运行命令。您可以控制服务器using signals。因此,您需要向nginx docker 容器发送SIGHUP 信号。然后将信号传播到服务器,服务器又会重新加载配置。

怎么做? 所有的 docker 命令都可以作为 REST API 使用。在这种情况下,它是 Kill a container 要制作的。您只需要访问 docker 守护程序正在侦听的默认 unix 套接字 (/var/run/docker.sock)。它可以与 java 容器共享(作为挂载的卷),或者可以将 docker 守护进程配置为侦听TCP 套接字。

假设您共享了套接字,您现在可以使用 curl 从 java 容器内部向 docker 守护进程 POST 终止请求:

curl --unix-socket /var/run/docker.sock -d "" "http://localhost/containers/<docker_id>/kill?signal=SIGHUP"

其中docker_idnginx 容器的ID。

注意:访问主机上的 docker 守护程序(通过远程访问或通过共享套接字)可能会使您遇到@David Maze 提到的安全问题

如果上述方案不可行,您也可以使用ssh 运行命令。详细讨论here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多