Go net.Listen()在更新到docker版本19.03.2后无法绑定到docker服务端口

问题描述 投票:0回答:1

我正在使用docker-compose在Windows 10计算机中公开docker服务。

此外,在golang中使用函数来检查服务是否完全启动:

package main
import (
"fmt"
"net"
)

func main() {
    err := ping(9800)
    fmt.Println(err)
}


func ping(port uint16) (err error) {
    fmt.Println("checking port:", port)
    conn, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", port))
    if err != nil {
        return
    }
    conn.Close()
    return
}

现在使用的Docker和Go版本是:

C:\>docker version

Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:26:49 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.2
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.8
  Git commit:       6a30dfc
  Built:            Thu Aug 29 05:32:21 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683


C:\>go version

go version go1.13.1 windows/amd64

容器已启动,服务已通过hostPort 50014公开:

C:\>docker ps

CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS                      NAMES
48eeb27f5ddc   d.reg.io/adata   "/usr/local/bin/adat…"   7 seconds ago   Up 4seconds  0.0.0.0:50014->50014/tcp   desktop_adata_1

[运行go脚本绑定到端口50014时,它返回错误:

C:\>go run ping.go

checking port: 50014
listen tcp 127.0.0.1:50014: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

仅在更新docker-for-windows版本19.03.2。之后才会发生。

有人可以帮我解决这个问题吗?

UPDATE:

有一个问题:What is Administered port exclusions in windows 10?

端口50014确实在受管理的端口排除范围内。

我认为从该排除列表中删除端口或使用任何其他端口都可以。但是我分别使用主机端口80、8080、50014和9800公开了该服务,并试图将它们绑定。但是每次失败。

端口80和8080是不排除的端口。容器已启动,服务正在端口上侦听。但是在尝试使用go函数进行绑定时却给出了错误:

 checking port: 80
 listen tcp 127.0.0.1:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

端口50014在管理的端口排除范围内。容器已启动,服务正在端口上侦听。尝试绑定时也会给出相同的错误:

 checking port: 80
 listen tcp 127.0.0.1:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

端口9800在正常端口排除范围内。所不同的是,这次容器将不能装满。 Docker无法使用该主机端口公开服务。运行docker-compose up -d时将给出错误:

Creating desktop_adata_1 ... error                                                                                                                                                                                                      
ERROR: for desktop_adata_1  Cannot start service adata: driver failed programming external connectivity on endpoint desktop_adata_1 (1a5978c5fbf35cb08fce14c8d5192756b3de8a77bd815f490e3e8ce542abaeaa): Error starting userland proxy: listen tcp 0.0.0.0:9800: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

这意味着,在我的情况下,错误的原因是net.Listen()无法绑定到用于Docker容器服务的端口。

我正在使用docker-compose在Windows 10计算机中公开docker服务。另外,使用golang中的函数检查服务是否已完全启动:package main import(“ fmt”“ net” ...

go windows-10 permission-denied docker-for-windows
1个回答
0
投票

在docker更新后,net.Listen()无法ping到已经用于公开Docker容器服务的端口。

© www.soinside.com 2019 - 2024. All rights reserved.