我在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服务器),但我不知道该怎么做才能看出这是否与我的问题相关。
答案 0 :(得分:1)
这是一个DNS
问题。
当您使用curl
,ping
或nslookup
等命令或其他打开与其他目标的连接的命令时,他们希望您通知另一端的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
节点ping
和nslookup
只需要一个名称,没有协议(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://)
应该有效