我试图杀死一个 docker 容器,但我的权限被拒绝。我使用的是Ubuntu 20.04,我的客户端docker版本是20.10.7,服务器版本是20.10.11。
这是我得到的日志:
Error response from daemon: Cannot kill container: fastapi_server: permission denied
我读到我应该使用这个命令来重新启动 docker。
sudo systemctl restart docker.socket docker.service
但问题是,当我执行此命令时,我的所有容器和图像都会消失,但如果我尝试在 localhost:8000 上,我的端口被我想要删除的容器占用。如果我运行
sudo netstat -anp | grep 8000
,我会得到:
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 2493/docker-proxy
tcp6 0 0 :::8000 :::* LISTEN 2500/docker-proxy
所以这证实了我的端口已经被docker容器占用,但是当我运行
docker ps -a
时,我没有得到任何容器。我也尝试过docker kill
,但没成功。
我应该如何杀死这个容器并释放我的 8000 端口?
看来我已经使用 snap 安装了 docker,并使用了 docker 存储库:
sudo snap list
所以:
sudo snap remove docker --purge
sudo aa-remove-unknown
使用这里描述的方法重新安装 Docker 解决了我的问题!无需禁用或删除apparmor。
在这些情况下对我有用的是:
sudo systemctl restart docker.socket docker.service
sudo docker image rm -f $(sudo docker image ls -q)
删除之前请三思而后行
AppArmor
。据我了解,这是应用程序安全的核心,例如最近的主要 Ubuntu 版本。
看来权限问题是特定于 Docker 版本的。假设您的 Docker 版本也是通过 snap 安装的,请尝试将您的 Docker 版本至少升级到当前的测试版,例如与
snap refresh docker --beta
20.10.12
似乎工作正常。
(事实上,我接受了这个建议,并删除了我的 AppArmor - 快照消失了。然后尽快重新安装,相关快照的设置仍然在我身边 - 后来安装了 docker,出现了问题,升级了它:似乎工作得像魅力。)
尝试以下步骤:
docker inspect
找到 PID 并终止该进程。
如果这不起作用,请检查
dmesg
与 Docker 相关的一切。您可以将输出放在这里,我们可以帮助您。
好吧,从你看来,你的 AppArmor 有问题。试试这个:
sudo apt purge --auto-remove apparmor
sudo service docker restart
docker system prune --all --volumes
我从 snap 安装了 Docker,并遇到了权限被拒绝的错误响应。在阅读了许多用户在使用apparmor建议时遇到更多问题后,我从snap卸载了Docker,然后使用了digitalocean的Docker安装教程。
它对我有用,发布在这里作为遇到同样问题的其他人的参考。
就我而言,从 Bionic 升级后,它在 Ubuntu 20.04 上也出现了。通过运行 dmesg 我收到错误消息:
[1113458.482007] audit: type=1400 audit(1672134271.112:1718): apparmor="DENIED" operation="signal" profile="docker-default" pid=1654 comm="dockerd" requested_mask="receive" denied_mask="receive" signal=kill peer="snap.docker.dockerd
要解决此问题,请编辑 /etc/apparmor.d/docker 并将以下行添加到开头(但是,在“profile docker-default .... {”之后):
signal,
然后重新加载apparmor
sudo systemctl reload apparmor
这至少在我的电脑上修复了它。
查看更多 https://manpages.ubuntu.com/manpages/xenial/man5/apparmor.d.5.html 信号部分下:
Example AppArmor signal rules:
# Allow all signal access
signal,
我也有类似的问题;原来我有两个docker安装。我按照 this 答案中的说明进行操作,但简而言之,docker 有两种安装,一种来自
apt
,另一种来自 snap
。您需要将 snap
中的一项删除,并保留 apt
中的一项。说明在链接中。