Go net.Listen () не может привязаться к порту службы докера после обновления до версии докера 19.03.2 - PullRequest
0 голосов
/ 03 октября 2019

Я использую docker-compose для предоставления службы docker на моем компьютере с Windows 10.

Кроме того, я использую функцию в 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.

Это происходит только после обновления до версии 19.03.2 для docker-for-windows.

Может кто-нибудь помочь мне решить эту проблему?

ОБНОВЛЕНИЕ:

Возник вопрос: Что такое исключения из администрируемых портов в windows10?

Это правда, что порт 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 (), который не может связаться с портом, который используется дляконтейнерный сервис докер.

1 Ответ

0 голосов
/ 17 октября 2019

После обновления Docker net.Listen() не удалось проверить связь с портом, который уже используется для предоставления службы контейнера Docker.

В качестве обходного пути я использовал net.Dial()вместо net.Listen() в коде go. Работает как положено.

...