在没有 sudo 的情况下使用 docker-compose 不起作用
using docker-compose without sudo doesn't work
我最近被告知 运行使用 sudo docker
或 docker-compose
是一个大问题,我必须 create/add 我的用户 docker
分组以便 运行 docker
和 docker-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 守护进程。默认情况下,它是空的;当它为空时,docker
和 docker-compose
都假定它位于 /var/run/docker.sock
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
也就是说,将 docker
与 sudo
一起使用与 将其与 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
. 相同的要求
澄清一下, docker
和 docker-compose
使用环境变量 DOCKER_HOST
来知道与谁交谈。对于它们两者,如果变量为空,则默认值为 /var/run/docker.sock
.
对我有用的是将自己加入“docker”群组
通过 运行ning(作为 root,通过 sudo
):
# usermod -a -G docker` *myUserName*
您可能需要 re-login,因为当前的 shell
可能还“不知道”要添加到 docker 组。
但是如果你不想re-login
,你可以运行下面的命令
newgrp docker
我最近被告知 运行使用 sudo docker
或 docker-compose
是一个大问题,我必须 create/add 我的用户 docker
分组以便 运行 docker
和 docker-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 守护进程。默认情况下,它是空的;当它为空时,docker
和 docker-compose
都假定它位于 /var/run/docker.sock
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
也就是说,将 docker
与 sudo
一起使用与 将其与 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
. 相同的要求
澄清一下, docker
和 docker-compose
使用环境变量 DOCKER_HOST
来知道与谁交谈。对于它们两者,如果变量为空,则默认值为 /var/run/docker.sock
.
对我有用的是将自己加入“docker”群组
通过 运行ning(作为 root,通过 sudo
):
# usermod -a -G docker` *myUserName*
您可能需要 re-login,因为当前的 shell 可能还“不知道”要添加到 docker 组。
但是如果你不想re-login
,你可以运行下面的命令newgrp docker