
#!/usr/bin/env bash
# ==============================================================================
# Docker 容器 “permission denied / cannot stop container” 统一排障脚本式手册
# 用法:把本文件当作“命令速查表”
# 适用:Ubuntu/Debian + systemd 的常见环境
# ==============================================================================
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0) 先设置你的目标容器 <<<<<<<<<<<<<<<<<<<<<<<<<<<<
CONTAINER="<container_id_or_name>" # ← 替换为你的容器 ID 或 名称,例如:CONTAINER="eth-server"
# ------------------------------------------------------------------------------
# 一、最短路径(首选快速修复)
# 说明:先不深挖原因,优先让容器停下来。很多机器到这就解决了。
# ------------------------------------------------------------------------------
# 1) 清理未知的 AppArmor 配置(若命令未找到,可先安装:sudo apt-get install -y apparmor-utils)
sudo aa-remove-unknown
# 2) 重载 systemd 并重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 3) 尝试停止容器(任选其一)
docker stop "$CONTAINER" || true
docker kill "$CONTAINER" || true # 直接 SIGKILL
docker kill --signal=SIGTERM "$CONTAINER" || true # 先温和 SIGTERM
# 4) 验证
docker ps -a | grep "$CONTAINER" || echo "✅ 容器可能已停止/移除"
journalctl -u docker -n 50 --no-pager
# ------------------------------------------------------------------------------
# 二、标准排障流程(逐步深入)
# ------------------------------------------------------------------------------
# 步骤 0:记录现场(便于故障判断;可选但推荐)
docker info
docker version
systemctl status docker --no-pager
(aa-status 2>/dev/null || apparmor_status 2>/dev/null || echo "No AppArmor binary")
docker inspect "$CONTAINER" --format 'PID={{.State.Pid}} Status={{.State.Status}}' || true
# 步骤 1:AppArmor 清理与重载(低风险,强烈推荐;再次尝试)
sudo aa-remove-unknown
sudo systemctl daemon-reload
sudo systemctl restart docker
docker stop "$CONTAINER" || docker kill "$CONTAINER" || true
aa-status 2>/dev/null | sed -n '1,80p'
journalctl -u docker -n 100 --no-pager
# 步骤 2:临时禁用或彻底移除 AppArmor(有风险,慎用)
# 2.1 临时禁用(重启后可能恢复)
# ⚠️ 风险:降低系统安全性,临时排障可用;生产谨慎。
# sudo systemctl stop apparmor
# sudo systemctl disable apparmor
# sudo systemctl restart docker
# docker kill "$CONTAINER" || true
# 2.2 彻底移除(可恢复安装;更激进)
# ⚠️ 风险更高:会移除安全模块;仅在确认是 AppArmor 原因且可接受风险时使用。
# sudo apt-get purge --auto-remove -y apparmor
# sudo systemctl restart docker
# docker system prune --all --volumes -f # ⚠️ 清理镜像/卷/悬空资源,慎用
# docker kill "$CONTAINER" || true
# (回滚恢复 AppArmor)
# sudo apt-get update && sudo apt-get install -y apparmor apparmor-utils
# sudo systemctl enable --now apparmor
# 步骤 3:重启 Docker / containerd / 宿主机(低风险)
sudo systemctl restart docker.service
sudo systemctl restart containerd || true
# 若仍不行,可重启宿主机(会中断所有业务,谨慎)
# sudo reboot
# 步骤 4:强制终止容器主进程(更“硬”的办法,仅对目标容器)
PID="$(docker inspect "$CONTAINER" --format '{{.State.Pid}}' 2>/dev/null || echo "")"
echo "容器主进程 PID=$PID"
if [ -n "$PID" ] && [ "$PID" -gt 0 ] 2>/dev/null; then
# 先温和再强制
sudo kill -TERM "$PID" 2>/dev/null || true
sleep 2
sudo kill -KILL "$PID" 2>/dev/null || true
else
echo "⚠️ 未拿到有效 PID,可能容器状态异常或已退出。"
fi
# 让 Docker 收尾并移除容器(如需)
docker rm -f "$CONTAINER" || true
ps -fp "${PID:-0}" || echo "✅ 容器进程已不在"
docker ps -a | grep "$CONTAINER" || echo "✅ 容器条目已移除或不存在"
# 步骤 5:检查用户权限与 docker.sock(常被忽略)
# 说明:非 root 用户如果没进 docker 组,可能出现各种权限问题。
sudo usermod -aG docker "$USER"
newgrp docker <<'EOF'
echo "✅ 当前 shell 会话已切换 docker 组;如需全局生效请重新登录。"
EOF
# 检查并修正 /var/run/docker.sock 权限(应为 root:docker,660)
ls -l /var/run/docker.sock
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
groups
docker ps
# ------------------------------------------------------------------------------
# 三、(可选)从 Snap 切换到官方 APT 安装(更稳)
# 说明:若你的 Docker 是 Snap 安装,建议改用官方 apt 源,能消除不少莫名问题。
# ------------------------------------------------------------------------------
# 3.1 卸载 Snap 版 Docker(卸前可备份数据目录 /var/lib/docker;不熟悉请跳过)
# sudo snap list | grep -i docker || echo "docker not installed by snap"
# sudo snap remove docker || true
# 3.2 移除旧残留并装官方源 Docker
# sudo apt-get remove -y docker docker-engine docker.io containerd runc || true
# sudo apt-get update
# sudo apt-get install -y ca-certificates curl gnupg
# sudo install -m 0755 -d /etc/apt/keyrings
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# sudo chmod a+r /etc/apt/keyrings/docker.gpg
# . /etc/os-release
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $VERSION_CODENAME stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
# sudo apt-get update
# sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# sudo systemctl enable --now docker
# docker version
# docker info
# ------------------------------------------------------------------------------
# 四、进阶检查(可选)
# ------------------------------------------------------------------------------
# 查看 Docker/内核日志
journalctl -u docker -n 200 --no-pager
dmesg | tail -n 100
# 网络异常快速修复(谨慎,可能影响现有容器网络)
# sudo systemctl stop docker
# sudo rm -f /var/lib/docker/network/files/local-kv.db
# sudo systemctl start docker
# 存储驱动/挂载卡死排查
docker info | grep -i "Storage Driver"
mount | grep overlay | head
# ------------------------------------------------------------------------------
# 五、速查表:原因 ⇄ 建议
# ------------------------------------------------------------------------------
# AppArmor 限制/残留 → aa-remove-unknown → 重启 Docker(首选)
# 安全模块干扰(高风险) → 临时停用/卸载 AppArmor(完后可恢复)
# Docker/containerd 异常 → 重启 docker/containerd,必要时重启宿主机
# 容器进程顽固 → 找 PID → kill -TERM/-KILL → docker rm -f
# 用户权限不当 → 加入 docker 组 & 修正 /var/run/docker.sock 权限
# Snap 版问题 → 切换官方 apt 安装的 Docker Engine
# ------------------------------------------------------------------------------
# 六、
# ------------------------------------------------------------------------------
systemctl status docker --no-pager
journalctl -u docker -n 200 --no-pager
(aa-status 2>/dev/null || apparmor_status 2>/dev/null || echo "No AppArmor")
docker inspect "$CONTAINER" --format 'PID={{.State.Pid}} Status={{.State.Status}}' || true
# ------------------------------------------------------------------------------
#
# “sudo aa-remove-unknown 后重启 Docker 服务,就能顺利停止容器了。”
# ------------------------------------------------------------------------------
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
没有相关内容!
暂无评论...