【问题标题】:running docker gives Ports are not available error运行 docker 给出端口不可用错误
【发布时间】:2020-07-04 22:34:29
【问题描述】:

docker run --rm -it -p 8080:80 mcr.microsoft.com/dotnet/core/runtime:3.1
docker run --rm -it -p 8080:80 mcr.microsoft.com/dotnet/core/sdk:3.1
docker run --rm -it -p 8080:80 mcr.microsoft.com/dotnet/core/aspnet:3.1

当我运行上述任何 docker 命令来创建容器时,我收到以下错误。我为 linux 和 windows 都得到了这个。

C:\Program Files\Docker\Docker\resources\bin\docker.exe:来自守护进程的错误响应:端口不可用:listen tcp 0.0.0.0:8080:bind:试图访问一个套接字一种被其访问权限所禁止的方式。 time="2020-03-24T17:20:44+05:30" level=error msg="error waiting for container: context cancelled"

我尝试了this SO ans 中给出的建议来找到进程 ID 并杀死它。

我还得到了here 建议的进程黑客来观察那个进程是什么。看起来它是一个系统进程。

谁能建议可以做什么?

【问题讨论】:

    标签: docker


    【解决方案1】:

    -p 8080:80 表示“将主机上的 8080 端口转发到容器中的 80 端口”。 80 端口由容器镜像决定。端口 8080 是任意的——它是您选择的端口。

    所以改为使用-p 8081:80,现在您将浏览器指向 localhost:8081 而不是 localhost:8080。

    如果那个不起作用,那可能是你的防火墙?

    (请参阅https://pythonspeed.com/articles/docker-connection-refused/ 了解端口转发的工作原理图)。

    【讨论】:

    • 8081 有效。这就是我现在的工作方式。但对 8080 为何不工作感到好奇。其实8080前几天就可以工作了。现在我很困惑为什么它不起作用。
    【解决方案2】:

    您多次分配相同的主机端口8080,这是不允许的 - 在任何操作系统上。

    运行此命令后

    docker run --rm -it -p 8080:80 mcr.microsoft.com/dotnet/core/runtime:3.1
    

    第一个容器立即获得分配给主机的端口8080,我们也可以在您提供的控制台屏幕截图中看到。而其他人则失败了,因为他们根本没有得到他们想要的端口。为了让所有容器都可以启动,你应该为每个容器使用不同的端口,la

    docker run --rm -it -p 8080:80 mcr.microsoft.com/dotnet/core/runtime:3.1
    docker run --rm -it -p 8081:80 mcr.microsoft.com/dotnet/core/sdk:3.1
    docker run --rm -it -p 8082:80 mcr.microsoft.com/dotnet/core/aspnet:3.1
    

    然后您应该能够通过各自的端口 808080818082(在 localhost 或您机器的本地网络 IP,例如 192.168.1.20)访问这些容器。

    【讨论】:

    • 我并没有一个接一个地运行这三个容器来生成三个容器,因为端口冲突。可能是我的问题介绍不正确。
    • @VivekDev 乍一看,是的。但是,好吧,没问题。正如我在回答中指出的那样,您能否尝试连续运行所有三个容器,并提供反馈。谢谢。
    • 我的意思是,作为反馈,您可以在启动容器后分享docker ps 的输出。
    • 8080 正如我所说的那样给出了问题。对于另外两个,我不得不在不同的命令提示符下运行它们,而不是在相同的命令提示符下运行它们。然后他们正在工作。原因是 -it 标志。它处于交互模式并从创建的容器中返回命令提示符
    • 好吧,也许8080 端口被 docker 以外的其他东西阻塞了。我可以在我的 Linux 机器上运行所有 3 个容器并且它工作正常。如果你想让它们在后台工作,你可以使用-d 标志而不是-it(你可能已经知道了)。
    【解决方案3】:

    这个答案解决了我认为的两个错误。

    错误 1(如果在 Windows Defender 防火墙中为 Docker 的现有规则指定了错误的端口):

    无法在本地找到图像 'docker102tutorial:latest' docker:错误 来自守护进程的响应: docker102tutorial 的请求访问被拒绝, 存储库不存在或可能需要“docker login”:拒绝: 请求的资源访问被拒绝。

    错误 2(如果根本没有 Windows Defender 防火墙规则并且在 -p 参数的 docker run 命令中指定了 #:8080):

    来自守护进程的错误响应:端口不可用:listen tcp 0.0.0.0:8080: bind: 试图以访问权限禁止的方式访问套接字。

    在 Windows 10 中,您需要通过 Windows Defender 防火墙允许此操作。你会得到这个对话框。您可能能够在 Windows Defender 防火墙中限制 TCP 默认(或 UDP)行的端口。规则的表格屏幕截图是在修改端口并更正最后一个错误之前拍摄的。我相信这种情况下的客户端是 WSL 2,服务器是 Windows,这意味着需要在服务器上打开传入端口。

    在 Windows Defender 防火墙中允许本地端口 8080,以便它与运行命令中“:”之后的端口匹配:

    然后您将收到此错误。

    要更正,请从“Defer to user”更改为“Defer to application”

    【讨论】:

      【解决方案4】:

      您可以通过以下方式分配外部端口:

      • 在 Dockerfile 中添加 EXPOSE 指令,例如EXPOSE 8080
      • 在运行时使用 –expose 标志来公开端口,如下所示:docker -expose=8080 test
      • 使用 Docker 运行字符串中的 -p 标志或 -P 标志来发布如上所述的端口,即docker run --rm -it -p 8080:80 mcr.microsoft.com/dotnet/core/runtime:3.1

      但你只能这样做一次

      【讨论】:

        【解决方案5】:

        以管理员模式打开PowerShell并输入命令

        net stop http
        

        该命令列出(并让您选择停止)当前使用端口 80 的所有服务。

        您现在可以使用端口 80 启动您的 docker 容器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-01
          • 2017-04-20
          • 1970-01-01
          • 2017-11-05
          • 1970-01-01
          • 2021-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多