Docker
Docker 排障四件套:日志、进容器、看资源、清磁盘
容器出问题,动作顺序固定下来就不会慌:先看状态和日志,再进容器验证,然后看资源,最后才怀疑镜像与编排。
一、状态与日志: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"