运行 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版本:
- Docker 版本 1.12.3,构建 6b644ec`
- docker-compose version 1.8.1, build 004ddae`
- docker-machine.exe 版本 0.8.2,构建 e18a919`
如有任何帮助,我们将不胜感激。谢谢。
这是由端口编号冲突引起的: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] 的回答:
这是一个人的解决方法(从本线程的末尾开始——我自己还没有尝试过):
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 的东西起作用了。
我终于明白了 运行。以下是您可能想尝试的一些方法(因为我不确定实际修复它的是什么)。
- 找到 "Docker Desktop" 并右击 "Run as Administrator..."
- 注意它抱怨的端口。有人说这可能只是 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
后,它现在创建了容器,我可以远程调试它。
这就是我在尝试所有事情后对我有用的方法。看来我们需要终止 运行 进程。
退出docker,右击图标退出Docker桌面
打开windows任务管理器,找到并杀死进程com.docker.backend.exe
重启docker,双击图标打开Docker桌面
我知道 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版本:
- Docker 版本 1.12.3,构建 6b644ec`
- docker-compose version 1.8.1, build 004ddae`
- docker-machine.exe 版本 0.8.2,构建 e18a919`
如有任何帮助,我们将不胜感激。谢谢。
这是由端口编号冲突引起的: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] 的回答:
这是一个人的解决方法(从本线程的末尾开始——我自己还没有尝试过):
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 的东西起作用了。
我终于明白了 运行。以下是您可能想尝试的一些方法(因为我不确定实际修复它的是什么)。
- 找到 "Docker Desktop" 并右击 "Run as Administrator..."
- 注意它抱怨的端口。有人说这可能只是 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
后,它现在创建了容器,我可以远程调试它。
这就是我在尝试所有事情后对我有用的方法。看来我们需要终止 运行 进程。
退出docker,右击图标退出Docker桌面
打开windows任务管理器,找到并杀死进程com.docker.backend.exe
重启docker,双击图标打开Docker桌面