欢迎光临
我们一直在努力

Dockers镜像管理

/* 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 内核两大核心能力:

  • Namespace:做隔离,PID、Network、IPC、Mount、User 等命名空间,让容器拥有独立进程 ID、网卡、挂载视图;
  • Cgroups:做资源限制,限制容器 CPU、内存、磁盘 IO、网络带宽,避免单个容器耗尽宿主机资源。
  • 1.3 从 LXC 到 Docker,再到 K8s 时代

  • 2008 LXC:首个完整 Linux 容器工具,基于 Namespace+Cgroups。缺点是没有镜像机制,配置复杂,分发困难,只适合资深运维。
  • 2013 Docker 诞生:dotCloud 公司内部项目,创新引入镜像分层、Dockerfile、镜像仓库,解决应用打包分发难题,容器技术正式出圈。
  • 2015 OCI 开放容器基金会成立:制定容器镜像规范、运行时规范,避免容器生态分裂;同年 Kubernetes1.0 发布,容器进入集群编排时代。
  • 2016 runc、containerd 诞生:Docker 底层组件拆分,runc 真正创建容器;containerd 负责镜像管理与容器生命周期。
  • 2022 K8s 移除 dockershim:K8s 不再直接对接 Docker,containerd 成为 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 容器生态全景

    容器生态分为三大块:

  • 核心技术:OCI 规范、runtime (runc)、containerd、镜像定义 Dockerfile、镜像仓库 Registry;
  • 平台技术:编排引擎 Kubernetes、Docker Swarm;管理平台 Rancher、KubeSphere、Portainer;
  • 周边支持技术:容器网络 Calico/Flannel、服务发现 etcd、监控、日志、存储、镜像安全扫描。
  • 二、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 Daemon;
  • daemon 本地查找 nginx 镜像,如果不存在,去 Registry 仓库拉取镜像到本地;
  • daemon 基于镜像创建网络存储资源,实例化生成运行容器。
  • 小知识点: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 公共镜像。

    六、小结

  • 容器技术不是凭空诞生,底层依靠 Linux Namespace 隔离、Cgroups 资源限制;Docker 把内核复杂能力封装成简单工具;
  • Docker 是 C/S 架构,daemon 负责真正干活,客户端只发送指令;镜像是只读模板,容器是运行实例;
  • 镜像管理整套流程:search 查询 → pull 拉取 → tag 打标签 → inspect/history 查看元数据 → save 备份 → load 恢复 → push 推送仓库 → rm/prune 清理;
  • “一次构建到处运行” 的核心,就是镜像分层打包,消除开发测试生产环境差异。
  • 赞(0)
    未经允许不得转载:171主机测评 » Dockers镜像管理
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址