在没有 sudo 的情况下使用 docker-compose 不起作用

Aet*_*tos 12 linux ubuntu root docker docker-compose

最近有人告诉我,运行dockerdocker-compose使用 sudo 是一个大问题,我必须创建/将我的用户添加到docker组中才能在docker没有 . 我按照这里的文档做了docker-composesudo

现在,docker通过我的用户正常运行。例如:

~$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
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/

Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行 docker-compose 时,我得到了一个Permission Denied

~$ docker-compose --help

-bash: /usr/local/bin/docker-compose: Permission denied
Run Code Online (Sandbox Code Playgroud)

您能解释一下这是如何工作的吗?我认为有一个docker组可以使用这些命令,因为二进制文件属于这个组,但实际上它们不属于这个组,它们只属于root......

~$ ls -al /usr/bin/docker*
-rwxr-xr-x 1 root root  71706288 Jul 23 19:36 /usr/bin/docker
-rwxr-xr-x 1 root root    804408 Jul 23 19:36 /usr/bin/docker-init
-rwxr-xr-x 1 root root   2944247 Jul 23 19:36 /usr/bin/docker-proxy
-rwxr-xr-x 1 root root 116375640 Jul 23 19:36 /usr/bin/dockerd
Run Code Online (Sandbox Code Playgroud)
~$ ls -al /usr/local/bin/
total 12448
drwxr-xr-x  2 root root     4096 May 26 11:08 .
drwxr-xr-x 10 root root     4096 May 14 19:36 ..
-rwxr--r--  1 root root 12737304 May 26 11:08 docker-compose
Run Code Online (Sandbox Code Playgroud)

那么,这是如何运作的呢?如何启用docker-compose属于该docker组的用户运行?

Pie*_*ume 25

sudo chmod a+x /usr/local/bin/docker-compose
Run Code Online (Sandbox Code Playgroud)

截至 2023 年 6 月,该docker-compose命令已被弃用,取而代之的是 compose 插件。

https://docs.docker.com/compose/install/linux/

安装 Compose 插件

sudo apt-get update
sudo apt-get install docker-compose-plugin

...

docker compose ps # note that docker and compose are now two words.
Run Code Online (Sandbox Code Playgroud)

将打开您的权限。

docker-compose只是一个包装器,它使用外部docker daemon,就像该命令实际上并不运行任何东西,而是向docker daemondocker发出命令。

您可以使用该DOCKER_HOST变量更改与之通信的 docker 守护进程。默认为空;当它为空时,并且docker假设docker-compose它位于/var/run/docker.sock

根据dockerd 文档

默认情况下,在 /var/run/docker.sock 处创建 unix 域套接字(或 IPC 套接字),需要 root 权限或 docker 组成员身份。

这是通过向 docker 组授予对套接字的读写访问权限来强制执行的。

sudo apt-get update
sudo apt-get install docker-compose-plugin

...

docker compose ps # note that docker and compose are now two words.
Run Code Online (Sandbox Code Playgroud)

如https://docs.docker.com/engine/install/linux-postinstall/中所述,要将用户添加到docker组中,您可以这样做:

$ ls -l /var/run/docker.sock 
srw-rw---- 1 root docker 0 nov.  15 19:54 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

话虽这么说,使用dockerwith 与使用它与组sudo相同,因为授予对 the 的访问权限相当于授予完全 root 访问权限docker/var/run/docker.sock

来自https://docs.docker.com/engine/install/linux-postinstall/

docker 组授予相当于 root 用户的权限。有关这如何影响系统安全性的详细信息,请参阅 Docker Daemon Attack Surface。

如果 root 权限是您系统的安全问题,则会提到另一个页面:

要在没有 root 权限的情况下运行 Docker,请参阅以非 root 用户身份运行 Docker 守护程序(无根模式)


docker 由多个元素组成:https ://docs.docker.com/get-started/overview/

首先,有客户:

sudo usermod -aG docker $USER # this adds the permissions
newgrp docker # this refreshes the permissions in the current session
Run Code Online (Sandbox Code Playgroud)

docker安装软件包时可以看到该命令已安装docker-ce-cli

这里,ce代表社区版

clidocker与 docker 守护进程(也称为dockerd.

dockerd是一个守护进程(服务器)并默认公开 unix 套接字/var/run/docker.sock;默认权限是root:docker.

还涉及其他组件,例如dockerd使用containerd: https: //containerd.io/


剩下的就是基本的linux权限管理:

  • 操作 docker 守护进程与拥有该机器上的 root 权限相同
  • 要操作 docker 守护进程,您需要能够对其侦听的套接字进行读写操作;就你而言是的/var/run/docker.sock无论您是否是 sudoer 都不会改变任何事情
  • 为了能够读取和写入/var/run/docker.sock,您必须是root或正在该docker组中。
  • docker-compose是另一个 cli,它具有与 相同的要求docker


Yot*_*tam 9

对我有用的是通过运行(作为root,via )将自己添加到“ docker ”组:sudo

# usermod -a -G docker` *myUserName*
Run Code Online (Sandbox Code Playgroud)

您可能需要重新登录,因为当前 shell 可能尚未“知道”已添加到docker组。

但是如果您不想重新登录,可以运行以下命令

newgrp docker
Run Code Online (Sandbox Code Playgroud)

https://docs.docker.com/engine/install/linux-postinstall/