一、为什么运维要懂 Docker
现在服务几乎都跑在容器里。懂 Docker 不只是”会 docker run”,更是会排查镜像、网络、存储、资源这些线上问题。
二、最常用的排查命令
docker ps -a # 看所有容器状态
docker logs -f --tail 100 容器名 # 跟日志
docker stats # 实时看 CPU/内存/网络
docker exec -it 容器名 sh # 进容器排错
docker inspect 容器名 # 看配置/挂载/网络细节
三、镜像瘦身与版本管理
- 用 多阶段构建,只把产物拷进最终镜像;
- 基础镜像选
alpine/distroless,别动辄几百 MB; - 镜像打语义化 tag(如
v1.3.0),禁止长期用latest上线。
FROM golang:1.22 AS build
WORKDIR /app
COPY . .
RUN go build -o svc .
FROM gcr.io/distroless/base-debian12
COPY --from=build /app/svc /svc
ENTRYPOINT ["/svc"]
四、日志与数据持久化
| 事项 | 做法 |
|---|---|
| 日志 | 打到 stdout/stderr,交给 docker logs 或采集器,别写容器内部文件 |
| 数据 | 用 volume 挂载,数据库等状态数据绝不丢在容器层 |
| 清理 | 定期 docker system prune 回收悬空镜像/容器 |
五、资源限制(防单机被拖垮)
docker run -d --name svc
--memory=512m --memory-swap=512m
--cpus=1.0
-p 8080:8080 myapp:v1.3.0
六、docker compose 管理多服务
services:
web:
image: myapp:v1.3.0
ports: ["8080:8080"]
deploy:
resources:
limits: { cpus: "1.0", memory: 512M }
redis:
image: redis:7-alpine
七、常见排错清单
- 起不来先看
docker logs和inspect的 ExitCode; - 网络不通查自定义 bridge 与端口映射;
- 磁盘爆了查 volume 与日志堆积;
- 性能差先用
docker stats定位是哪个容器。
把上面这些命令和习惯用熟,容器环境下的日常运维基本能自己扛,不用每次都请人。