mcpField
D
docker-troubleshooting

docker-troubleshooting

github.com/full-stack-skills云与 DevOps3121 次安装4 周前更新
代码仓库

关于 docker-troubleshooting

docker-troubleshooting 是面向 Docker 用户的系统化排查技能,涵盖容器状态、日志、资源、网络和权限问题,并列出安全注意事项。

主要功能

  1. 01检查容器状态与退出码
  2. 02查看日志和资源用量
  3. 03排查磁盘、OOM 与网络
  4. 04提供交互式调试步骤
  5. 05说明清理操作的风险

适用场景

  1. 01诊断容器启动失败或崩溃
  2. 02定位磁盘耗尽或日志膨胀
  3. 03检查容器 OOM 与资源限制
  4. 04排查容器网络和权限问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/full-stack-skills/docker-skills --skill docker-troubleshooting

安装后在 Claude Code 中输入/docker-troubleshooting确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

agents/
openai.yaml
examples/
01-debug-crash.md
02-debug-oom.md
references/
01-exit-codes.md
02-resource-troubleshooting.md

详细介绍

Docker 故障排查 — 问题排查与调试

系统地诊断并解决常见的 Docker 问题。

适用场景

用户提到以下内容时,始终使用此技能:

  • “docker 排查”、“docker debug”、“容器问题”
  • “容器启动失败”、“exit code”、“crash”
  • “OOM”、“磁盘满”、“disk full”
  • “网络不通”、“network issues”
  • “docker daemon”、“daemon not running”

诊断框架

1. Check container state    → docker ps -a, docker inspect
2. Check logs               → docker logs --tail 100
3. Check resources          → docker stats, docker system df
4. Check exit code          → docker inspect --format='{{.State.ExitCode}}'
5. Interactive debug        → docker run --rm -it image sh

容器启动失败

退出码参考
代码含义操作
0成功—
1应用错误检查 docker logs
125Docker 守护进程错误检查守护进程状态
126无法执行命令检查权限
127未找到命令检查 CMD/ENTRYPOINT 路径
137SIGKILL(OOM 或 docker kill)检查内存限制
139SIGSEGV(段错误)应用程序错误
143SIGTERM(正常停止)健康检查超时?
# Quick diagnosis
docker ps -a | grep Exited
docker inspect --format='{{.State.ExitCode}} {{.State.Error}}' container
docker logs container

磁盘空间耗尽

# Check disk usage
docker system df

# What's using space?
docker system df -v   # Verbose breakdown

# Clean up
docker system prune -a     # Remove all unused: images, containers, volumes, networks
docker image prune -a      # Unused images only
docker volume prune        # Unused volumes only

# Log rotation (prevent future issues)
docker run --log-opt max-size=10m --log-opt max-file=3 myapp

OOM(内存不足)

# Check if container was OOM-killed
docker inspect --format='{{.State.OOMKilled}}' container

# Check memory usage
docker stats --no-stream

# Solution: increase memory limit
docker update --memory=1g --memory-swap=1g container

网络连接

# Check network configuration
docker network inspect bridge
docker exec container ip addr show
docker exec container ping other-container

# DNS check
docker exec container nslookup other-container
docker exec container cat /etc/resolv.conf

# Host networking check
iptables -t nat -L DOCKER -n   # Port forwarding rules

权限问题

# Bind mount permission denied
# Solution 1: Match UID
docker run -u $(id -u):$(id -g) -v $PWD:/app myapp

# Solution 2: Fix permissions in entrypoint
# In entrypoint script: chown -R appuser:appgroup /data

# Docker socket permission
sudo usermod -aG docker $USER   # Add user to docker group
newgrp docker                    # Refresh group (or re-login)

工作流 — 排查流程

步骤 1:查看状态:docker ps -a → 确认退出码和 OOMKilled
步骤 2:查看日志:docker logs --tail 100 <container> 获取错误信息
步骤 3:深入检查:docker inspect → 检查网络/挂载/资源限制
步骤 4:交互式调试:docker run -it --rm --entrypoint sh <image> 进入容器排查
步骤 5:排查资源:使用 docker stats + docker system df 检查 CPU/内存/磁盘

注意事项 — 常见陷阱

  • docker system prune 具有破坏性:会移除所有未使用的对象。不要在生产环境中盲目运行。→ 恢复方法:先使用 docker system df 预览;添加 --filter "until=24h" 安全清理;未经确认,切勿运行 prune -a。
  • 日志会悄无声息地占满磁盘:JSON-file 驱动程序默认不启用日志轮转。高频输出的应用可能在几小时内占满磁盘。→ 恢复方法:docker run --log-opt max-size=10m --log-opt max-file=3 app;对于现有容器:truncate -s 0 $(docker inspect -f '{{.LogPath}}' myapp)。
  • OOMKilled=TRUE,但日志中没有错误:SIGKILL 无法写入日志。→ 恢复方法:检查 docker inspect -f '{{.State.OOMKilled}}' myapp;增加内存:docker update --memory 512m myapp。
  • Exited (0),但服务无法正常工作:应用已启动,但在健康检查通过后崩溃。→ 恢复方法:运行 docker logs --tail 100 myapp;检查应用是否监听 0.0.0.0(而非 127.0.0.1);使用 docker exec myapp netstat -tlnp 验证。

范围 — 能力边界(适用与不适用场景)

分类场景说明
✅ 能做容器启动失败排查退出码分析 + docker logs + inspect
✅ 能做磁盘/日志/资源问题docker system df + prune + 日志轮转
✅ 能做OOM/CPU 排查docker stats + --memory 限制 + OOMKilled
⚠️ 需条件网络包级分析需要 tcpdump/Wireshark + 网络知识
⚠️ 需条件内核级问题需要 Linux 内核调试技能
❌ 超范围应用代码 bug 修复由开发者修复代码
❌ 超范围生产环境部署使用 docker-production
❌ 超范围安全漏洞修复使用 docker-security + docker-scout

不适用此技能的场景

❌ 跳过✅ 改用
设置生产环境docker-production
安全问题docker-security
性能调优docker-run(资源限制)
Docker 基础知识docker-basics

安全与稳定性

  • 使用 docker exec 进入生产容器可能会暴露敏感数据。优先使用基于日志的调试方式。
  • docker system prune -a 会移除所有未使用的镜像和卷——在生产环境中谨慎使用。
  • 使用 --privileged 调试工具检查容器可能会绕过安全控制。
  • 切勿为了调试而向容器暴露 Docker 套接字(/var/run/docker.sock)——这会授予 root 访问权限。
  • 轮转调试日志——其中可能包含敏感信息。使用带有 TTL 的日志驱动程序。

📚 官方文档参考

文档地址
Docker 引擎故障排查https://docs.docker.com/engine/troubleshoot/
docker logs 命令https://docs.docker.com/reference/cli/docker/container/logs/
docker inspecthttps://docs.docker.com/reference/cli/docker/inspect/
Docker CLI 参考https://docs.docker.com/reference/cli/docker/
守护进程配置https://docs.docker.com/reference/cli/dockerd/
常见问题 FAQhttps://docs.docker.com/faq/

🧭 Docker Skills Journey

📍 You are here: docker-troubleshooting — 问题排查

← Previous: docker-production

评论

支持 Markdown