如何配置宿主机使容器崩溃时生成 core dump

解读

面试官通过此题考察候选人对 容器生命周期管理Linux 信号机制宿主机内核参数 的综合掌握。国内生产环境普遍使用 CentOS 7/8、Ubuntu 20.04/22.04 作为宿主机,容器崩溃后若无法保留现场,将导致 “黑盒”故障,因此能否快速给出 可落地、可自动化、符合等保要求 的方案,是区分初中高级 Docker 工程师的关键。

知识点

  1. 容器与宿主机共享内核,core dump 由内核触发,宿主机负责生成 而非容器内部。
  2. /proc/sys/kernel/core_pattern 决定 dump 文件保存路径与命名规则;若首字符为 “|”,内核将调用用户态助手(如 systemd-coredump、apport),容器场景需慎用,否则 dump 可能落入宿主机助手管道而丢失。
  3. Docker 默认关闭容器 ulimit -c,需显式加 --ulimit core=-1 或写入 daemon.json 全局生效。
  4. 国内云厂商(阿里云、腾讯云、华为云)默认开启 ptrace 防护,需同时设置 --security-opt seccomp=unconfined --cap-add=SYS_PTRACE 才能完整捕获段错误栈。
  5. 等保 2.0/3.0 要求 dump 文件落盘加密、定时清理,需配合 tmpfs+LUKS独立加密盘,并通过 logrotate+crontab 实现 7 天滚动。
  6. Kubernetes 场景 需通过 initContainer 统一预加载 sysctl,或使用 kubelet 配置插件 批量注入 core_pattern,避免手动登录节点。

答案

步骤一:宿主机内核级配置

# 1. 永久写入 sysctl
echo "kernel.core_pattern=/var/coredump/core.%e.%p.%t" >> /etc/sysctl.conf
sysctl -p

# 2. 创建独立分区并限制容量
mkdir -p /var/coredump
mount -t ext4 /dev/vdb1 /var/coredump
echo "/dev/vdb1 /var/coredump ext4 defaults,nodev,nosuid,noexec 0 0" >> /etc/fstab

# 3. 目录权限最小化
chown root:root /var/coredump
chmod 1733 /var/coredump

步骤二:Docker 级配置

# 1. 全局生效:/etc/docker/daemon.json
{
  "default-ulimits": {
    "core": { "Name": "core", "Hard": -1, "Soft": -1 }
  }
}
systemctl restart docker

# 2. 运行容器时二次确认
docker run -d --name app \
  --ulimit core=-1 \
  --security-opt seccomp=unconfined \
  --cap-add=SYS_PTRACE \
  myimage:1.0

步骤三:验证

# 进入容器制造崩溃
docker exec -it app sh -c 'kill -SEGV $$'
# 宿主机检查
ls -lh /var/coredump/core.*

步骤四:等保合规加固

# 加密落盘(可选)
cryptsetup luksFormat /dev/vdb1
cryptsetup open /dev/vdb1 coredump
mkfs.ext4 /dev/mapper/coredump

# 7 天自动清理
cat > /etc/cron.daily/coredump-clean <<'EOF'
find /var/coredump -type f -mtime +7 -delete
EOF
chmod +x /etc/cron.daily/coredump-clean

拓展思考

  1. 多租户场景 下,若 core_pattern 包含 %h(主机名)或 %e(进程名),不同租器的 dump 可能重名覆盖,建议追加 容器 ID 短码
    kernel.core_pattern=/var/coredump/%e.%p.%t.%c 并在运行容器时把 hostname 设为 PodName-ContainerID
  2. 大镜像(>4 GB)崩溃 可能生成 超大 dump,需结合 systemd-coredumpProcessSizeMax=ExternalSizeMax= 做流控,或改用 minidump 方案(Google breakpad、llvm-coredump)。
  3. CI/CD 集成:在 GitLab Runner 或 Jenkins Agent 宿主机上,把 core_pattern 指向 NFS 共享盘,崩溃后自动触发 ELK 解析栈回溯,实现 “崩溃即工单” 的闭环。