我在装有Ubuntu操作系统的机器上安装了Docker。
当我跑步时:
sudo docker run hello-world
一切都很好,但是我想隐藏sudo命令以使该命令更短。
如果我写的命令没有sudo
docker run hello-world
显示如下:
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied. See 'docker run --help'.
当我试图跑步时,同样的情况也会发生:
docker-compose up
我该如何解决这个问题?
升级后,我的权限被拒绝了。
执行安装步骤后的“mkb”步骤不会改变任何东西,因为我的用户已经在“docker”组中;我试了两次都没有成功。
经过一个小时的搜索,下面的解决方案终于起作用了:
sudo chmod 666 /var/run/docker.sock
解决方案来自奥尔尚斯克。
看起来升级已经重新创建了套接字,但没有给docker组足够的权限。
问题
这个硬chmod打开安全漏洞,每次重启后,这个错误会一次又一次地启动,每次都必须重新执行上面的命令。我要一个彻底的解决办法。为此你有两个问题:
1) Problem with SystemD : The socket will be create only with owner 'root' and group 'root'.
You can check this first problem with this command :
ls -l /lib/systemd/system/docker.socket
If every this is good, you should see 'root/docker' not 'root/root'.
2 ) Problem with graphical Login : https://superuser.com/questions/1348196/why-my-linux-account-only-belongs-to-one-group
You can check this second problem with this command :
groups
If everything is correct you should see the docker group in the list.
If not try the command
sudo su $USER -c groups
if you see then the docker group it is because of the bug.
解决方案
如果你设法得到一个图形登录的工作,这应该做的工作:
sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket
但如果你不能控制这个bug,一个不错的解决方案可以是:
sudo chgrp $USER /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket
这种工作是因为您处于图形化环境中,并且可能是计算机上唯一的用户。
在这两种情况下,您都需要重新启动(或sudo chmod 666 /var/run/docker.sock)
如果你想以非root用户运行docker,那么你需要将它添加到docker组中。
如果docker组不存在,请创建docker组
$ sudo groupadd docker
将您的用户添加到docker组。
$ sudo usermod -aG docker $USER
登录到新的docker组(以避免再次注销/登录;但如果还不够,请尝试重新启动):
$ newgrp docker
检查docker是否可以在没有root的情况下运行
$ docker run hello-world
如果仍然有错误,重新启动
$ reboot
警告
docker组授予等同于root用户的权限。有关这如何影响系统安全性的详细信息,请参阅Docker Daemon攻击面。
摘自docker官方文档:
manage-docker-as-a-non-root-user
在Centos上安装Docker后。在运行下面的命令时,我得到下面的错误。
[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.soc k/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
修改docker.socket的Group和Permission
[centos@aiops-dev-cassandra3 ~]$ ls -l /lib/systemd/system/docker.socket
-rw-r--r--. 1 root root 197 Nov 13 07:25 /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chgrp docker /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chmod 666 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$ ls -lrth /var/run/docker.sock
srw-rw-rw-. 1 root docker 0 Nov 20 11:59 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$
使用以下docker命令进行验证
[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
[centos@aiops-dev-cassandra3 ~]$
Ubuntu 21.04 systemd套接字所有权
让我先说明一下,这是一个非常适合我在本地开发期间的解决方案,我在这里搜索ubuntu docker权限错误,所以我就把这个留在这里。
unix套接字不是我的,所以我学会了。
sudo chown $(whoami):$(whoami) /var/run/docker.sock
对于您的开发环境,另一个更持久的解决方案是修改unix套接字创建的用户所有权。这将给你的用户所有权,所以它将在重启之间坚持:
sudo nano /etc/systemd/system/sockets.target.wants/docker.socket
docker.socket:
[Unit]
Description=Docker Socket for the API
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=YOUR_USERNAME_HERE
SocketGroup=docker
[Install]
WantedBy=sockets.target
为了解决这个问题,我搜索了我的docker和docker-compose安装在哪里。在我的例子中,docker安装在/usr/bin/docker, docker-compose安装在/usr/local/bin/docker-compose路径下。然后,我在我的终端中这样写:
码头工人:
sudo chmod +x /usr/bin/docker
docker-compose:
sudo chmod +x /usr/local/bin/docker-compose
现在我不需要在我的命令docker中写入单词sudo
/***********************************************************************/
勘误:
这个问题的最佳解决方案由@mkasberg评论。我引用评论:
这可能会起作用,你可能会遇到问题。此外,这也是一个安全漏洞。你最好把自己加入docker组,就像文档中说的那样。sudo groupadd docker, sudo usermod -aG docker $USER。
文档:https://docs.docker.com/install/linux/linux-postinstall/