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 镜像分层结构 Docker 镜像分层结构 容器可写层(Writable) 镜像层 3:CMD / ENTRYPOINT 镜像层 2:RUN apt-get install 镜像层 1:FROM ubuntu:22.04 只读层共享 多个容器共用 底层镜像层 节省磁盘空间
关键命令速查:
  • 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 多服务编排架构 Docker Compose 多服务编排架构 docker-compose.yml 编排层 App 服务 端口 8080 Redis 缓存 端口 6379 MySQL 数据库 端口 3306 共享网络:cache-network 数据卷:redis-data → /data,mysql-data → /var/lib/mysql docker-compose up -d

以下是一个缓存治理项目典型的 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),避免非必要服务直接访问缓存端口。