抱歉,我知道这个问题很常见,但我现在遇到了一堵墙,我需要一个正确的方向。谢谢。
我正在努力使用一个在docker容器中的localhost上的API。我已经遵循了许多指南,但我似乎遗漏了一些东西。我的步骤:
在Windows命令提示符下,我使用CURL命令向localhost上的API发出GET请求。
curl http://localhost:57888/api/reference
[HttpGet()]
public ActionResult CheckIfOnline()
{
// Breakpoint hits here
return Ok();
}
现在我想在我的Docker容器中调用这个端点。我已经尝试在合成文件中这样做了:
container-api:
container_name: container-api
build:
context: ..
dockerfile: Dockerfile
ports:
- "3007:3001"
env_file:
- ./file.env
extra_hosts:
- "host.docker.internal:host-gateway"
从我的研究来看,我认为这基本上意味着容器现在可以“看到”主机,因此可以使用localhost?(很高兴被证明是错误的)
因此,当我创建容器时,我首先ping host.docker.internal
以查看它是否可用。
ping host.docker.internal
PING host.docker.internal (192.168.65.2) 56(84) bytes of data
正如你所看到的,有一个响应,但我不完全确定什么是IP192.168.65.2。环顾网络,这显然是一个'魔术' IP代表主机IP,我不知道这是否正确,因为我没有看到这个IP使用'ipconfig',但现在,我将继续。
对于Mac上的Docker,在Docker VM中有一个神奇的IP192.168.65.2,代表主机,或者您可以只使用host.docker.internal在Docker VM中就可以了。
最后,我在bash容器中使用'CURL',看看是否可以找到本文开头提到的API。然而,我得到了这个错误:
# curl http://host.docker.internal:57888/api/reference
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>
谁能给我指一下正确的方向吗?
谢谢!
2条答案
按热度按时间ivqmmu1c1#
使用
curl http://host.docker.internal:57888/api/reference
,您确实连接到了API。我知道这一点是因为你会得到一些HTML,当出错时Curl不会生成HTML,所以HTML一定来自其他地方:你的API。
也许API不喜欢被包含
host.docker.internal
的Host:
头调用,这就是为什么它返回400错误。要弄清楚这一点,我们需要更多关于API如何编码和托管的信息。hgncfbus2#
@Hans引导我找到了正确的方向。
host.docker.internal
确实连接到了我的API,但是API不喜欢这个主机名,所以它导致了HTTP 400错误。因此,在Docker合成文件中,我将extra_hosts更改为
现在,容器使用
http://localhost:57888/api/reference
,并成功连接到API