Docker - 连接本地主机端口4000失败:连接被拒绝

22

你好,我对Docker非常陌生,现在正在按照官网的教程来熟悉Docker。但我卡在了教程的第二部分(你可以通过此链接查看: => https://docs.docker.com/get-started/part2/#run-the-app)。

我有一个样例应用程序代码、Docker文件和requirements.txt文件,与官方教程完全相同。

$ ls
app.py  Dockerfile  requriements.txt

我的 Dockerfile 如下所示。
FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install -r requriements.txt
EXPOSE 80
ENV NAME World
CMD ["python", "app.py"]

所有3个文件的内容/代码与教程完全相同。我能够使用此命令构建镜像注册表。

$ docker build -t friendlyhello .

一切看起来都很不错。现在我有了样例项目镜像注册表。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED
friendlyhello       latest              82b8a0b52e91        39 minutes ago
python              2.7-slim            1c7128a655f6        5 days ago
hello-world         latest              48b5124b2768        4 months ago

我按照官方教程使用了以下命令来运行应用程序。
$ docker run -d -p 4000:80 friendlyhello
c1893f7eea9f1b708f639653b8eba20733d8a45d3812b442bc295b43c6c7dd5c

编辑:运行上述命令后,这是我的容器。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
c1893f7eea9f        friendlyhello       "python app.py"     15 minutes ago      Up 16 minutes

官方教程指导读者查看http://localhost:4000,因为他们已经将机器端口4000映射到容器端口80

不幸的是,我无法从该URL获得任何响应。

$ curl http://localhost:4000
curl: (7) Failed to connect to localhost port 4000: Connection refused

我完全是个新手,不知道该怎么办......该怎么让它运作起来呢?非常感谢任何回复。

编辑:我按照 @johnharris85 建议的做了。以下是输出结果。

$ curl http://$(echo docker-machine ip default):4000
curl: (6) Couldn't resolve host 'docker-machine'
curl: (6) Couldn't resolve host 'ip'
curl: (6) Couldn't resolve host 'default'

看起来它也不起作用。

编辑: @johnharris85更正了他的建议,@user8023051澄清了这个命令从哪里来以及在幕后发生了什么。现在它正在工作:)谢谢

$ curl http://$(docker-machine ip default):4000
<h3>Hello World!</h3><b>Hostname:</b> c1893f7eea9f<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>

2
请在执行 curl ... 命令之前,提供一下 docker ps -a 命令的输出结果好吗? - johnharris85
1
你是在使用Docker for Mac/Windows吗?还是Docker-Machine?或者是在Linux上使用Docker? - johnharris85
12
所以,你实际上并没有使用 Docker for Windows,Docker Toolbox 是另一种不同的工具。请尝试运行 curl http://$(echo docker-machine ip default):4000 命令? - johnharris85
是的,谢谢您的建议。我已经将输出放在了我的问题上方。 - Pakpoom Tiwakornkit
8
不要使用 echo 命令,直接使用 docker-machine ip default 命令。 - johnharris85
显示剩余6条评论
4个回答

63

虽然我对Docker不是很熟悉,但听起来您的设置是Docker实例运行在虚拟机中,您正在尝试从Windows计算机访问绑定到localhost(虚拟机)的应用程序。您之所以从curl这里收到拒绝是因为主机(Windows)上根本没有监听端口4000。

尝试通过以下方式找到您的Docker实例正在使用的IP地址:

$ docker-machine ip default

现在您已经知道IP地址,请再次尝试使用curl。您甚至可以在命令中进行评估,如下所示:

$ curl http://$(docker-machine ip default):4000


30
好像你只是把我的评论当作答案发布了 :p - johnharris85
我本意是要做一条注释 - 我是新手,刚刚在移动应用的反馈中看到了这个问题。我花了一些时间来回答,因为我最初认为可能被firewalld或ufw阻止了,直到我看到他在使用windows。实际上我没有看到你的评论,但在查看后,你建议他调用一个子shell来回显查找机器IP地址的命令,这将导致错误。 - kegn
1
@user8023051,感谢您解释了幕后发生的事情,并澄清了我为什么应该使用那个命令 :) 现在它可以工作了,谢谢。我接受了您的答案,干杯!!! - Pakpoom Tiwakornkit
给@johnharris85更多的赞,他现在可能感觉不太好 :D - Khan

13

如果你在Mac上运行Docker并尝试使用localhost连接你的依赖项(如postgres等),请将localhost替换为docker.for.mac.localhost


4
在 Docker 容器内部执行 curl http://localhost:8020 时出现了 "connection refused" 的错误。但是,使用 curl http://docker.for.mac.localhost:8020 则可以正常工作。请为我翻译这段内容。 - Justinas
1
谢谢!这对我有用!如果你正在使用PHP的curl,你也需要放置CURLOPT_PORT。 - Matias

2
您的docker配置中使用了9089端口,但是您的程序或服务器在不同的端口上运行。要检查xampp的端口,您可以使用以下方法,或尝试搜索谷歌以检查端口号:
前往xampp控制面板并查看图像下方的端口号。我已经用红色标出了那个端口号。在我的情况下,端口号是80。

enter image description here


0

Docker实例未在本地运行,而是在Docker机器上。您可以使用docker-machine ssh命令登录,然后在Docker机器上运行curl "localhost:6666"


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