无法在网络nat上创建端点:hnsCall在Win32中失败:进程无法访问文件

时间:2018-12-18 15:19:12

标签: docker dockerfile

我正在尝试运行以下docker命令(最新Win10 Fall 2018更新,最新docker版本2.0):

docker run -d -p 1433:1433 -e sa_password=Test_123 -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

但是它失败并出现以下错误:

  

守护程序的错误响应:无法创建端点   网络nat上的unruffled_wozniak:hnsCall在Win32中失败:该进程   无法访问该文件,因为该文件正在被另一个进程使用。   (0x20)。

我尝试了以下操作:

  • 重新启动守护程序
  • docker system prune -a
  • 重启机器
  • 重新启动HNS服务
  • 重新安装docker
  • 从Windows禁用容器和Hyper-V功能

没有任何效果。有什么建议吗?

6 个答案:

答案 0 :(得分:3)

在尝试使PostgreSQL与Docker一起运行时,我遇到了同样的问题。问题在于该端口已被捆绑!这是因为我的操作系统中已经有PostgreSQL作为普通数据库运行。

我的解决方法是在任务管理器中(位于“服务”下)找到postgresql-x64-10服务并停止该服务。

解决方案听起来似乎很明显,但我想还是要提一下它

答案 1 :(得分:3)

如果您在具有Linux容器的Docker中并且存在使用Windows容器中端口的挂起容器,则在Windows中会发生这种情况。 尝试将容器切换到其他操作系统,然后停止容器过程。 这对我有用。

答案 2 :(得分:2)

不知道这有多明智,但是我检查了该端口未与其他应用程序一起使用,仍然出现错误。

这对我来说已经解决了几次。在 PowerShell管理控制台中,运行以下命令:

Stop-Service docker
Stop-service hns
Start-service hns
Start-Service docker
docker network prune

部分来自this post

答案 3 :(得分:1)

windows 上检查端口侦听器: PS:> Get-NetTCPConnection | findstr 1433

在我的情况下: enter image description here

找到ID = 12240的进程并杀死它们(com.docker.backend)

我的新端口重定向工作正常后!!

答案 4 :(得分:0)

我遇到了同样的错误,但是无法停止在本地计算机上端口1433上运行的SQL Server服务,因此我只是将另一个端口映射到了容器。我将端口映射参数替换为以下内容:

-p 1434:1433

这会将您的本地计算机的端口1434映射到容器的端口1433。如果还使用了本地计算机的端口1434,则必须找到一个可用的端口。

一旦安装好,如果您想使用SSMS,只需使用逗号告诉它通过端口1434进行连接:localhost,1434

SQL Server Connection Dialog

答案 5 :(得分:0)

Linux 和 Windows 的错误消息似乎有所不同。

命令:

docker run -d -p 80:80 my_image

Linux 的错误信息:

docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

Windows 的错误消息:

docker: Error response from daemon: failed to create endpoint admiring_matsumoto on network nat: failed during hnsCallRawResponse: hnsCall failed in Win32: The process cannot access the file because it is being used by another process. (0x20).

更改命令后

docker run -d -p 81:80

两者都工作。

然后,我能够看到,就我而言,有一个 Windows Defender 崩溃的服务(应该停止)“保持”端口 80,我可以再次使用端口 80。