【问题标题】:Running Docker as non-root user以非 root 用户身份运行 Docker
【发布时间】:2016-03-07 16:58:13
【问题描述】:

我正在尝试以非 root 用户身份运行 docker。当我尝试时,我收到以下错误:

$ docker ps
FATA[0000] Get http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS? 

我可以以 root 身份运行 docker:

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[...]

我已将此用户加入 Unix 组 docker:

$ groups
domain users docker suappprod stashadmin config_mgmt remote server access sudevmail sudevsvn

但是,如果没有 sudoing 作为 root,该用户似乎仍然无法运行大多数 docker 命令。

我使用的是旧版本的 docker:

$ docker --version
Docker version 1.6.1, build a8a31ef/1.6.1

我知道最新的是 1.10,我们公司可以将所有 docker 安装更新到 1.9.2,但这需要花费大量的精力和时间。

还有什么我需要看的吗?用户已多次登录和注销。我还没有重启系统。

【问题讨论】:

    标签: docker


    【解决方案1】:

    将用户添加到 Docker 组(因为 Docker 组对套接字具有完全控制权)

    以 root 身份,将用户添加到 docker 组:

    • 猫 /etc/group
    • gpasswd -a docker
    • 退出(以 root 身份)
    • 注销
    • 以用户身份登录,并尝试运行“Docker PS”进行验证。

    这就是我一次又一次在我的 Ubuntu 系统上设置它的方式。

    【讨论】:

    • 组“docker”已经存在。我之前添加的。在/etc/gshadow 中,我有docker:!::david,在/etc/group 中,我有条目docker:x:1001:david。当我以david 登录并执行groups 命令时,我知道用户在docker 组中。
    • 请不要将添加到 docker 组的任何人视为 root。 github.com/moby/moby/issues/9976
    【解决方案2】:

    检查这个命令给出了什么 --> ls -l /var/run/docker.sock 您可能需要使用 chmod 更改此文件的权限(例如:sudo chmod 777 /var/run/docker.sock),具体取决于您要授予的权限。

    【讨论】:

    • 但是当你重新启动旧权限时。
    • 660 足以满足任何目的。如果所有人都可以完全访问套接字,您不妨将所有人添加到 docker 组。
    • 直接更改 .sock 的权限是个坏主意 - 主要是因为系统会在启动时使用服务文件中的权限重新创建它。而且,0777 是一个糟糕的主意,因为它让全世界都可以通过 docker 访问您系统上的 root。请使用上面的docker group机制
    【解决方案3】:

    我的 docker 版本是 17.06.1-ce,在 Ubuntu 16.04.3 LTS 上构建 874a737
    对于使用systemd 的Linux 发行版,有一个名为docker.socket 的服务

    linux@linux-ubuntu:~$ sudo systemctl status docker.socket
    ● docker.socket - Docker Socket for the API
       Loaded: loaded (/lib/systemd/system/docker.socket; disabled; vendor preset: enab
           Active: active (running) since Sab 2017-08-26 01:15:26 WIB; 9min ago
       Listen: /var/run/docker.sock (Stream)
    
    Agu 26 01:15:26 hasto-ubuntu systemd[1]: Starting Docker Socket for the API.
    Agu 26 01:15:26 hasto-ubuntu systemd[1]: Listening on Docker Socket for the API.
    linux@linux-ubuntu:~$ 
    

    文件位置在/lib/systemd/system/docker.socket

    linux@linux-ubuntu:~$ cat /lib/systemd/system/docker.socket 
    [Unit]
    Description=Docker Socket for the API
    PartOf=docker.service
    
    [Socket]
    ListenStream=/var/run/docker.sock
    SocketMode=0660
    SocketUser=root
    SocketGroup=docker
    
    [Install]
    WantedBy=sockets.target
    linux@linux-ubuntu:~$ 
    

    从该文件中,我们可以将 SocketMode=0660 更改为 SocketMode=0666

    重启docker.socket

    systemctl restart docker.socket
    

    我们的 docker 套接字权限将是 066 意味着每个用户都可以对其进行读写。

    现在每个用户都可以以非 root 用户身份运行docker 命令。

    linux@linux-ubuntu:~$ docker ps -a
    CONTAINER ID        IMAGE                    COMMAND                  CREATED      STATUS                  PORTS  NAMES
    03eb2ba2eacd        google/cadvisor:latest   "/usr/bin/cadvisor..."   5 weeks ago  Exited (0) 5 weeks ago         elk_cadvisor_1
    52efa40edf3a        portainer/portainer      "/portainer"             7 weeks ago  Exited (2) 11 days ago         portainer
    linux@linux-ubuntu:~$ 
    
    linux@linux-ubuntu:~$ docker images
    REPOSITORY          TAG                      IMAGE ID            CREATED           SIZE
    portainer/portainer latest                   96196eaa6b3         8 weeks ago       10.4MB
    google/cadvisor     latest                   f9ba08bafdea        5 months ago      57.3MB
    linux@linux-ubuntu:~$ 
    

    注意非 root 访问 docker 命令Why we don't let non-root users run Docker in CentOS, Fedora, or RHEL

    参考:

    1. Docker Documentation : Control and configure Docker with systemd
    2. Github docker systemd

    【讨论】:

    • 660 将 SocketGroup 设置为 docker 意味着 docker 组中的所有用户都可以访问它(并且将用户添加到 docker 组至少会限制谁在服务器上具有 root 访问权限...) .将其更改为 666 是个坏主意,因为它为系统 docker 上的所有用户(并通过 docker 有效地 root)提供了访问权限。
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2017-07-08
    • 2017-06-22
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多