用curl连接到docker

时间:2017-01-27 05:59:17

标签: curl docker

我在docker上的this教程之后设置了一个小型的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服务器),但我不知道该怎么做才能看出这是否与我的问题相关。

4 个答案:

答案 0 :(得分:1)

这是一个DNS问题。

当您使用curlpingnslookup等命令或其他打开与其他目标的连接的命令时,他们希望您通知另一端的IP地址,或者可以解析为IP的名称。

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

有许多解决方案,例如上面提到的解决方案。 您可以通知您的系统名称dockerhost的IP地址,但在/etc/hosts文件中插入一行(如果您在Linux机器上):

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 :(得分:1)

动机和解决方案:您正在运行某些服务,并且希望将其向外界公开(默认情况下-容器处于打开状态,如果其他服务一起运行,则可以与其他服务进行通话-例如网络应用程序服务和一些db服务(例如redis / postgress / mongo)在同一台计算机上一起运行,并且彼此“交谈”),但是在黑匣子世界中访问它是不同的,并且禁止进入。您没有权限。因此,您应该在docker命令或docker-compose.yml文件的port属性上显式配置特定端口,并通过以下链接进行连接:

例如,例如,在我的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

答案 2 :(得分:0)

你必须添加

  

dockerhost 127.0.0.1

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

  

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

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

答案 3 :(得分:-1)

如果你尝试

  

curl name_of_container:5000 / path / to / method

(不含http://)

应该有效