Linux Docker容器未使用主机localhost

yrefmtwq  于 2023-01-25  发布在  Docker
关注(0)|答案(2)|浏览(162)

抱歉,我知道这个问题很常见,但我现在遇到了一堵墙,我需要一个正确的方向。谢谢。
我正在努力使用一个在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>

谁能给我指一下正确的方向吗?
谢谢!

ivqmmu1c

ivqmmu1c1#

使用curl http://host.docker.internal:57888/api/reference,您确实连接到了API。
我知道这一点是因为你会得到一些HTML,当出错时Curl不会生成HTML,所以HTML一定来自其他地方:你的API。
也许API不喜欢被包含host.docker.internalHost:头调用,这就是为什么它返回400错误。要弄清楚这一点,我们需要更多关于API如何编码和托管的信息。

hgncfbus

hgncfbus2#

@Hans引导我找到了正确的方向。host.docker.internal确实连接到了我的API,但是API不喜欢这个主机名,所以它导致了HTTP 400错误。
因此,在Docker合成文件中,我将extra_hosts更改为

container-api:
    container_name: container-api
    build:
        context: ..
        dockerfile: Dockerfile
    ports:
        - "3007:3001"
    env_file:
        - ./file.env
    extra_hosts:
        - "localhost:host-gateway"

现在,容器使用http://localhost:57888/api/reference,并成功连接到API

相关问题