selinux策略需宿主机启用(enforcing/permissive)、docker守护进程以--selinux-enabled启动、容器挂载时加:z或:z标签三者协同生效;daemon.json中配置无效,须通过systemd覆盖片段设置,并安装container-selinux策略包。
安装 docker engine 后,selinux 策略不是靠“配置 docker”来开启的,而是靠宿主机系统级策略 + docker 启动行为 + 容器运行时选项三者协同生效。daemon.json 文件里加任何 selinux 相关字段都无效,docker 守护进程根本不会识别。
确认并保持宿主机 SELinux 处于启用状态
这是前提。Docker 无法在 SELinux 完全禁用(disabled)的系统上启用其容器标签机制。
- 执行 getenforce —— 返回 Enforcing 或 Permissive 才有效;若返回 Disabled,说明内核未加载 SELinux 模块,需重启并修改
/etc/selinux/config中的SELINUX=enforcing,再重启动作才生效 - 执行 sestatus -v 查看策略类型(如 targeted)、MLS/MCS 是否启用,确保基础环境就绪
- 不要临时用
setenforce 0后就认为“已配置”,那只是绕过检查,Docker 不会自动打标签
确保 Docker 守护进程以 --selinux-enabled 启动
现代 Docker(19.03+)默认启用该参数,但离线环境或旧版 RPM 可能不带。不能写进 daemon.json,必须通过 systemd 服务参数控制:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 运行 sudo systemctl edit docker,新增覆盖片段:
ExecStart=
ExecStart=/usr/bin/dockerd --selinux-enabled --host=fd://
- 保存后执行 sudo systemctl daemon-reload && sudo systemctl restart docker
- 验证:运行 docker info | grep -i selinux,输出应为 SELinux: true
为容器挂载卷正确打 SELinux 标签
Docker 默认会对容器内进程和匿名卷自动打标签(如 container_t),但你手动挂载的宿主机目录(-v /host/path:/container/path)需要显式声明上下文,否则会被拒绝访问:
- 挂载时加 :z 或 :Z 后缀:
docker run -v /data:/app:z nginx——:z表示多容器共享该目录,Docker 自动设置system_u:object_r:container_file_t:s0:cXXX,cYYYdocker run -v /tmp/log:/var/log:Z nginx——:Z表示仅本容器专用,使用独占 MCS 标签 - 若需更精细控制,可在宿主机先用
chcon -t container_file_t -r system_r /path预设类型,再挂载
必要时安装 container-selinux 策略包(CentOS/RHEL 7/8)
尤其在离线环境中,缺少这个 RPM 会导致 dockerd 启动失败并报 “SELinux is not supported”:
- 下载对应系统的
container-selinux-*.rpm(如container-selinux-2.167.0-1.el7.noarch.rpm) - 执行 sudo rpm -ivh container-selinux-*.rpm
- 该包提供
container_t、svirt_lxc_net_t等关键类型定义和规则,是 Docker SELinux 支持的底层依赖










