簡體   English   中英

Pycharm Docker Unix / TCP套接字(使用unix:///var/run/docker.sock):權限被拒絕

[英]Pycharm Docker Unix / TCP socket (with unix:///var/run/docker.sock): Permission Denied

嘗試在PyCharm Professional版本中設置Docker時出現Permission Denied錯誤。 我在Debian Jessie(BunsenLabs)。

Cannot connect: io.netty.channel.AbstractChannel$AnnotatedConnectException: connect(..) failed: Permission denied: /var/run/docker.sock
caused by: java.net.ConnectException: connect(..) failed: Permission denied

它既有默認設置(使用Unix套接字),也有TCP套接字,Engine API URL = unix:///var/run/docker.sock (它有意義嗎?)。

如果我們查看套接字上的權限:

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Jul  5 11:18 /var/run/docker.sock

我們看到它由root和docker組擁有。

所以我嘗試將我的用戶添加到docker組(使用sudo usermod -a -G docker USERNAME ),然后重新啟動Docker服務(使用sudo service docker restart ),但它仍然無效。

允許PyCharm使用套接字的一種方法是使用root權限運行它,即sudo pycharm ,但我想避免這種情況。 我還能夠通過為套接字上的其他人設置讀寫權限來解決這個問題( sudo chmod o+rw /var/run/docker.sock ),但現在每個人都可以在沒有管理員權限的情況下在該機器上使用Docker。

允許PyCharm連接到Docker套接字最安全的方法是什么?

此外,請注意Docker在命令行上運行正常。 在快速和臟修復( chmod o+rw )之前,我不得不使用sudo docker ,並更新了/etc/sudoers以不輸入此命令的密碼。 現在它即使沒有sudo也可以工作。 它感覺不安全,但它是一台開發機器,所以如果沒有其他解決方案,我會保持這樣。

編輯:我正在添加其他重要信息。

首先,在Docker組中添加我的用戶確實是要走的路。 問題是,當使用sudo usermod ,不會立即反映您正在使用的用戶帳戶的更改。 您需要注銷並再次登錄才能刷新系統。 本帖和答案中的更多信息: 將用戶添加到組但在運行“id”時不反映

其次,在Docker組中添加自己允許權限提升! 任何能夠在沒有sudo情況下運行docker (因此無需輸入密碼)的用戶也可以運行容器,其中系統的根安裝在卷中: docker run -v /:/host_root -it --rm ubuntu /bin/bash 由於您是容器中的root用戶,這意味着您可以像操作主機上的root一樣操作主機系統。 在Docker組中添加用戶之前,請考慮這一點。

我假設,您的用戶名已經在docker組中。 要檢查這一點,請發出以下命令。

id -nG

如果沒有,則需要通過下面的命令將用戶添加到docker組中。

sudo groupadd docker
sudo usermod -aG docker $USER

當您執行命令sudo systemctl start docker ,它會創建一個docker進程。 dockerd進程包含dockerd守護程序線程。 該命令還會創建默認的docker.sock Unix套接字。 dockerd守護程序線程持續監聽docker.sock套接字。 這使您可以使用docker.pid進程執行內核級IPC。 為了能夠使用此docker套接字,您需要具有進程級別( docker.pid )和文件級別( docker.sock )的適當權限。 因此,執行以下兩個命令可以解決您的問題。

sudo chmod a+rwx /var/run/docker.sock
sudo chmod a+rwx /var/run/docker.pid

如您所見,它在PyCharm中沒有顯示任何錯誤。 在此輸入圖像描述

注意:運行sudo dockerd -H unix:///var/run/docker.sock也會執行與上述相同的操作。

此外,您可以創建TCP套接字,以便可以將此TCP套接字用於您自己的主機以及任何遠程主機。

docker stop: sudo systemctl stop docker

dockerd -H tcp://127.0.0.1:2375 -H //你應該在執行這個命令之前停止dockerd -H tcp://127.0.0.1:2375 -H

啟動docker: sudo systemctl start docker

並且,請參閱下面PyCharm中成功的TCP docker socket連接。 在此輸入圖像描述

值得嘗試的另一個選擇是將您的docker守護程序暴露在localhost tcp inferface - ref

/etc/docker/daemon.json文檔,您可以編寫/etc/docker/daemon.json ,如下所示:

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

使用該設置,您可以嘗試重新啟動docker並在PyCharm首選項中配置TCP socket

似乎我的第一次嘗試(將自己添加到docker組中)是正確的。 但它需要重啟。

實際上,我很驚訝不要在groups命令的輸出中看到“docker”。 重啟后,它現在顯示“docker”。

我將套接字權限重置為之前的版本: sudo chmod o-rw /var/run/docker.sock

PyCharm能夠成功連接到套接字。

暫無
暫無

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

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