运行 Docker for Windows,暴露端口时出错

Running Docker for Windows, Error when exposing Ports

我知道 windows 上有很多关于 运行ning Docker 的问题,但是这个问题是关于 运行ning 全新的 [=51] =] 对于 Windows,在 Windows.
就我而言,我使用的是 Windows 10 Pro 64 位。根据该站点,应该支持此版本。
我一直在关注我在这里找到的教程: https://prakhar.me/docker-curriculum/
当然,我也尝试遵循官方指南:https://docs.docker.com/docker-for-windows/

在这两个教程中,当尝试使用 -P 参数分配端口或尝试指定端口时,我收到相同的错误消息 -p 8080:5000:

在官方指南中我运行docker run -d -p 80:80 --name webserver nginx得到:

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint webserver (f9946544e4c6ad2dd9cb8cbccd251e4d48254e86562bd8e6da75c3bd42c7e45a): Error starting userland proxy: mkdir /port/tcp:0.0.0.0:80:tcp:172.17.0.2:80: input/output error.

按照非官方指南 运行 docker run -p 8888:5000 prakhar1989/catnip 得到基本相同的错误:

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint focused_swartz (48a0c005779c6e89bf525ead2ecff44a7f092495cd22ef7d19973002963cb232): Error starting userland proxy: mkdir /port/tcp:0.0.0.0:8888:tcp:172.17.0.2:5000: input/output error.

如果我不尝试分配端口,容器会 运行,但我不知道如何访问它。

我是运行宁的docker版本:

如有任何帮助,我们将不胜感激。谢谢。

这是由端口编号冲突引起的:github issue here https://github.com/docker/compose/issues/3277

基本上端口正在使用中!重置起作用的原因是它清除了其他映射。

这里有一个新的变化。

最后的 Windows 10 更新(秋季创作者更新,2017 年)有一个新的 "feature"。它会自动启动上次关闭时 运行 的任何应用程序。

这为处于不良状态的 Windows 重组了 Docker。这使得那些端口似乎被其他东西使用了——它本身就是幽灵。这解释了为什么即使我 stopped/started 我的容器甚至重新启动这些端口仍在使用中!

这种情况下的解决方案是简单地重新启动 Docker 守护程序。

为防止下次关机后出现这种情况,请不要使用关机按钮。改为输入:

shutdown /s /t 0

这会绕过新功能。

在本帖中查看 Jason[MS] 的回答:

https://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_perf-insiderplat_pc/programs-autostart-after-boot-in-windows-10-fall/09dd8d3e-7b36-45d1-9181-6587dd5d53ab

这是一个人的解决方法(从本线程的末尾开始——我自己还没有尝试过):

http://www.icttoolbox.nl/info/stop-windows-10-creator-fall-reopening-programs-reboot/

1) 停止所有 运行ning 容器 docker stop $(docker ps -a -q) 然后

2) 在您的机器上停止 Docker 并重新启动它。

然后运行需要的命令。这将解决问题。

重新启动 Docker 守护进程暂时解决了这个问题,但为了最终摆脱它,我不得不 禁用 Windows 10 快速启动 ,这是@biscuit314 描述的功能。

要禁用 Windows 10 快速启动,进入 控制面板 > 电源选项 > 选择电源按钮的功能>更改当前不可用的设置>取消选中打开快速启动(推荐)并点击保存更改

对于 Linux - Debian 用户,

只有当你知道是否要停止所有的时候才使用docker stop $(docker ps -a -q)容器与否....如果是,那么请 运行 docker rm $(docker ps -a -q) 到删除容器....

然后停止 docker 守护进程 - systemctl stop docker 然后启动 docker 守护进程 - systemctl start docker

同时验证 docker 守护进程是否启动 - service docker status

完成上述步骤后ps你应该没问题.....

尝试停止 docker 并在管理员模式下再次启动它。在管理员模式下开始打开电源 shell 之后。 因为错误显示 "mkdir" 也许这会解决您的问题。我不确定,但它对我有用。 在使用 -P 的情况下,一旦 -P 将随机选择端口,端口冲突就不会成为错误的原因。它本身的错误对我来说不是很友好,但是因为我看到上面的 mkdir 字样,我想这可能是一个权限错误,这就是为什么我在管理员模式下重新启动 docker 并启动电源 shell管理员模式。

如果它在 windows OS,请重新启动 Docker 这已经解决了我的问题

我尝试了关于这个问题的所有建议:杀死所有容器,重新启动 Docker 桌面,禁用 "Fast Startup," 重新启动我的计算机,确保 "Experimental Features" 被禁用。 None 的东西起作用了。

我终于明白了 运行。以下是您可能想尝试的一些方法(因为我不确定实际修复它的是什么)。

  1. 找到 "Docker Desktop" 并右击 "Run as Administrator..."
  2. 注意它抱怨的端口。有人说这可能只是 Docker 不友好的说法 "that port is in use." 在我的例子中,端口是 80。我在 Windows Pro 上进入服务并禁用 "World Wide Web Publishing Service" 为了安全起见。

我之前在 window 10 上遇到过同样的问题。 重新启动 docker,有效

如果您是因为在 Visual Studio 2019 年遇到此问题而来到这里:

根据this post,VS 团队正在准备在 16.5 版本中修复此问题,同时,您可以在 launchSettings.json 中添加 属性 "publishAllPorts": true ,例如:

"Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:44374", #<== Set a fixed port
      "environmentVariables": {
        "ASPNETCORE_URLS": "https://+:44374;https://+:5000",
        "ASPNETCORE_HTTPS_PORT": "44374"
      },
      "publishAllPorts": true, #<== This is equivalent to the -P flag in 'docker run'
      "useSSL": true
    }

请注意 属性 "httpPort": XYZT 未定义。定义它将使解决方法不起作用。

这个设置对我有用:

  • Windows 10 1709 Build 16299.1747 快速启动 关闭
  • Docker 桌面版 2.2.05 (43884)
  • Docker 引擎 19.03.8
  • Visual Studio 2019 企业版 16.5.4.
  • Microsoft.VisualStudio.Azure.Containers.Tools.Targets 1.10.8

我意识到 VS 正在创建的命令包含两次 -p 参数,一次使用我指定的端口,另一个使用端口 80,如下所示:-p 3010:80 -p 3010:3010.

添加 publishAllPorts 后,它现在创建了容器,我可以远程调试它。

这就是我在尝试所有事情后对我有用的方法。看来我们需要终止 运行 进程。

  1. 退出docker,右击图标退出Docker桌面

  2. 打开windows任务管理器,找到并杀死进程com.docker.backend.exe

  3. 重启docker,双击图标打开Docker桌面