从容器内部访问主机

18
我想要实现的是连接到主机系统上安装的数据库。在 docker 中已经有类似的问题,但我无法在 Podman 中实现该方法,我想这可能是因为网络工作方式有些不同。
目前我的解决方案是使用 --add-host=dbhost:$(ip route show dev cni-podman0 | cut -d\ -f7),但我不确定这是否是一个好主意,而且当使用不同的网络时它将不起作用。
如何最好地解决这个问题?或许容器主机已经定义了默认主机名吗?
2个回答

20

在 Podman 中,您也可以使用 host.containers.internal。它基本上是 Podman 版本的 host.docker.internal,但可以直接使用。


这个怎么用? - Iizuki
1
例如,您可以在本地主机上运行npx http-server,然后在另一个终端中使用podman run --rm -it alpine sh命令启动一个容器。一旦进入容器,运行apk add curl,然后执行curl host.containers.internal:8080 - Yves Dorfsman

8

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

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

darkhttpd . --port 8080

我可以启动一个容器:
$ sudo podman run -it --rm alpine sh

在这个容器中,如果我获取默认网关的地址:

/ # ip route
default via 10.88.0.1 dev eth0
10.88.0.0/16 dev eth0 scope link  src 10.88.0.42

我可以连接到该地址上的Web服务器:
/ # 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

唯一的注意事项——这也适用于Docker——是您的主机防火墙必须配置为不阻止来自容器的入站连接。


3
谢谢,但我还在寻找一种更通用的解决方案——如果这样做,我的容器将变得依赖于主机,但如果我只想访问主机名,而不管它是主机、另一个服务器还是容器,那就很好了。请注意不要改变原意。 - Thomas Glaser
@ThomasGlaser,通常情况下,对于你所描述的问题有很多解决方案,但我认为这是使用名称而不是IP地址的明确论据——在容器设置中使用类似mydatabase的东西,确保你的DNS服务器或/etc/hosts响应该名称的所需IP地址(例如答案中的10.88.0.1)。 - Armen Michaeli
当我在我的设置上尝试这个时,当尝试通过默认路由的IP地址连接到主机时,我收到了“网络不可达”的错误。Ping可以工作,但TCP不能。有什么想法吗? - Guss
我需要更多关于你的配置的细节。这可能值得开一个新的问题。 - larsks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接