使用curl连接到Docker

15

我正在按照这个关于Docker的教程进行学习,该教程将设置一个小型的hello world服务器。

这是预期的行为:

docker run -d -p 5000:5000 training/webapp:latest python app.py
curl http://dockerhost:5000
Hello world!

然而,当我运行时出现了一个错误

curl http://dockerhost:5000
curl: (6) Could not resolve host: dockerhost

我查看了一些其他答案并尝试了一下。

ping http;//dockerhost:5000
unknown host http://dockerhost:5000

nslookup http://dockerhost:5000
;; connection timed out; no servers could be reached

netstat -utapen | grep 5000
tcp6       0      0 :::5000                 :::*                    LISTEN      0          251303      -  

有些stackoverflow答案(curl: (6) Could not resolve host: google.com; Name or service not known)提到了DNS问题(错误的DNS服务器),但我不知道该怎么做来确定这是否与我的问题相关。


1
除非您的文件/etc/hosts或DNS中有dockerhost,否则不应键入dockerhost,而应键入127.0.01或localhost。 - user2915097
对于这个问题,只是一个旁注:在某些情况下,您可以拥有自动分配的IP地址,可以使用docker inspect查看,然后curl http://{ip}:{port}可能会起作用。 - colidyre
4个回答

10
动机和解决方案: 您正在运行一些服务,并希望将其公开给外部世界(默认情况下,容器是开放的,并且如果它们在同一台机器上运行,例如像Web应用程序服务和一些数据库服务(如redis/postgress/mongo)一起运行并“交谈”),则可以与其他服务进行通信)。但在黑盒子世界中访问它是不同的,尝试进入是被禁止的。您没有权限。因此,您应该在docker命令或docker-compose.yml文件上显式配置特定端口属性,并通过此链接进行连接:
例如,在我的docker-compose.yml文件上,配置port属性:
ports:
  - "0.0.0.0:8080:8080"

使用docker ps命令来验证并查看所有正在运行的容器:

CONTAINER ID    IMAGE                          COMMAND                   CREATED        STATUS        PORTS                               NAMES
abc123asd456    someService/someService:lts    "/sbin/tini -- /usr/…"    10 weeks ago    Up 10 days    0.0.0.0:8080->8080/tcp, 50000/tcp   serviceName

并可以直接从本地访问:0.0.0.0:8080

curl -X GET 0.0.0.0:8080/api/some-api-function

7

这更像是一个DNS问题。

当你使用像curlpingnslookup等命令打开连接到其他端口时,它们需要你提供另一端的IP地址或能够被解析成IP地址的名称。

在您的情况下,dockerhost是一个名称,而不是IP地址,因此您的系统无法将此名称解析为IP地址。

有很多解决方案,如上面所述。您可以在/etc/hosts文件(如果您使用的是Linux系统)中插入一行来告诉系统dockerhost名称对应的IP地址:

echo "127.0.0.1 dockerhost" >> /etc/hosts

如果你是Windows机器,可以直接编辑文件C:\Windows\System32\drivers\etc

这会将名为dockerhost的IP地址设置为127.0.0.1,与localhost或者你自己的机器相同。

现在你应该可以通过ping来测试了:

ping dockerhost

请注意,pingnslookup只需要名称,不需要协议(http://)和端口(5000)。而curl需要协议和端口。或者您可以直接使用IP地址127.0.0.1代替dockerhost

1

您需要在主机文件中添加

dockerhost 127.0.0.1

或使用 127.0.0.1 访问容器。此外,我建议在您的 docker run 命令中使用名称,例如:

docker run -d -p 5000:5000 --name dockerhost training/webapp:latest python app.py

当您运行多个容器时,如果将它们放置在同一网络中,则可以通过您为它们命名的名称从其他容器连接到容器。


-4

如果您尝试

curl name_of_container:5000/path/to/method

(不需要 http://)

应该可以正常工作


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