如何配置宿主机使容器崩溃时生成 core dump
解读
面试官通过此题考察候选人对 容器生命周期管理、Linux 信号机制 与 宿主机内核参数 的综合掌握。国内生产环境普遍使用 CentOS 7/8、Ubuntu 20.04/22.04 作为宿主机,容器崩溃后若无法保留现场,将导致 “黑盒”故障,因此能否快速给出 可落地、可自动化、符合等保要求 的方案,是区分初中高级 Docker 工程师的关键。
知识点
- 容器与宿主机共享内核,core dump 由内核触发,宿主机负责生成 而非容器内部。
- /proc/sys/kernel/core_pattern 决定 dump 文件保存路径与命名规则;若首字符为 “|”,内核将调用用户态助手(如 systemd-coredump、apport),容器场景需慎用,否则 dump 可能落入宿主机助手管道而丢失。
- Docker 默认关闭容器 ulimit -c,需显式加
--ulimit core=-1或写入 daemon.json 全局生效。 - 国内云厂商(阿里云、腾讯云、华为云)默认开启
ptrace防护,需同时设置--security-opt seccomp=unconfined --cap-add=SYS_PTRACE才能完整捕获段错误栈。 - 等保 2.0/3.0 要求 dump 文件落盘加密、定时清理,需配合 tmpfs+LUKS 或 独立加密盘,并通过 logrotate+crontab 实现 7 天滚动。
- 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
拓展思考
- 多租户场景 下,若 core_pattern 包含
%h(主机名)或%e(进程名),不同租器的 dump 可能重名覆盖,建议追加 容器 ID 短码:
kernel.core_pattern=/var/coredump/%e.%p.%t.%c并在运行容器时把 hostname 设为 PodName-ContainerID。 - 大镜像(>4 GB)崩溃 可能生成 超大 dump,需结合 systemd-coredump 的
ProcessSizeMax=与ExternalSizeMax=做流控,或改用 minidump 方案(Google breakpad、llvm-coredump)。 - CI/CD 集成:在 GitLab Runner 或 Jenkins Agent 宿主机上,把 core_pattern 指向 NFS 共享盘,崩溃后自动触发 ELK 解析栈回溯,实现 “崩溃即工单” 的闭环。