从容器内部访问主机

Raz*_*iel 6 podman

我想要完成的是连接到安装在主机系统上的数据库。现在docker已经有一个类似的问题docker,但我无法让它与 Podman 一起工作,我想是因为网络在这里的工作方式有点不同。

到目前为止,我的解决方案是使用 --add-host=dbhost:$(ip route show dev cni-podman0 | cut -d\ -f7),但我不确定这是一个好主意,并且在使用不同的网络时它不会起作用。

实现这一目标的最佳方法是什么?是否已经定义了容器主机的默认主机名?

小智 28

您也可以host.containers.internal在 podman 中使用。它基本上与 Podman 等效host.docker.internal,但开箱即用。


lar*_*sks 8

podman 的解决方案与您提供链接的答案中描述的解决方案相同:容器内可见的默认路由可用于连接到主机服务(假设它们正在侦听所有地址或显式绑定到 podman 桥) )。

例如,如果我的主机上有一个在端口 8080 上运行的网络服务器...

darkhttpd . --port 8080
Run Code Online (Sandbox Code Playgroud)

我可以启动一个容器:

$ sudo podman run -it --rm alpine sh
Run Code Online (Sandbox Code Playgroud)

如果我获得默认网关的地址,则在该容器内:

/ # ip route
default via 10.88.0.1 dev eth0
10.88.0.0/16 dev eth0 scope link  src 10.88.0.42
Run Code Online (Sandbox Code Playgroud)

我可以连接到该地址上的网络服务器:

/ # wget -O- http://10.88.0.1:8080/hello.txt
Connecting to 10.88.0.1:8080 (10.88.0.1:8080)
Hello world
-                    100% |***************************************|    12  0:00:00 ETA
Run Code Online (Sandbox Code Playgroud)

唯一需要注意的是,对于 Docker 来说也是如此,您的主机防火墙必须配置为不会阻止来自容器的入站连接。

  • 谢谢,但我一直在寻找一个更通用的解决方案 - 在这种情况下,我的容器将变得依赖于主机,但如果能够灵活地访问主机名,它可以是主机,也可以是另一台服务器,那就太好了或容器。 (3认同)