Docker KubernetesNotes

第 03 章:镜像与容器

zjc 于 2026-01-03 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 镜像是只读模板,容器是镜像的运行实例。理解分层结构、写时复制和容器生命周期,才能做安全、快速、可复现的交付。

3.1 分层镜像

Layer 1: base os
Layer 2: runtime
Layer 3: dependencies
Layer 4: application
Container writable layer

特点:

  1. 镜像层只读;
  2. 多镜像共享层;
  3. 构建缓存依赖指令顺序;
  4. 删除容器会删除可写层;
  5. Volume 挂载的数据不随容器层删除。

查看镜像:

docker images
docker image inspect nginx:1.27
docker history nginx:1.27

3.2 拉取与运行

docker pull nginx:1.27
docker run -d --name web -p 8080:80 nginx:1.27
docker ps
docker logs -f web
docker exec -it web sh

镜像 tag:

registry.example.com/shop/order-service:v1.2.0

生产不要只使用 latest,应使用不可变版本 tag 或镜像摘要。

3.3 容器生命周期

Created -> Running -> Paused -> Stopped -> Deleted

常用命令:

docker create --name web nginx:1.27
docker start web
docker restart web
docker stop web
docker rm web
docker rm -f web

退出容器:

docker ps -a
docker logs exited-container
docker inspect exited-container --format '{{.State.ExitCode}}'

3.4 前台进程与退出码

容器生命周期由 PID 1 进程决定:

docker run --name bad -d ubuntu sleep 300

PID 1 退出后容器退出。常见退出码:

退出码 含义
0 正常退出
1 应用错误
125 Docker 命令错误
126 命令不可执行
127 命令不存在
137 SIGKILL,常见 OOM
139 段错误
143 SIGTERM 正常终止

3.5 资源限制

docker run -d \
  --name app \
  --cpus="1.0" \
  --memory="512m" \
  --memory-swap="512m" \
  --pids-limit=200 \
  nginx:1.27

查看:

docker stats
docker inspect app --format '{{.HostConfig.Memory}}'

内存超限可能触发 OOM Kill;CPU 限制更多表现为节流和变慢。

3.6 容器与宿主机交互

环境变量:

docker run --rm -e APP_ENV=prod alpine printenv APP_ENV

文件挂载:

docker run --rm -v "$PWD/app.conf:/etc/app/app.conf" alpine cat /etc/app/app.conf

端口:

docker run -d -p 8080:80 -p 9090:9090/udp nginx:1.27

3.7 导出与导入

保存镜像:

docker save -o order.tar order-service:v1
docker load -i order.tar

导出容器文件系统:

docker export web | gzip > web-rootfs.tar.gz
docker import web-rootfs.tar.gz web:manual

save/load 保留镜像层和历史,适合分发镜像;export/import 丢失部分元数据,适合调试文件系统。

3.8 清理

docker container prune
docker image prune
docker volume prune
docker builder prune
docker system df
docker system prune

生产慎用自动清理,尤其 volume prune 可能删除仍需使用但未挂载的数据卷。

本章小结

镜像是静态模板,容器是受限进程。生产应固定版本、限制资源、正确处理 PID 1、区分容器层和持久化卷,并谨慎清理镜像与卷。

思考题

  1. 容器为什么共享宿主机内核?
  2. 镜像层和容器可写层有什么区别?
  3. 退出码 137 通常说明什么?
  4. save/load 和 export/import 有何差异?
  5. 为什么生产不用 latest 标签?