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

using docker-compose without sudo doesn't work

我最近被告知 运行使用 sudo dockerdocker-compose 是一个大问题,我必须 create/add 我的用户 docker 分组以便 运行 dockerdocker-compose 命令没有 sudo。我按照 documentation here

所做的

现在,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/

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

~$ docker-compose --help

-bash: /usr/local/bin/docker-compose: Permission denied

您能解释一下这是如何工作的吗?我认为有一个 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
~$ 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

那么,这是如何工作的? 以及如何为属于 docker 组的用户启用 docker-compose 到 运行?

sudo chmod a+x /usr/local/bin/docker-compose

将开启您的权限。

docker-compose 只是一个包装器,它使用外部 docker 守护进程 ,与 docker 命令不一样实际上 运行 除了给 docker 守护进程.

命令

您可以使用 DOCKER_HOST 变量更改与之通信的 docker 守护进程。默认情况下,它是空的;当它为空时,dockerdocker-compose 都假定它位于 /var/run/docker.sock

根据 dockerd documentation :

By default, a unix domain socket (or IPC socket) is created at /var/run/docker.sock, requiring either root permission, or docker group membership.

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

$ ls -l /var/run/docker.sock 
srw-rw---- 1 root docker 0 nov.  15 19:54 /var/run/docker.sock

也就是说,将 dockersudo 一起使用与 将其与 docker 组一起使用是 相同的,因为可以访问/var/run/docker.sock 等同于 给予完整的根访问权限:

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

The docker group grants privileges equivalent to the root user. For details on how this impacts security in your system, see Docker Daemon Attack Surface.

如果 root 权限是您系统的安全问题,请参阅另一页:

To run Docker without root privileges, see Run the Docker daemon as a non-root user (Rootless mode).


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

首先,有客户:

$ type docker
docker is /usr/bin/docker
$ dpkg -S /usr/bin/docker
docker-ce-cli: /usr/bin/docker

安装docker-ce-cli包时可以看到安装了docker命令

这里ce代表社区版.

docker cli 与 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.
  • 相同的要求

澄清一下, dockerdocker-compose 使用环境变量 DOCKER_HOST 来知道与谁交谈。对于它们两者,如果变量为空,则默认值为 /var/run/docker.sock.

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

# usermod -a -G docker` *myUserName*

您可能需要 re-login,因为当前的 shell 可能还“不知道”要添加到 docker 组。

但是如果你不想re-login

,你可以运行下面的命令
newgrp docker

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