4. Docker 基础回顾:镜像、容器、Dockerfile 与 Compose
在进入缓存一致性治理项目之前,必须牢固掌握 Docker 的四大核心概念:镜像(Image)、容器(Container)、Dockerfile 和 Docker Compose。它们是容器化部署的基石,也是后续治理策略的物理载体。
4.1 核心概念对比
| 概念 | 本质 | 类比 | 生命周期 |
|---|---|---|---|
| 镜像 | 只读的、分层文件系统模板 | ISO 安装盘 / 类定义 | 持久化存储,可复用 |
| 容器 | 镜像的运行实例,包含可写层 | 运行中的进程 / 对象实例 | 创建→运行→暂停→删除 |
| Dockerfile | 构建镜像的自动化脚本 | 配方 / 构建说明书 | 一次编写,多次构建 |
| Docker Compose | 多容器编排定义(YAML) | 乐队总谱 / 部署蓝图 | 项目级启动与停止 |
记忆要点:镜像 = 静态模板,容器 = 动态沙箱,Dockerfile = 如何制作模板,Compose = 如何组织多个沙箱。
4.2 Docker 镜像与分层文件系统
Docker 镜像采用 UnionFS(联合文件系统) 技术,由多个只读层叠加而成。每一层对应 Dockerfile 中的一条指令,层与层之间共享并缓存。这种设计使得镜像构建极快、存储极省。
关键命令速查:
docker pull <image>— 拉取镜像docker images— 列出本地镜像docker rmi <image>— 删除镜像docker build -t <tag> .— 构建镜像
4.3 容器:运行时的隔离环境
容器是镜像的实例化产物。每个容器拥有独立的文件系统、网络栈、进程空间和资源限制。容器在镜像层之上增加一个 可写层,所有运行时修改(日志、缓存、临时文件)都写入该层。容器删除后,可写层默认丢失——这正是缓存一致性治理需要重点关注的场景。
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 创建并启动 | docker run -d --name redis-cache redis:7 |
后台运行 Redis 容器 |
| 列出容器 | docker ps -a |
显示所有状态容器 |
| 进入容器 | docker exec -it <container> bash |
交互式 Shell |
| 停止/启动 | docker stop/start <container> |
控制生命周期 |
| 查看日志 | docker logs -f <container> |
实时跟踪输出 |
| 删除容器 | docker rm -f <container> |
强制删除(含可写层) |
缓存治理警示:容器重启或删除后,内部缓存数据(如 Redis 的 RDB/AOF 文件)若不挂载外部卷,将全部丢失。务必在
docker run 中使用 -v 或 --mount 持久化缓存目录。
4.4 Dockerfile:镜像构建说明书
Dockerfile 通过一系列指令定义镜像内容。每条指令生成一个只读层,构建时按顺序执行。以下是缓存治理项目中常用的 Dockerfile 模板结构:
# 1. 基础镜像
FROM openjdk:17-slim
# 2. 维护者信息
LABEL maintainer="cache-team@example.com"
# 3. 设置工作目录
WORKDIR /app
# 4. 复制应用 JAR 包(利用构建缓存)
COPY target/cache-gateway-*.jar app.jar
# 5. 暴露缓存服务端口
EXPOSE 8080 6379
# 6. 定义数据卷(推荐挂载点)
VOLUME /data/cache
# 7. 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
| 指令 | 用途 | 缓存治理最佳实践 |
|---|---|---|
FROM |
指定基础镜像 | 优先选择 slim/alpine 版本,减少攻击面 |
RUN |
执行构建命令 | 合并多条 RUN 为一条,减少层数 |
COPY / ADD |
添加文件到镜像 | 优先使用 COPY,ADD 仅用于自动解压 |
VOLUME |
声明挂载点 | 缓存目录必须声明,便于外部卷挂载 |
EXPOSE |
声明端口 | 仅作文档用途,实际映射在运行时指定 |
4.5 Docker Compose:多容器编排
在缓存一致性治理项目中,通常需要同时运行多个服务:应用服务、Redis 缓存、MySQL 数据库、消息队列等。Docker Compose 通过一个 docker-compose.yml 文件定义整个服务栈,实现一键启动与停止。
以下是一个缓存治理项目典型的 docker-compose.yml 核心片段:
version: "3.8"
services:
app:
build: .
ports:
- "8080:8080"
volumes:
- app-cache:/data/cache
depends_on:
- redis
- mysql
networks:
- cache-net
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
command: redis-server --appendonly yes
networks:
- cache-net
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: cache_root_pw
volumes:
- mysql-data:/var/lib/mysql
networks:
- cache-net
volumes:
app-cache:
redis-data:
mysql-data:
networks:
cache-net:
driver: bridge
Compose 常用命令:
docker-compose up -d— 后台启动所有服务docker-compose down— 停止并删除容器和网络(默认不删卷)docker-compose down -v— 停止并删除容器、网络、数据卷(谨慎使用!)docker-compose logs -f— 跟踪所有服务日志docker-compose exec <service> bash— 进入指定服务容器
4.6 缓存治理视角的 Docker 要点总结
- 镜像层缓存:Docker 构建时会缓存每一层,频繁变化的层(如
COPY代码)应放在 Dockerfile 尾部,以最大化缓存命中。 - 容器可写层:缓存数据必须通过
VOLUME或-v挂载到宿主机或命名卷,否则容器删除即丢失。 - Compose 依赖顺序:使用
depends_on控制启动顺序,但真正的就绪检查需要借助healthcheck或等待脚本。 - 网络隔离:为缓存服务创建独立网络(如
cache-net),避免非必要服务直接访问缓存端口。