/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
读懂 Docker:容器发展史、架构原理与镜像完整管理实战
摘要:“一次构建,到处运行”,Docker 的出现彻底改变软件交付模式。很多同学上手 Docker 只学会简单 run 启动容器,但对容器底层演进、C/S 架构、镜像分层、镜像全生命周期管理理解模糊。本文梳理容器技术完整发展史,拆解 Docker 核心架构,结合实操命令讲解镜像搜索、拉取、打标签、导出导入、推送仓库全流程,帮你建立完整 Docker 知识体系。
一、容器技术从哪里来?二十年演进之路

容器不是 Docker 发明的,它的隔离思想早在几十年前就已经萌芽,Docker 只是把复杂内核能力封装成简单易用工具,让容器真正大规模普及。
1.1 早期隔离思想萌芽
- 1979 年 Unix chroot:修改进程根目录,实现最简单文件系统隔离,但缺少 CPU、内存、网络隔离,是容器技术最早原型。
- 1998 FreeBSD Jails:在 chroot 基础上增加进程、网络隔离,可以在单机运行多个独立服务环境。
- 2000 Solaris Zones:商用操作系统级虚拟化,实现 CPU、内存、网络完整隔离。
1.2 Linux 内核两大基石:Namespace 与 Cgroups
容器能够实现隔离与资源限制,依靠 Linux 内核两大核心能力:
1.3 从 LXC 到 Docker,再到 K8s 时代
容器关键时间轴
表格
| 1979 | Unix chroot | 文件系统隔离原型 |
| 1998 | FreeBSD Jails | 操作系统级隔离雏形 |
| 2007 | Cgroups 并入内核 | 资源限制基石 |
| 2008 | LXC 项目诞生 | 第一个完整 Linux 容器工具 |
| 2013 | Docker 正式发布 | 镜像 + Dockerfile,容器大众化 |
| 2015 | OCI 成立、K8s1.0 发布 | 标准化 + 集群编排开启 |
| 2016 | runc、containerd | 分层容器运行时架构 |
| 2017 | K8s 移交 CNCF | K8s 成为编排事实标准 |
| 2022 | K8s 移除 dockershim | containerd 成为集群默认运行时 |
| 2023 至今 | Wasm、安全容器 | 轻量强隔离新方向 |
1.4 容器 vs 传统虚拟机
容器属于操作系统级虚拟化,虚拟机属于硬件级虚拟化。虚拟机需要完整操作系统,容器共享宿主机内核,这带来巨大差异:
表格
| 启动速度 | 秒级 | 分钟级 |
| 性能 | 接近原生 | 存在虚拟化损耗 |
| 内存开销 | 很小 | 较大 |
| 磁盘占用 | MB 级别 | GB 级别 |
| 单机密度 | 单机可跑上千容器 | 单机几十个虚拟机 |
| 隔离性 | 进程级安全隔离 | 硬件级别完全隔离 |
| 迁移性 | 优秀 | 一般 |
通俗类比:现实世界集装箱。不管里面装钢琴、水果、汽车,统一标准集装箱,卡车、轮船、火车直接搬运,不用开箱。Docker 就是软件世界的集装箱,把应用、依赖、配置全部打包,开发、测试、生产环境保持完全一致,解决经典的 “在我电脑能跑,线上不行” 问题。
1.5 容器生态全景
容器生态分为三大块:
二、Docker 核心 C/S 架构理解

Docker 采用经典客户端 – 服务端(C/S)架构,三大部分:Client 客户端、Docker Host 宿主机 (Docker Daemon、Images 镜像、Containers 容器)、Registry 镜像仓库。
Client 客户端:我们敲 docker 命令的终端,仅仅发送请求,不实际创建容器。例如docker pull、docker run指令,通过 Socket 发送给后台 daemon。
Docker Daemon 守护进程

:运行在宿主机后台,真正处理镜像拉取、构建、容器启停销毁。
- 镜像 Image:只读模板,相当于容器安装包,分层存储;镜像不能直接运行,实例化后才是容器。
- 容器 Container:镜像运行实例,在只读镜像上层增加一层可读写层;本质宿主机上受 Namespace、Cgroups 管控的进程。容器删除,读写层数据默认丢失。
Registry 镜像仓库:存放镜像,分为公开仓库 Docker Hub,私有 Harbor 镜像仓库。docker pull下载镜像,docker push上传镜像。
完整交互流程示例
执行docker run nginx:
小知识点:Docker 支持 C/S 分离部署,客户端和 daemon 可以不在同一台机器,客户端通过 TCP 远程调用远端 Docker 服务。
三、CentOS7 部署 Docker 环境实战
3.1 环境要点
操作系统:CentOS7 最小化安装,使用华为云 Docker CE 源安装,配置国内镜像加速解决 docker.io 访问慢问题。
注意:不要关闭 firewalld,Docker NAT 网络依赖防火墙。
#配置docker-ce华为源
cat > /etc/yum.repos.d/docker-ce.repo <<'EOF'
[docker-ce-stable]
name=Docker CE Stable – $basearch
baseurl=https://mirrors.huaweicloud.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=0
EOF
yum makecache
yum install -y docker-ce
#启动docker
systemctl enable docker –now
#配置镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<'EOF'
{
"insecure-registries": ["hub.laoma.cloud"],
"registry-mirrors": ["http://hub.laoma.cloud","https://docker.m.daocloud.io"]
}
EOF
systemctl restart docker
#验证
docker –version
#运行hello-world测试
docker run hello-world
#运行httpd web容器
docker run -d -p 80:80 httpd
curl 127.0.0.1
执行成功,输出It works!代表 Docker 环境部署完成。
四、Docker 镜像全生命周期管理(核心)

