15.2.7 用户与权限配置(docker组)

用户与权限配置(docker组)#

Docker 守护进程由 root 管理,/var/run/docker.sock 是访问入口。将用户加入 docker 组即可免 sudo 使用,但该组具备等价 root 的权限,务必控制成员范围。

原理草图:Docker socket 权限链路

文章图片

1. 创建与查看 docker 组

# 查看系统是否已有 docker 组
getent group docker

# 若不存在,创建 docker 组
sudo groupadd docker

2. 将用户加入 docker 组(示例与解释)

# 将当前用户加入 docker 组(-a 追加;-G 指定组)
sudo usermod -aG docker $USER

# 将指定用户加入 docker 组
sudo usermod -aG docker devops

# 查看用户所属组(应包含 docker)
id $USER

3. 使权限立即生效

# 重新登录终端或执行
newgrp docker

# 验证当前会话是否已有 docker 组
id

4. 权限验证与运行测试(含预期效果)

# 查看 Docker 版本(无需 sudo)
docker version

# 列出容器(预期无权限错误)
docker ps

# 运行测试镜像(预期输出 Hello from Docker!)
docker run --rm hello-world

5. 关键文件权限检查与修复

# 查看 docker.sock 权限(常见为 srw-rw---- root:docker)
ls -l /var/run/docker.sock

# 若权限异常(非 root:docker),重启服务恢复
sudo systemctl restart docker
ls -l /var/run/docker.sock

6. 常见问题与排错流程

# 错误:Got permission denied while trying to connect to the Docker daemon socket
# 排查顺序:
id $USER                     # 1) 是否在 docker 组
getent group docker          # 2) docker 组是否存在
ls -l /var/run/docker.sock   # 3) socket 权限是否为 root:docker
systemctl status docker      # 4) dockerd 是否运行

7. 安全提示与替代方案
- docker 组等价于 root,可挂载宿主目录获取 root 访问。
- 生产环境应限制 docker 组成员,建议使用 sudo 细粒度授权。
- 可在 sudoers 中仅授权特定命令(示例):

# 编辑 sudoers(请用 visudo)
sudo visudo

# 允许 devops 用户执行 docker 命令
devops ALL=(ALL) NOPASSWD:/usr/bin/docker

8. 练习与验收
1. 创建用户 ops 并加入 docker 组,验证无需 sudo 能执行 docker ps
2. 移除 ops 用户的 docker 组权限,验证访问失败:

sudo userdel -r ops
# 或移除组(示例)
sudo gpasswd -d ops docker
  1. 模拟权限问题:手动更改 socket 权限并恢复(学习排错):
sudo chmod 600 /var/run/docker.sock
docker ps   # 预期失败
sudo systemctl restart docker
docker ps   # 预期恢复