【问题标题】:using docker-compose without sudo doesn't work使用不带 sudo 的 docker-compose 不起作用
【发布时间】:2021-10-09 15:56:08
【问题描述】:

最近有人告诉我,使用 sudo 运行 dockerdocker-compose 是一个很大的问题,我必须创建/添加我的用户到 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-compose 为属于docker 组的用户运行?

【问题讨论】:

    标签: linux docker ubuntu docker-compose root


    【解决方案1】:
    sudo chmod a+x /usr/local/bin/docker-compose
    

    将开启您的权限。

    docker-compose 只是一个包装器,它使用外部docker daemon,就像docker 命令实际上不运行任何东西,而是给一个docker 命令守护进程

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

    根据dockerd documentation

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

    这是通过授予 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 的访问权限是等效的 em> 给予完全的 root 访问权限:

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

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

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

    要在没有 root 权限的情况下运行 Docker,请参阅 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

    【讨论】:

    • 有趣!实际上,我所说的“禁止”是在以下情况下:sudo docker-compose up 以 root 身份启动,因此使用UID=0,这会混淆某些权限。
    • 您能否提供额外的解释或链接,说明为什么当用户属于docker 组时使用命令docker 有效?我的意思是给socker给出通信顺序的“命令”仍然属于root:root,那怎么可能呢?它与使用docker-compose 有何不同?
    • 另外,您能否提供包含所有权user:dockerdocker-compose 外部服务器/套接字的位置;类似于 docker 的 /var/run/docker.sock ?
    • @Imad 运行 sudo docker-composedocker-composedocker 是相同的。这些程序不会自己做任何事情;他们告诉dockerd 用户的意图,dockerd 做自己的事。参见附加细节。
    • @Imad 默认情况下docker-composedocker 都与/var/run/docker.sock 交谈,我添加了一些关于此的详细信息。
    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多