apparmor拦截是docker启动失败或权限错误的常见原因,需通过sudo aa-status和dmesg | grep -i apparmor确认拒绝日志;临时禁用可验证问题,但应优先编辑/etc/apparmor.d/usr.bin.dockerd添加capability sys_admin、/data/** rwklm等精准规则并重载配置。
apparmor 是 ubuntu 等发行版默认启用的安全模块,它会限制 docker 守护进程和容器的系统调用权限。当出现类似 “docker: error response from daemon: apparmor enabled on system but the docker-default profile does not allow cap_sys_admin” 或容器静默退出(exited (1))、挂载失败、permission denied 等现象时,很可能是 apparmor 拦截所致。
确认 AppArmor 是否在拦截
先验证问题是否真由 AppArmor 引起:
- 运行
sudo aa-status查看 AppArmor 当前状态和已加载的配置文件 - 检查内核日志:执行
dmesg | grep -i apparmor,重点找denied关键字,例如denied mount、denied open、denied capability - 若发现大量拒绝记录,且容器在禁用 AppArmor 后能正常启动,即可确认是根源
临时绕过验证(仅用于测试)
不建议长期禁用,但可用于快速定位问题:
- 临时禁用 AppArmor:运行
sudo systemctl stop apparmor && sudo systemctl disable apparmor - 重启 Docker:
sudo systemctl restart docker - 尝试启动容器,若成功则说明 AppArmor 是主因
- 验证后可恢复:
sudo systemctl enable --now apparmor
安全修复:调整 AppArmor 配置
推荐方式——不关闭安全机制,而是精准放行必要操作:
- 编辑 Docker 的 AppArmor 配置文件:
sudo nano /etc/apparmor.d/usr.bin.dockerd(路径可能为/etc/apparmor.d/docker,依发行版而定) - 在
profile docker-default区块内添加缺失权限,例如:- 需
CAP_SYS_ADMIN(如运行 systemd 容器):添加capability sys_admin, - 需挂载特定路径(如
/data):添加/data/** rwklm, - 需访问 proc/sys(如调优内核参数):添加
/proc/sys/** rw,
- 需
- 重载配置:
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.dockerd - 重启 Docker 使变更生效:
sudo systemctl restart docker
替代方案:使用更宽松但可控的策略
若修改 profile 复杂或不确定最小权限范围,可考虑以下折中方式:
- 对单个容器禁用 AppArmor 隔离:
docker run --security-opt apparmor=unconfined ... - 在 Compose 文件中指定:
security_opt: ["apparmor:unconfined"] - 注意:该方式仅影响该容器,不影响系统全局策略,比全局禁用更安全











