通过本课件,你将掌握:
Docker 的核心架构模型:理解客户端 - 服务器(Client-Server)模式如何驱动容器生命周期。
四大核心组件的作用与交互:Docker Client、Docker Host、Docker Daemon 与 Registry。
Docker 对象的本质:深入理解镜像(Image)、容器(Container)、存储(Volume)与网络(Network)。
容器启动全过程:从 docker run 命令到 Linux 内核命名空间(namespace)与控制组(cgroup)的完整链路。
数据持久化与网络隔离策略:掌握 Volumes、Bind Mounts 及多种网络驱动的适用场景。

Docker 采用经典的 客户端 - 服务器(Client-Server)架构。用户通过 Docker Client 发出指令,由后台的 Docker Daemon(守护进程)执行实际操作,如构建、运行和管理容器。两者之间通过 REST API 通信:
在 Linux 系统上,默认使用 UNIX 套接字(如 /var/run/docker.sock);
若需远程管理,则可通过 网络接口(如 TCP)进行通信。
整个系统由以下三大核心部分构成:
工作流简述:
用户 → Client → 向 Daemon 发送指令 → Host → Daemon 检查本地是否有镜像 → 若无 → 从 Registry 拉取 → 启动容器
角色:Docker 系统的“大脑”,常驻后台进程。
功能:
监听来自 Client 的 REST API 请求;
管理所有 Docker 对象:镜像、容器、网络、卷;
支持多主机协作(如 Docker Swarm 集群中与其他 Daemon 通信)。
运行位置:Docker Host 上。
角色:用户与 Docker 交互的主要界面(通常为 CLI)。
工作方式:
将 docker ps 等命令转换为 REST API 请求;
发送给 Docker Daemon 处理;
支持连接多个 Daemon(通过 -H 参数指定不同主机)。
常用命令:
docker build # 从 Dockerfile 构建镜像
docker pull # 从 Registry 拉取镜像
docker run # 基于镜像创建并启动容器即运行容器的宿主机,包含:
操作系统(含 Linux 内核);
Docker Daemon(dockerd);
已拉取或构建的镜像;
正在运行的容器;
网络与存储资源(如 bridge 网络、volumes)。
关键点:容器并非直接运行在“裸机”上,而是依赖 Host 的内核能力(如 namespace、cgroup)。
定义:用于存储和分发 Docker 镜像的无状态、可扩展服务。
类型:
公共 Registry:如 Docker Hub,提供大量官方与社区镜像;
私有 Registry:企业常用 Harbor、AWS ECR、Google Artifact Registry 等,保障安全与合规。
核心命令:
docker pull nginx # 从默认 Registry 拉取 nginx 镜像
docker push my-app:v1 # 将本地镜像推送到 Registry使用 Docker 时,我们实际是在操作一系列“对象”:
本质:只读模板,用于创建容器,类似于面向对象编程中的“类”。
构建方式:通过 Dockerfile 定义构建步骤。
分层结构:
每条 Dockerfile 指令生成一个只读层;
层级复用机制极大提升构建与传输效率(如多个镜像共享基础层)。
示例:
FROM ubuntu:22.04→RUN apt-get update→COPY app.py /app→ 形成三层镜像。
本质:镜像的可运行实例,如同“对象”之于“类”。
特性:
可通过 CLI/API 创建、启动、停止、删除;
强隔离性:拥有独立的文件系统、网络栈、进程空间;
同一镜像可启动多个容器(如 10 个 Nginx 实例)。
容器的可写层是临时的(ephemeral),容器删除后数据即丢失。为此,Docker 提供三种持久化方案:
最佳实践:数据库等有状态服务务必使用 Volumes。
Docker 默认提供网络隔离,同时支持灵活组网:
让我们追踪一条常见命令的完整执行链路:
docker run -d -p 80:80 nginxClient → 将命令转换为 REST API 请求,发送给 Docker Daemon。
Daemon → 接收请求,检查本地是否存在 nginx 镜像。
Registry(若镜像不存在)→ 自动从 Docker Hub 拉取 nginx:latest 镜像。
Runtime 层(containerd + runc)
Daemon 将镜像与配置交给 containerd(高级容器运行时);
containerd 调用 runc(底层运行时);
runc 通过 Linux 内核创建:
Namespaces:实现 PID、网络、文件系统等隔离;
Cgroups:限制 CPU、内存等资源使用。
容器启动
Nginx 进程作为 PID 1 在容器内运行;
主机的 80 端口 映射到容器的 80 端口(-p 80:80);
用户访问 http://localhost 即可看到 Nginx 欢迎页。
技术栈层级:CLI → Docker Daemon → containerd → runc → Linux Kernel (namespaces + cgroups)
为什么 Docker 镜像采用分层设计?这种设计对 CI/CD 流水线有何优势?
在生产环境中,为何推荐使用 Volumes 而非 Bind Mounts 来持久化数据库数据?
如果 docker run 时未指定网络驱动,容器会使用哪种网络?如何验证其 IP 地址和网关?
📘 延伸阅读: