1. Docker 基础回顾:架构、核心组件与安装配置

在进入授权测试与数据传输优化之前,必须牢固掌握 Docker 的基础体系。本章从架构、核心组件到安装配置,建立统一的术语与操作基准,确保后续章节的实践环节不会因基础概念混淆而产生偏差。

1.1 Docker 整体架构

Docker 采用典型的 C/S(客户端-服务器) 架构。用户通过 Docker CLI 或 API 向 Docker Daemon 发送指令,Daemon 负责管理镜像、容器、网络与存储卷等资源。整个体系由三个核心角色构成:

  • Docker Client(客户端):用户与 Docker 交互的命令行工具或 REST API 调用方。
  • Docker Daemon(守护进程):运行在宿主机上的后台服务,负责构建、运行、分发容器。
  • Docker Registry(仓库):存储与分发镜像的中央或私有服务,默认使用 Docker Hub。
Docker C/S 架构图 Docker Client docker run / build / pull Docker Daemon 管理容器 / 镜像 / 网络 Docker Registry 镜像存储与分发 REST API / socket push / pull 容器运行时 镜像层缓存 说明 Daemon 通过 containerd 管理容器生命周期
架构要点:Docker Daemon 并不直接创建容器,而是通过 containerd 和 runc 等底层组件完成容器生命周期管理。Client 与 Daemon 之间可以通过 Unix socket(默认)或 TCP 通信,后者常用于远程管理场景,也是授权测试中需要关注的安全边界。

1.2 核心组件详解

Docker 的三大核心组件——镜像(Image)、容器(Container)、仓库(Repository)——构成了整个生态的基石。下表从定义、生命周期、存储方式三个维度进行对比:

维度 镜像(Image) 容器(Container) 仓库(Repository)
定义 只读模板,包含运行应用所需的文件系统、依赖与配置 镜像的运行实例,拥有独立的文件系统、网络与进程空间 存储与分发镜像的集中式服务
生命周期 持久化存储,可被多次引用和构建 临时性,可创建、启动、停止、删除 长期运行,支持版本管理与访问控制
存储方式 分层存储(UnionFS),每层只读 在镜像层之上添加可写层(容器层) 远程存储(公有/私有),本地缓存
标识 镜像名:标签(如 nginx:1.25) 容器 ID(64 位十六进制哈希) 仓库地址/镜像名:标签

1.3 镜像分层与容器写时复制

理解镜像的分层结构是优化传输与授权测试的前提。每个 Dockerfile 指令都会生成一个新的只读层,容器启动时在顶层叠加一个可写层。这种设计带来两个关键特性:

  • 层共享:多个容器共用相同的基础层,节省磁盘与内存。
  • 写时复制(Copy-on-Write, CoW):容器对文件的修改只发生在可写层,原始镜像层不受影响。
镜像分层与容器写时复制(CoW) 可写容器层(当前容器) 镜像层 3:应用代码 镜像层 2:依赖库 镜像层 1:基础 OS 写时复制(CoW)原理 1. 容器读取文件时,从最上层向下查找。 2. 修改文件时,将文件从只读层复制到可写层。 3. 后续读写均操作可写层,原始镜像层不变。 4. 删除容器后,可写层被丢弃,镜像层保留。 5. 多个容器共享同一镜像时,各自拥有独立可写层。
授权测试关联:容器可写层的临时性意味着:如果容器被入侵,攻击者对文件系统的修改在容器重启后可能丢失(除非挂载了持久化卷)。这一特性既是安全优势(快速恢复),也是取证难点(日志与痕迹易丢失)。

1.4 Docker 安装与配置

以下以 Ubuntu 22.04 LTS 为例,展示标准安装流程。生产环境建议使用官方仓库安装,避免使用系统自带的老旧版本。

1.4.1 安装步骤

  1. 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc
  1. 设置 Docker 官方 GPG 密钥与仓库
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 验证安装
sudo docker run hello-world

1.4.2 安装后配置

配置项 命令 / 操作 说明
将用户加入 docker 组 sudo usermod -aG docker $USER 避免每次使用 sudo,需重新登录生效
设置 Docker 开机自启 sudo systemctl enable docker 生产环境建议开启
配置镜像加速器 编辑 /etc/docker/daemon.json,添加 registry-mirrors 国内环境可显著提升 pull 速度
配置日志驱动与限制 在 daemon.json 中设置 log-driver 和 log-opts 防止容器日志撑满磁盘

1.4.3 核心配置示例(daemon.json)

{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "exec-opts": ["native.cgroupdriver=systemd"],
  "storage-driver": "overlay2"
}
安全提醒:将用户加入 docker 组等同于赋予该用户 root 权限,因为用户可以通过挂载宿主机目录等方式完全控制宿主机。在授权测试环境中,应严格限制 docker 组成员,或使用 Rootless 模式运行 Docker。

1.5 常用命令速查

分类 命令 用途
镜像 docker images 列出本地镜像
docker pull <镜像名>:<标签> 从仓库拉取镜像
docker rmi <镜像ID> 删除本地镜像
容器 docker run -it --rm <镜像> 创建并启动容器(交互式,退出后自动删除)
docker ps -a 查看所有容器(包括已停止)
docker exec -it <容器ID> /bin/bash 进入运行中的容器
仓库 docker login <仓库地址> 登录镜像仓库
docker push <镜像名>:<标签> 推送镜像到仓库
系统 docker info 查看 Docker 系统信息(版本、存储驱动、容器数等)

1.6 本章小结