Docker for Windows的端口问题

19

我正在尝试按照training.play-with-docker.com上的初学者教程。在任务2,步骤6中,我进行以下操作,然后出现以下错误:

PS C:\Users\david.zemens\Source\Repos\linux_tweet_app> docker container run --detach --publish 80:80 --name linux_tweet_app $DOCKERID/linux_tweet_app:1.0
d39667ed1deafc382890f312507ae535c3ab2804907d4ae495caaed1f9c2b2e1
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint linux_tweet_app (a819223be5469f4e727daefaff3e82eb68eb0674e4a46ee1a32e703ce4bd384d): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

我在本地的Win10机器上使用Docker桌面版。我已经按照这里建议的重置了Docker,但错误仍然存在。由于其他东西必须使用端口80,如果我使用不同的端口,应该就能避免这个错误了,对吗?

PS C:\Users\david.zemens\Source\Repos\linux_tweet_app> docker container run --detach --publish 1337:1337 --name linux_tweet_app $DOCKERID/linux_tweet_app:1.0

好的! 现在使用docker ps可以确认容器正在运行:

CONTAINER ID        IMAGE                         COMMAND                  CREATED              STATUS              PORTS                                     NAMES
b700df12c2d1        dzemens/linux_tweet_app:1.0   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp, 443/tcp, 0.0.0.0:1337->1337/tcp   linux_tweet_app

但是当我尝试查看教程中发送给我的网页时,浏览器会显示错误。

在此输入图片描述

我不确定链接是如何动态生成的,但它看起来类似于这样:

http://ip172-18-0-32-blsfgt2d7o0g00epuqi0-80.direct.labs.play-with-docker.com/

以下是浏览器错误:

The proxy could not connect to the destination in time.
URL: http://ip172-18-0-32-blsfgt2d7o0g00epuqi0-80.direct.labs.play-with-docker.com/
Failure Description: :errno: 104 - 'Connection reset by peer' on socketfd -1:server state 7:state 9:Application response 502 cannotconnect

另一个得到高赞的回答建议我需要"禁用Windows 10快速启动"——我还没有尝试,主要是因为我不确定该设置的全部后果。

我是否漏掉了一些非常明显的东西?我不能在不同的端口上运行吗?如果不能,为什么?如果我必须使用80:80,但系统已经使用了该端口,那么如果我尝试杀死该pid,我将遇到进一步的问题,对吗?

PS C:\Users\david.zemens\Source\Repos\linux_tweet_app> netstat -a -n -o | findstr :80 | findstr LISTENING
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:8003           0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       1348
  TCP    0.0.0.0:8081           0.0.0.0:0              LISTENING       4688
  TCP    127.0.0.1:8080         0.0.0.0:0              LISTENING       2016
  TCP    127.0.0.1:8082         0.0.0.0:0              LISTENING       28536
  TCP    [::]:80                [::]:0                 LISTENING       4
  TCP    [::]:8003              [::]:0                 LISTENING       4
  TCP    [::]:8080              [::]:0                 LISTENING       1348
  TCP    [::]:8081              [::]:0                 LISTENING       4688

我在Dockerfile中进行了一个小更改,将EXPOSE 80 443更改为EXPOSE 1337 443,现在可以通过在浏览器中导航到localhost:1337来查看我的应用程序。我认为这将使我通过培训模块的下一步,但仍然好奇是否做错了什么。

不管更改Dockerfile是否生效(我已经在更改Dockerfile后删除和重新发布),这似乎都可以工作。

PS C:\Users\david.zemens\Source\Repos\linux_tweet_app> docker container run --detach --publish 1337:80 --name linux_tweet_app $DOCKERID/linux_tweet_app:1.0

输入图片描述

4个回答

46

试试这个

> net stop winnat
> docker start ...
> net start winnat

4
我不知道你是怎么找到这个的,但它确实解决了我在3306端口上的问题!谢谢! - Baze_
这也对我有所帮助。谢谢你。 - JonHendrix
工作得非常好!谢谢! - Sandro Stadler
为什么这个有效?3306/MySQL 对我来说有点问题。 - SavageCore

7

1
那就是我的情况! - Evgeny

6

问题的一部分在于您使用了错误的映射方式。应用程序使用端口80,但您将端口1337映射为1337。

正确的命令应该是:

PS C:\Users\david.zemens\Source\Repos\linux_tweet_app> docker container run --detach --publish 1337:80 --name linux_tweet_app $DOCKERID/linux_tweet_app:1.0

好的,抱歉,我上面所做的Dockerfile更改似乎是不必要的(貌似两种方式都可以工作???),而且我已经使用了 --publish 1337:80 来完成这个操作。这就是我能够在本地主机上查看的原因:localhost:1337 - David Zemens
我认为这解决了问题,而训练网站上链接无法工作,我认为这是他们端口的错误,与此无关。我将在本地主机上查看输出,而不是使用他们的自定义URL。 - David Zemens
抱歉回复晚了,我没有注意到浏览器打开的端口不对。我应该更加注意。 - Stefano

0
尝试在运行项目时,在命令的末尾添加--port-cdn=9002。(9002可以更改为其他可用端口。)

你的回答可以通过提供更多的支持性信息来改进。请[编辑]添加进一步的细节,比如引用或文档,以便他人能够确认你的回答是正确的。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

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