基于 docker-compose 的项目如何调用宿主机上的服务?

准备把原来的所有直接装在系统上的服务都改成 Docker 的。

其他的问题好解决,现在的问题是有一个功能是在界面上点击某按钮,php 会调用 exec 在宿主机上执行一段命令。这个命令必须在宿主机上执行,并改变宿主机上的一些内容或配置(比如关机)。(这个前提不能变)

现在的思路是把调用宿主机上命令这件事,改成一个独立的HTTP服务接口,由 docker 内的 php 去调用这个接口。

请问该如何让 docker 容器知道如何连接宿主机?

(如果可以指定宿主机的域名的话是否可以在 docker-compose 中指定?)

PS:宿主机是 Linux 的,所以 host.docker.internal 用不了。

网络模式 不是 host 所以不能直接调用 localhost

阅读 7.4k
3 个回答

啊哈,我也一样, 使用unix domain socket啊,不一定要tcp,再把文件映射到容器里。

找到解决办法了!

clipboard.png

赞成“小苏梅”,提到的使用 unix domain socket的做法,简单构建unix socket的服务(在宿主机,用于接收unix socket传递过来的参数,并执行命令反馈结果)和客户端(向服务器端发送命令参数),中间的unix socket 可以通过docker-composer volume的方式挂载进入容器中【当然客户端代码也可以一并挂载进去】,之后就简单执行客户端就可以。语言可以使用通用的c或python之类,看自己喜欢

PS:早先给的方案建议是基于docker环境下默认的网络模式(bridge),容器默认使用宿主机作为网关的前提下假定,所以一般情况下,容器是可以通过网关ip访问到宿主机。不知你的环境是否有特殊的网络设定?


域名是否可以考虑,通过docker-compose的environment环境变量传入容器?


初步想到两个方法,可以做下参考:
1、容器中php透过ssh宿主机(密钥鉴权方式),直接执行宿主机的命令
2、将宿主机需要更新的数据目录挂载到容器中,并在容器中安装/挂载相应的软件环境,直接执行之。

可以将宿主机对应文件映射进去,docker中执行对应操作

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题