在 Ubuntu 上使用 Docker 时,权限管理主要涉及 用户权限、容器权限、数据卷权限和安全策略 几个方面。下面系统地给你讲一下常见做法和最佳实践。
Docker 守护进程以 root 运行,普通用户无法直接执行 docker 命令:
docker ps
# permission denied
sudo usermod -aG docker $USER
重新登录或执行:
newgrp docker
⚠️ 注意:
docker 组 ≈ 拥有 root 权限docker run --user 1000:1000 nginx
或在 Dockerfile 中:
RUN useradd -m appuser
USER appuser
❌ 不推荐:
docker run --privileged
✅ 按需授权:
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE
docker run --read-only nginx
结合 volume 使用:
docker run --read-only -v /data:/data nginx
容器用户 ID 与宿主机不一致会导致:
解决方式:
docker run -u $(id -u):$(id -g) -v $PWD/data:/data app
sudo chown -R 1000:1000 ./data
services:
app:
image: nginx
user: "1000:1000"
read_only: true
volumes:
- ./data:/data
dockerd-rootless-setuptool.sh install
特点:
Ubuntu 默认启用 AppArmor:
docker run --security-opt apparmor=docker-default nginx
docker run --memory=512m --cpus=1 nginx
| 场景 | 推荐做法 |
|---|---|
| 开发环境 | 用户加入 docker 组 |
| 生产环境 | rootless Docker |
| 容器运行 | 非 root 用户 |
| 数据卷 | 统一 UID/GID |
| 安全 | 禁用 privileged,drop capabilities |
如果你愿意,可以告诉我:
我可以直接给你一套可复制的配置。