0aa8fe6
这次没有正文改动。
这是 container/容器排障:网络、磁盘、日志.md 的改动记录。后台每次保存都会留一份快照,
这里显示的是快照之间的差异,不会混入其他文章的改动。
还没有后台修改记录。
下面是 Git 里的提交,可能包含其他文章的改动(因为一次提交会带上工作区所有变化)。
0aa8fe6
这次没有正文改动。
69302a9
@@ -0,0 +1,77 @@ +--- +tags: [Docker, 排障, 网络] +order: 30 +--- + +# 容器排障:网络、磁盘、日志 + +## 场景 + +容器起不来、连不上、把磁盘写满,或者端口映射了却访问不到。 + +## 前置条件 + +- 能 `docker ps -a` 看到容器状态 +- 知道容器名或 ID +- 宿主机有 root + +## 配置 + +### 容器起不来 + +```bash +docker ps -a # 看 STATUS 和退出码 +docker logs --tail 200 容器名 +docker inspect 容器名 | grep -A5 '"State"' +``` + +退出码:`137` 是被 kill(内存超限),`127` 是命令不存在,`1` 看应用日志。 + +### 网络 + +```bash +docker network ls +docker inspect 容器名 | grep IPAddress +docker exec -it 容器名 ping db +docker port 容器名 +ss -lntp | grep 8080 +``` + +### 磁盘 + +```bash +docker system df -v +du -sh /var/lib/docker/* | sort -h +docker system prune -a --volumes # 慎用 +``` + +### 资源 + +```bash +docker stats --no-stream +docker inspect 容器名 | grep -i memory +``` + +## 验证 + +```bash +curl -I http://127.0.0.1:8080 +docker exec -it 容器名 curl -I http://db:3306 +``` + +## 回滚 + +起不来先回滚镜像版本: + +```bash +docker compose up -d --force-recreate +``` + +## 坑 + +- **`137` 一般是内存超限**,加 `--memory` 或者看宿主机 OOM。 +- 端口映射了但访问不到,先看宿主机防火墙,再看云安全组。 +- 容器内 DNS 解析失败,检查 `/etc/resolv.conf` 和 daemon 的 `dns` 配置。 +- 日志把盘写满,`json-file` 没配 `max-size`。 +- `prune --volumes` 会删数据卷,别在生产随手敲。 +- MTU 不一致导致跨主机通信时断时续,尤其是 VXLAN 环境。