【问题标题】:Port issue with Docker for WindowsDocker for Windows 的端口问题
【发布时间】:2019-09-11 14:43:56
【问题描述】:

我正在尝试在 training.play-with-docker.com 关注 the beginner tutorial。在任务 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

我对@9​​87654335@ 进行了小改动,将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

【问题讨论】:

    标签: docker


    【解决方案1】:

    试试这个

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

    【讨论】:

    • 我不知道你是怎么找到的,但这绝对解决了我在端口 3306 上的问题!谢谢!
    • 这对我也有帮助。谢谢。
    • 工作得很好!谢谢!
    【解决方案2】:

    部分问题在于您使用了错误的映射。应用程序使用端口 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 上查看的方式
    • 我认为这可以解决它,并且我认为培训网站上的链接不起作用是与此无关的错误/错误。我只会在 localhost 上查看输出,而不是他们的自定义 URL。
    • 很抱歉回答迟了,我没有注意到浏览器在正确的端口上打开了。我应该多加注意
    【解决方案3】:

    这可能是因为您的 IIS 或其他服务器已经在端口 80 上运行。 尝试停止 IIS,它应该可以工作。

    参考:https://forums.docker.com/t/error-starting-userland-proxy-listen-tcp-0-0-0-0-bind-an-attempt-was-made-to-access-a-socket-in-a-way-forbidden-by-its-access-permissions/81299/7

    【讨论】:

      【解决方案4】:

      @himanshupareek66 是对的。这里有一个关于如何禁用 IIS 的教程:https://windowsjet.com/disabling-iis-internet-information-services-in-windows-10-879/#1

      这对我有用。

      【讨论】:

        猜你喜欢
        • 2022-11-03
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多