从docker容器内执行主机命令



我正在寻找一种方法,让用户能够在主机上执行一组有限的命令,而只从容器/浏览器访问它。这样做的目的是防止为了偶尔运行make startmake stop等命令而需要SSH连接到主机。这些make命令只是执行一系列docker-compose命令,在开发中有时需要。

我能想到的两种可能的方法是:

  • 通过cloud9终端在浏览器内(我们已经在使用它)。默认情况下,这个终端当然只能访问容器本身。
  • 通过一个自定义的迷你webapp(例如node.js/express),带有映射到命令的按钮。如果在主机上运行,这很容易做到,但我希望将所有这样的代码保留为容器。

虽然这可能不是最佳实践,但仍然可以从容器内部控制主机。如果你正在运行docker-compose命令,你可以在ubuntu上使用-v /var/run/docker.sock:/var/run/docker.sock绑定挂载docker套接字。如果您想使用其他系统工具,则必须使用-v绑定挂载所有必需的卷,当您想使用使用/lib.*.so文件的系统bin时,这会变得非常棘手和繁琐。

如果您需要使用sudo命令,请不要忘记在运行容器时添加--privileged标志

Named Pipes对于在主机上从docker运行命令非常有用。你的问题和这个很相似

在同一问题中也给出了使用命名管道的解决方案。我已经尝试并测试了这种方法,它工作得非常好。

这种方法违背了docker进程/资源封装的概念。使用docker, 可以完全封装来自主机和彼此的进程(除非您链接容器/卷)。在docker容器中,由于进程名称空间的关系,您无法看到主机上运行的任何进程。当您现在想要从容器内执行主机上的进程时,这将违反docker方法。

容器不应该脱离并访问主机。Docker(除其他外)是进程隔离。不过,在设置主机时,您可能会发现在主机上执行某些代码的各种技巧。

最新更新