我正在关注有关 docker 的本教程,该教程设置了一个小型的 hello world 服务器。
这是预期的行为:
docker run -d -p 5000:5000 training/webapp:latest python app.py
curl http://dockerhost:5000
Hello world!
Run Code Online (Sandbox Code Playgroud)
但是,运行时出现错误
curl http://dockerhost:5000
curl: (6) Could not resolve host: dockerhost
Run Code Online (Sandbox Code Playgroud)
我看了一些其他的答案并尝试
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 -
Run Code Online (Sandbox Code Playgroud)
一些 stackoverflow 答案(curl: (6) 无法解析主机:google.com;名称或服务未知)正在谈论 DNS 问题(错误的 DNS 服务器),但我不知道该怎么做才能查看这是否相关我的问题。
avi*_*amg 11
动机和解决方案:您运行一些服务,并且希望将其公开给外界(默认情况下 - 容器是打开的,并且如果其他服务一起运行,则与它们通信 - 例如,像 Web 应用程序服务和一些数据库服务,如 redis/postgress /mongo 在同一台机器上一起运行并相互“交谈”)但是在黑盒世界中访问它是不同的,并且尝试进入是被禁止的。你没有权限。因此,您应该在 docker 命令或docker-compose.yml文件端口属性上显式配置特定端口,并通过此链接进行连接:
例如,在我的docker-compose.yml文件中配置port属性:
ports:\n - "0.0.0.0:8080:8080"\nRun Code Online (Sandbox Code Playgroud)\ndocker ps使用观察所有正在运行的容器来验证它:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\nabc123asd456 someService/someService:lts "/sbin/tini -- /usr/\xe2\x80\xa6" 10 weeks ago Up 10 days 0.0.0.0:8080->8080/tcp, 50000/tcp serviceName\nRun Code Online (Sandbox Code Playgroud)\n并直接从本地主机访问它:0.0.0.0:8080
curl -X GET 0.0.0.0:8080/api/some-api-function\nRun Code Online (Sandbox Code Playgroud)\n
这更像是一个DNS问题。
当您使用诸如curl,ping或nslookup或其他命令打开与另一端的连接时,他们希望您告知另一端的 IP 地址,或者可以解析为 IP 的名称。
在您的情况下,dockerhost是名称,而不是 IP,并且您的系统无法将此名称解析为 IP 地址。
有很多解决方案,就像上面提到的那样。您可以将名称的 IP 地址告知您的系统, dockerhost但在/etc/hosts文件中插入一行(如果您使用的是 Linux 机器):
echo "127.0.0.1 dockerhost" >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)
或者,C:\Windows\System32\drivers\etc如果您使用的是 Windows 计算机,则只需编辑该文件。
这会告诉您的系统名称的 IP 地址dockerhost是127.0.0.1,这与您localhost或您自己的机器相同。
现在你应该能够ping做到:
ping dockerhost
Run Code Online (Sandbox Code Playgroud)
节点即ping与nslookup期望只是一个名字,没有协议(http://)和端口(5000)。curl确实需要协议和端口。
或者你可以只使用 IP127.0.0.1而不是dockerhost.
你必须添加
docker主机127.0.0.1
在您的主机文件中或使用 127.0.0.1 访问容器。另外,我建议在 docker run 命令中使用名称,如下所示:
docker run -d -p 5000:5000 --name dockerhost Training/webapp:最新的 python app.py
当您运行多个容器时,如果将它们放在同一网络中,则可以通过您指定的名称从其他容器连接到容器。
| 归档时间: |
|
| 查看次数: |
31495 次 |
| 最近记录: |