![](/img/trans.png)
[英]Unable to connect to unix:///var/run/docker.sock (Permission denied) from PHP code
[英]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
注意:運行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
值得嘗試的另一個選擇是將您的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.