Docker for Windows的端口问题

jm81lzqq  于 2023-04-29  发布在  Docker
关注(0)|答案(3)|浏览(124)

我在训练中试着跟随the beginner tutorial。与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 Desktop。我试着按照建议的here重置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

另一个highly-upvoted answer suggests我需要“禁用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

hpxqektj

hpxqektj1#

试试这个

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

b5buobof2#

问题的一部分在于您使用了错误的Map。应用程序使用端口80,但您正在将端口1337Map到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

相关问题