Как открыть сокет TCP Docker на WSL2? (Docker, установленный WSL, а не Docker Desktop)

Я хочу подключиться к TCP-сокету Docker, работающему в WSL2, через PyCharm. Кажется, я не могу открыть сокет, я думаю, возможно, из-за ограниченного контроля над docker-daemon в WSL2 (systemctl)? Я не могу использовать Docker Desktop, потому что мне нужна поддержка графического процессора (Windows Dev Channel + nvidia-docker). Я пробовал следующее:

экспорт DOCKER_HOST = tcp: //0.0.0.0: 2375

$ export DOCKER_HOST=tcp://0.0.0.0:2375
$ sudo service docker restart
$ docker context ls
NAME                DESCRIPTION                               DOCKER ENDPOINT      KUBERNETES ENDPOINT   ORCHESTRATOR
default *           Current DOCKER_HOST based configuration   tcp://0.0.0.0:2375                         swarm
Warning: DOCKER_HOST environment variable overrides the active context. To use a context, either set the global --context flag, or unset DOCKER_HOST environment variable.
$ curl --unix-socket /var/run/docker.sock http:/localhost/version
{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"19.03.11","Details":{"ApiVersion":"1.40","Arch":"amd64","BuildTime":"2020-06-01T09:10:54.000000000+00:00","Experimental":"false","GitCommit":"42e35e61f3","GoVersion":"go1.13.10","KernelVersion":"4.19.121-microsoft-standard","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"1.2.13","Details":{"GitCommit":"7ad184331fa3e55e52b890ea95e65ba581ae3429"}},{"Name":"runc","Version":"1.0.0-rc10","Details":{"GitCommit":"dc9208a3303feef5b3839f4323d9beb36df0a9dd"}},{"Name":"docker-init","Version":"0.18.0","Details":{"GitCommit":"fec3683"}}],"Version":"19.03.11","ApiVersion":"1.40","MinAPIVersion":"1.12","GitCommit":"42e35e61f3","GoVersion":"go1.13.10","Os":"linux","Arch":"amd64","KernelVersion":"4.19.121-microsoft-standard","BuildTime":"2020-06-01T09:10:54.000000000+00:00"}
$ curl http://localhost:2375/version
curl: (7) Failed to connect to localhost port 2375: Connection refused

Последняя команда, которую я ожидаю, даст результат типа {"Version":"17.05.0-ce","ApiVersion":"...}, но в соединении отказано. Действительно, если я пытаюсь подключиться через хост Windows, Pycharm отказывает в подключении. Я также вижу много руководств / сообщений SO, в которых говорится не использовать этот подход DOCKER_HOST, но я не уверен, почему.

/lib/systemd/system/docker.service ›ExecStart

Согласно stackoverflow, serverfault , ivankrizsan, Я редактировал /lib/systemd/system/docker.service с помощью ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375. Но когда я пытаюсь systemctl daemon-reload, это ошибки; WSL2 не поддерживает systemctl команды (WSL / 457).

$ sudo systemctl daemon-reload
System has not been booted with systemd as init system (PID 1). Can't operate.

Я также попытался перезапустить WSL2 (Powershell wsl --shutdown, повторно открыть WSL2) на случай, если docker-daemon подберет эти изменения, но не сигару.

$ curl http://localhost:2375/version
curl: (7) Failed to connect to localhost port 2375: Connection refused

/ etc / default / docker ›DOCKER_OPTS

Согласно stackoverflow, я редактировал /etc/default/docker с помощью DOCKER_OPTS="-H unix:// -H tcp://0.0.0.0:2375", затем sudo service docker restart. То же соединение отклонило ошибки.


person lefnire    schedule 14.08.2020    source источник


Ответы (1)


Быстрое исправление (небезопасно)

Из Gist

1. /etc/docker/daemon.json

{"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}

2. sudo service docker restart


Долгое исправление (TLS)

Поддержка TLS: более подробная информация об ошибке сервера, пошаговая запись в блоге. Если вы настраиваете Docker на сервере, я рекомендую следить за публикацией в блоге. Мне просто нужен Docker в WSL2, сокет, доступный для Windows (PyCharm), и безопасный TLS. Поэтому мои модификации используют ~/.docker & localhost (а не корневые папки и полное доменное имя). Вот мои шаги:

1. /etc/docker/daemon.json

"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tlscacert": "/home/lefnire/.docker/certs/ca.pem",
"tlscert": "/home/lefnire/.docker/certs/server-cert.pem",
"tlskey": "/home/lefnire/.docker/certs/server-key.pem",
"tlsverify": true

Обратите внимание, что я использую ~/.docker/certs вместо /etc/docker/certs. Я столкнулся с препятствиями в разрешении, когда PyCharm нуждался в доступе к папке сертификатов даже при chmod -v 0444 x попытках.

2. Сертификаты

$ mkdir ~/.docker/certs
$ cd ~/.docker/certs
$ openssl genrsa -aes256 -out ca-key.pem 4096  # enter passphrase
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem  # enter localhost at FQDN step
$ openssl genrsa -out server-key.pem 4096
$ openssl req -subj "/CN=localhost" -sha256 -new -key server-key.pem -out server.csr
$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
$ echo subjectAltName = DNS:localhost,IP:127.0.0.1 >> extfile.cnf
$ echo extendedKeyUsage = serverAuth >> extfile.cnf
$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
$ openssl genrsa -out key.pem 4096
$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr
$ echo extendedKeyUsage = clientAuth > extfile-client.cnf
$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf

Игнорировать ошибки RAND openssl (или исправить)

3. sudo service docker restart

4. PyCharm (необязательно)

  1. File > Settings > Build, Execution, Deployment > Docker
    1. Add Docker (or click existing) > [x] TCP Socket
    2. URL API двигателя: https://localhost:2376
    3. Папка сертификатов: \\wsl$\Ubuntu-18.04\home\lefnire\.docker\certs
  2. File > Settings > Project: [my-proj] > Python Interpreter
    1. Dropdown > Show All... > Add > Docker
person lefnire    schedule 14.08.2020