Docker容器运行8-12分钟后消失,如何排查崩溃原因?
问题描述
我用以下命令运行Docker镜像:
docker run --privileged --name openvas --rm -dti -p 9392:9392 <image_name>
容器正常运行8-12分钟后会完全消失,执行docker ps -a也找不到它。
我找不到容器日志之外的其他Docker日志,而且容器消失后日志也没了。
查看包含“docker”的进程时,输出如下:
root 105873 3.5 0.6 1715848 24860 ? Ssl 2022 2149:08 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 3730648 0.0 0.0 1222272 1576 ? Sl 22:26 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9392 -container-ip 172.17.0.2 -container-port 9392 root 3730656 0.0 0.0 1148224 1524 ? Sl 22:26 0:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9392 -container-ip 172.17.0.2 -container-port 9392 root 3732368 0.0 0.0 8624 1964 pts/1 S+ 22:33 0:00 grep --color=auto -i docker root 105873 3.5 0.7 1715848 29228 ? Ssl 2022 2149:09 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 3730648 0.0 0.0 1222272 1576 ? Sl 22:26 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9392 -container-ip 172.17.0.2 -container-port 9392 root 3730656 0.0 0.0 1148224 1524 ? Sl 22:26 0:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9392 -container-ip 172.17.0.2 -container-port 9392 root 3732370 0.0 0.1 1081712 5872 ? Dl 22:33 0:00 runc --root /var/run/docker/runtime-runc/moby --log /run/containerd/io.containerd.runtime.v2.task/moby/2692e34b79618056c6896af5d2da9f539c210c739ef7bae7420862e46e695ab0/log.json --log-format json --systemd-cgroup delete 2692e34b79618056c6896af5d2da9f539c210c739ef7bae7420862e46e695ab0 root 3732372 0.0 0.0 8624 1948 pts/1 S+ 22:33 0:00 grep --color=auto -i docker
循环执行这个命令时,最初输出稳定;容器消失时会出现带日志路径的输出,但对应的日志文件不存在:
# cat /run/containerd/io.containerd.runtime.v2.task/moby/2692e34b79618056c6896af5d2da9f539c210c739ef7bae7420862e46e695ab0/log.json cat: /run/containerd/io.containerd.runtime.v2.task/moby/2692e34b79618056c6896af5d2da9f539c210c739ef7bae7420862e46e695ab0/log.json: No such file or directory
这个容器在其他系统上运行正常,我不确定是不是内存之类的问题导致崩溃,想问下有没有通用的Docker日志可以用来排查原因?
排查方案
1. 先禁用容器自动删除
你用了--rm参数,容器退出后会自动删除,日志也跟着丢失。先去掉这个参数重新运行:
docker run --privileged --name openvas -dti -p 9392:9392 <image_name>
这样容器消失后,执行docker logs openvas就能查看日志,哪怕容器已经停止。
2. 查看Docker守护进程日志
Docker守护进程本身的日志能记录容器启动、退出的系统级原因,不同系统的日志位置不一样:
- systemd系统(如Ubuntu、CentOS):
# 查看历史日志 journalctl -u docker.service # 实时监控日志 journalctl -u docker.service -f - 非systemd系统:
日志一般在/var/log/docker.log或/var/log/upstart/docker.log,直接查看即可:tail -f /var/log/docker.log
3. 查看containerd日志
Docker现在依赖containerd作为运行时,它的日志能补充更多底层运行信息:
- systemd系统:
journalctl -u containerd.service -f - 非systemd系统:
日志通常在/var/log/containerd.log路径下。
4. 监控系统资源
如果怀疑是内存问题,运行容器时实时监控资源使用情况:
# 单独监控容器资源 docker stats openvas # 监控整个系统资源 top # 查看内存使用详情 free -h
如果是系统内存不足触发OOM(内存溢出)杀死容器,在dmesg日志里能找到相关记录:
dmesg | grep -i oom
5. 调整容器日志驱动
默认的json-file驱动会随容器删除丢失日志,换成local驱动可以持久化保存日志:
# 临时生效,重启容器时添加参数 docker run --privileged --name openvas -dti --log-driver local -p 9392:9392 <image_name> # 永久生效,编辑/etc/docker/daemon.json文件,添加以下内容: { "log-driver": "local" } # 重启Docker服务使配置生效 systemctl restart docker
内容的提问来源于stack exchange,提问作者LewlSauce
相关产品推荐
相关产品推荐

