簡體   English   中英

如何在 WSL2 上公開 Docker TCP 套接字? (WSL 安裝 Docker,不是 Docker 桌面)

[英]How to expose Docker TCP socket on WSL2? (WSL-installed Docker, not Docker Desktop)

我想通過 PyCharm 連接到在 WSL2 中運行的 Docker TCP 套接字。我似乎無法公開套接字,我想可能是因為 WSL2 (systemctl) 中對 docker-daemon 的控制有限? 我不能使用 Docker 桌面,因為我需要 GPU 支持(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

根據stackoverflowserverfaultivankrizsan ,我使用/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 ,我使用DOCKER_OPTS="-H unix:// -H tcp://0.0.0.0:2375"編輯/etc/default/docker docker,然后sudo service docker restart 相同的連接被拒絕錯誤。

快速修復(不安全)

要點

1. /etc/docker/daemon.json

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

2. sudo service docker restart


長修復 (TLS)

TLS 支持:更詳細的 serverfault 分步博客文章 如果您要在服務器上設置 Docker,我建議您關注博文。 對我來說,我只想要 WSL2 中的 Docker、Windows (PyCharm) 可訪問的套接字和 TLS 安全。 所以我的修改使用~/.dockerlocalhost (而不是根文件夾和 FQDN)。 這是我的步驟:

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 即使使用chmod -v 0444 x嘗試,我也遇到了 PyCharm 需要訪問“證書文件夾”的權限障礙。

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

忽略 openssl RAND 錯誤(或修復它

3. sudo service docker restart

4. PyCharm(可選)

  1. 文件 > 設置 > 構建、執行、部署 > Docker
    1. 添加 Docker(或點擊現有)> [x] TCP 插座
    2. 引擎 API URL: https://localhost:2376
    3. 證書文件夾: \\wsl$\Ubuntu-18.04\home\lefnire\.docker\certs
  2. 文件 > 設置 > 項目:[my-proj] > Python 解釋器
    1. 下拉 > 顯示全部... > 添加 > Docker

就我而言,問題是

-H fd://

無法加載偵聽器修復

  1. 檢查日志。 tail -f /var/log/docker.log

無法加載偵聽器:通過套接字激活找不到 sockets:確保服務由 systemd 啟動

  1. 編輯文件/lib/systemd/system/docker.service ,將fd://替換為unix://

Docker Desktop 通過代理將 docker.sock 作為 Windows 中的命名管道公開,我認為這是最安全、最方便的連接方式。 因此,對於沒有 Docker 桌面的環境,我編寫了一個小代理應用程序並將其打包為一個容器。 這樣就像執行“docker run”來安裝它一樣簡單。

在此處閱讀更多相關信息https://devopsifyme.com/how-to-install-and-connect-to-docker-on-wsl/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM