Docker

Docker 排障四件套:日志、进容器、看资源、清磁盘

分类:Docker · 阅读约 7 分钟

容器出问题,动作顺序固定下来就不会慌:先看状态和日志,再进容器验证,然后看资源,最后才怀疑镜像与编排。

一、状态与日志:90% 的问题在这里现形

docker ps -a                    # 退出码先看:137=OOM/被杀,1=程序自己崩
docker logs --tail 200 -f <容器>  # 跟随日志
docker logs --since 30m <容器>    # 只看最近半小时
docker inspect <容器> --format '{{.State.ExitCode}} {{.State.Error}}'
docker inspect <容器> --format '{{.RestartCount}}'  # 反复重启会一直涨

二、进容器:确认"里面"看到的世界

docker exec -it <容器> sh        # 多数镜像只有 sh,没有 bash
docker exec -it <容器> bash      # 有 bash 时再用这个
# 容器已退出进不去?临时以 shell 启动同一个镜像看文件:
docker run --rm -it --entrypoint sh <镜像>
# 端口在容器里通不通(宿主机视角):
docker port <容器>; ss -lnt | grep <端口>
进容器后优先验证三件事:配置文件挂对了没有(ls / cat 挂载路径)、DNS 能不能解析(nslookup 或 ping 域名)、依赖的端口连不连得上。这三样排除了,剩下多半是程序本身。

三、资源:是不是被饿死或撑爆

docker stats --no-stream        # 各容器 CPU / 内存快照
docker inspect <容器> --format '{{.HostConfig.Memory}}'  # 内存上限(0=无限)

四、磁盘:Docker 是隐形大户

docker system df                # 镜像 / 容器 / 卷 / 缓存各占多少
docker system df -v             # 细到每一个
# 安全清理(不碰正在用的和数据卷):
docker image prune -a           # 删无容器引用的镜像
docker builder prune            # 清构建缓存
docker container prune          # 删已停止的容器
别顺手加 --volumes:docker system prune --volumes 会删掉未被容器引用的数据卷——数据库的数据可能就在里面。清理前先 docker volume ls 看清有什么。

还有一个常被忽略的磁盘杀手:容器日志。单个容器日志文件在 /var/lib/docker/containers/<id>/*-json.log,没有轮转时能长到几十 GB。长期运行的服务建议在 compose 里给每个服务加:

logging:
  driver: json-file
  options:
    max-size: "10m"
    max-file: "3"