name: container-debugging description: 调试Docker容器和容器化应用程序。诊断部署问题、容器生命周期问题和资源限制问题。
容器调试
概览
容器调试专注于Docker/Kubernetes环境中的问题,包括资源限制、网络和应用程序运行时问题。
使用时机
- 容器无法启动
- 容器中的应用程序崩溃
- 超出资源限制
- 网络连接问题
- 容器中的性能问题
指令
1. Docker调试基础
# 检查容器状态
docker ps -a
docker inspect <container-id>
docker stats <container-id>
# 查看容器日志
docker logs <container-id>
docker logs --follow <container-id> # 实时
docker logs --tail 100 <container-id> # 最后100行
# 连接到运行中的容器
docker exec -it <container-id> /bin/bash
docker exec -it <container-id> sh
# 检查容器详细信息
docker inspect <container-id> | grep -A 5 "State"
docker inspect <container-id> | grep -E "Memory|Cpu"
# 检查容器进程
docker top <container-id>
# 查看资源使用情况
docker stats <container-id>
# 显示:CPU%, 内存使用量,网络I/O
# 从容器复制文件
docker cp <container-id>:/path/to/file /local/path
# 查看镜像层
docker history <image-name>
docker inspect <image-name>
2. 常见容器问题
问题:容器无法启动
诊断:
1. docker logs <container-id>
2. 检查退出代码:docker inspect (ExitCode)
3. 验证镜像是否存在:docker images
4. 检查入口点:docker inspect --format='{{.Config.Entrypoint}}'
常见退出代码:
0: 正常退出
1: 一般应用程序错误
127: 命令未找到
128+N: 被信号N终止
137: 内存不足 (SIGKILL)
139: 段错误
解决方案:
- 修复应用程序错误
- 确保所需文件存在
- 检查可执行权限
- 验证工作目录
---
问题:内存不足
症状:退出代码137 (SIGKILL)
调试:
docker stats <container-id>
# 检查内存使用量与限制
解决方案:
docker run -m 512m <image>
# 增加内存限制
docker inspect (MemoryLimit)
# 检查当前限制
---
问题:端口已被使用
错误:"bind: address already in use"
调试:
docker ps # 检查运行中的容器
netstat -tlnp | grep 8080 # 检查端口使用情况
解决方案:
docker run -p 8081:8080 <image>
# 使用不同的主机端口
---
问题:网络问题
症状:无法到达其他容器
调试:
docker network ls
docker inspect <container-id> | grep IPAddress
docker exec <container-id> ping <other-container>
解决方案:
docker network create app-network
docker run --network app-network <image>
3. 容器优化
资源限制:
在docker-compose中设置:
version: '3'
services:
app:
image: myapp
environment:
- NODE_ENV=production
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
限制:最大资源
预留:保证资源
---
多阶段构建:
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
EXPOSE 3000
CMD ["node", "dist/index.js"]
结果:1GB → 200MB镜像大小
4. 调试清单
容器问题:
[ ] 容器启动无错误
[ ] 端口映射正确
[ ] 日志显示无错误
[ ] 环境变量设置
[ ] 卷挂载正确
[ ] 网络连接正常
[ ] 资源限制适当
[ ] 权限正确
[ ] 依赖安装
[ ] 入口点工作
Kubernetes问题:
[ ] Pod运行中(非Pending/CrashLoop)
[ ] 所有容器已启动
[ ] 就绪探针通过
[ ] 存活探针通过
[ ] 资源请求/限制设置
[ ] 网络策略允许流量
[ ] 密钥/配置映射可用
[ ] 日志显示无错误
工具:
docker:
- logs
- stats
- inspect
- exec
docker-compose:
- logs
- ps
- config
kubectl (Kubernetes):
- logs
- describe pod
- get events
- port-forward
关键点
- 首先检查日志:
docker logs <container> - 理解退出代码(137=OOM, 127=not found)
- 适当使用资源限制
- 同一网络上的网络容器
- 多阶段构建减少镜像大小
- 使用stats监控资源使用情况
- 端口映射:主机:容器
- 执行进入运行中的容器进行调试
- 定期更新基础镜像
- 在容器中包含健康检查