docker permission denied

Docker3周前更新 D-Mr
17 0

文章目录

  • deepseek模型
  • Docker
  • JAVA
  • PHP
  • 个人数据信息泄露自检测
  • 挖币
  • 显卡
  • 短剧
  • 站长收藏
  • 谷歌插件
  • 账户购买
  • docker permission denied
    文章配图
    #!/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 服务,就能顺利停止容器了。”
    # ------------------------------------------------------------------------------
    

    © 版权声明

    相关文章

    没有相关内容!

    暂无评论

    none
    暂无评论...