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 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):容器对文件的修改只发生在可写层,原始镜像层不受影响。
授权测试关联:容器可写层的临时性意味着:如果容器被入侵,攻击者对文件系统的修改在容器重启后可能丢失(除非挂载了持久化卷)。这一特性既是安全优势(快速恢复),也是取证难点(日志与痕迹易丢失)。
1.4 Docker 安装与配置
以下以 Ubuntu 22.04 LTS 为例,展示标准安装流程。生产环境建议使用官方仓库安装,避免使用系统自带的老旧版本。
1.4.1 安装步骤
- 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc
- 设置 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
- 安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 验证安装
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 系统信息(版本、存储驱动、容器数等) |