如何从 docker 容器访问 localhost? [复制]

Posted

技术标签:

【中文标题】如何从 docker 容器访问 localhost? [复制]【英文标题】:How to reach localhost from docker container? [duplicate] 【发布时间】:2022-01-09 12:14:31 【问题描述】:

我有一个在 docker 容器中运行的 dotnet API。

我想通过这个 API 访问执行容器的本地主机上的 PostgreSQL 数据库。在 Windows 上,我使用 host.docker.internal 运行相同的应用程序连接到 localhost 数据库,但在 linux 上它不起作用。

我的连接字符串是这样的:

"Server=host.docker.internal;Port=5432;Database=DbName;User Id=DbUser;Password=MyPassword;"

我尝试通过添加 p --add-host=host.docker.internal:host-gateway 来制作 docker run,但它也不起作用。

我使用pg_isready 测试了我的 PostgreSQL 连接,如下所示。我的连接正常:

pg_isready -d dbname -h myHost -p 5432 -U dbUserName

我错过了什么?

【问题讨论】:

嗨! doesn't work 描述性不够。你得到一个错误,超时?你的数据库绑定到哪个ip?你怎么连接?您是否认为这是没有发生的名称解析或连接被拒绝?您是否尝试过通过代码连接以外的方式进行连接,例如从容器 ping host.docker.internal? 【参考方案1】:

将容器放入网络“主机”以通过localhost127.0.0.1 访问服务

docker run --network="host"

或运行桥接网络(默认)并通过 IP 地址访问主机:

docker network inspect <name>
"IPAM": 
            "Driver": "default",
            "Options": ,
            "Config": [
                
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1" <--- host IP
"Containers": 
            "048a..": 
                "Name": "container",
                "EndpointID": "81de..",
                "MacAddress": "02:42:..",
                "IPv4Address": "172.18.0.5/16", <-- container IP
                "IPv6Address": ""

【讨论】:

【参考方案2】:

--add-host=host.docker.internal:host-gateway,但是也没用。

在这种情况下,您可以使用docker run --add-host mypgserver:$(hostname -I | awk 'print $1') ...

你的连接字符串:

"Server=mypgserver;Port=5432;Database=DbName;User Id=DbUser;Password=MyPassword;"

此方法避免使用--network="host",如果不小心会导致端口冲突。

【讨论】:

以上是关于如何从 docker 容器访问 localhost? [复制]的主要内容,如果未能解决你的问题,请参考以下文章