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
- 模拟权限问题:手动更改 socket 权限并恢复(学习排错):
sudo chmod 600 /var/run/docker.sock
docker ps # 预期失败
sudo systemctl restart docker
docker ps # 预期恢复