镜像是 Docker 一切的起点,掌握镜像搜索、拉取、打标签、查看详情、删除、清理、导出备份、推送私有仓库整套操作,是运维必备技能。
镜像标准命名格式:仓库地址:端口/项目/镜像名:tag;tag 默认是 latest,latest 不代表最新,只是默认标签。
4.1 search:搜索镜像
注意:国内环境直接 search Docker Hub 经常网络报错。查询镜像 tag 版本优先使用 API 方式。
#查询官方nginx所有标签,library代表官方镜像
curl -s "https://registry.hub.docker.com/v2/repositories/library/nginx/tags/" | jq '.results[].name'
查询私有 Harbor 镜像标签示例:
curl -s "http://hub.laoma.cloud/api/v2.0/projects/library/repositories/nginx/artifacts" | jq -r '.[].tags[].name' | sort -V
4.2 pull:拉取镜像
#拉取centos8镜像,不写tag默认latest
docker image pull centos:8
镜像下载是分层下载,多个镜像共享相同层,节省磁盘空间;镜像存储路径 /var/lib/docker/overlay2。
4.3 ls:查看本地镜像列表
docker image ls
#只输出镜像名和tag
docker image ls –format "{{.Repository}}:{{.Tag}}"
同一个镜像可以拥有多个 tag,多个 tag 指向同一个 IMAGE ID,实际磁盘只存一份镜像。
4.4 tag:镜像打标签
tag 不会复制镜像文件,只是给同一个镜像 ID 新增别名。
docker image tag centos:8 myos:v1
✅镜像 tag 版本最佳实践 假设镜像版本 v1.9.1,建议同时打多个标签:myimage:1.9.1、myimage:1.9、myimage:1、myimage:latest。
- myimage:1:永远指向 1 分支最新版本;
- myimage:1.9:永远指向 1.9.x 最新小版本;
- myimage:latest:指向大版本最新; 需要锁定版本就写完整版本号,避免 latest 带来版本不可控风险。
4.5 inspect:查看镜像详细元数据
可以查看镜像架构、系统、环境变量、分层、Label、Cmd 等信息。
#完整输出
docker image inspect myos
#格式化提取字段,示例获取架构
docker image inspect myos -f '{{.Architecture}}'
4.6 history:查看镜像构建分层历史
Docker 镜像采用分层存储,history 可以看到每一层创建命令与大小。
docker image history myos –no-trunc
4.7 rm:删除镜像
- 如果镜像有多个 tag,删除只是解除标签(untag);只有删除最后一个 tag,镜像文件才真正删除;
- 如果镜像被容器(停止 / 运行)引用,普通删除失败,需要-f强制删除。
#按标签删除
docker image rm myos:v1
#按镜像ID强制删除
docker image rm 5d0da3dc9764 -f
4.8 prune:清理无用镜像
#只清理悬空镜像(<none>无标签镜像)
docker image prune
#清理所有没有被任何容器使用的镜像
docker image prune -a
⚠️注意:只要存在容器(哪怕已经退出停止),对应镜像不会被 prune 删除。
4.9 save & load:镜像备份导出、导入
save 会保存完整镜像分层历史,适合离线环境迁移镜像。
#导出单个镜像到tar包
docker save httpd -o httpd.tar
#同时导出多个镜像
docker save httpd hello-world -o images.tar
#导入镜像包
docker load -i images.tar
4.10 login & push:推送镜像到私有仓库
推送镜像前,镜像名称必须带上私有仓库地址前缀。
#登录harbor私有仓库
docker login hub.laoma.cloud
#打标签,带上仓库地址项目名称
docker tag hello-world:latest hub.laoma.cloud/test/hello-world:v1
#推送
docker push hub.laoma.cloud/test/hello-world:v1
五、容器生态延伸思考
Docker 更多定位开发构建工具;在 Kubernetes 集群环境,底层运行时已经普遍使用 containerd。nerdctl、podman 都是兼容 OCI 标准的新一代容器工具。
- OCI 规范统一镜像格式,同一个镜像可以跑在 docker、containerd、podman 上;
- latest 标签不要用于生产环境,必须明确指定版本 tag;
- 离线环境镜像交付优先使用save/load;
- 生产环境一定要搭建私有 Harbor 镜像仓库,不要直接依赖 Docker Hub 公共镜像。




