容器调试 container-debugging

专注于Docker/Kubernetes环境中的问题,包括资源限制、网络和应用程序运行时问题,提供调试方法和优化策略。

Docker/K8s 0 次安装 0 次浏览 更新于 3/3/2026

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监控资源使用情况
  • 端口映射:主机:容器
  • 执行进入运行中的容器进行调试
  • 定期更新基础镜像
  • 在容器中包含健康检查