当前位置: 首页 > news >正文

Docker-玩转 Docker 镜像:从拉取、构建到发布

头图

Docker-玩转 Docker 镜像:从拉取、构建到发布

文章目录

  • Docker-玩转 Docker 镜像:从拉取、构建到发布
    • 摘要
    • 一、镜像是什么?为什么它是只读的?
      • 1.1 镜像的本质:分层文件系统
      • 1.2 镜像 ≠ 容器
    • 二、从 Docker Hub 拉取镜像
      • 2.1 查找镜像
      • 2.2 拉取镜像
    • 三、管理本地镜像:查看、删除与清理
      • 3.1 查看本地镜像
      • 3.2 删除镜像
    • 四、实战:用 `docker commit` 创建自定义镜像
      • 4.1 场景:定制一个带 `curl` 的 Nginx 镜像
        • 步骤 1:启动基础容器
        • 步骤 2:在容器内安装 curl
        • 步骤 3:提交为新镜像
        • 步骤 4:验证新镜像
      • 4.2 `docker commit` 的局限性
    • 五、镜像标签(Tag)与推送(Push)
      • 5.1 为镜像打标签
      • 5.2 推送镜像到私有仓库(以阿里云为例)
    • 六、常见误区与最佳实践
      • ❌ 误区 1:“镜像越大越好,功能越全越好”
      • ❌ 误区 2:“每次修改都要重新 pull 整个镜像”
      • ✅ 最佳实践清单:
    • 七、进阶预告:Dockerfile 才是王道
    • 结语

关键字: Dockerdocker pulldocker commitDocker Hub私有镜像仓库 UnionFS镜像分层

摘要

镜像,是 Docker 世界的“源代码”。
容器只是它的运行时实例,而镜像决定了容器能做什么、依赖什么、如何启动。

在上一篇《Docker 终极入门》中,我们成功运行了 hello-world 容器,初步理解了镜像与容器的关系。但那只是冰山一角。真正掌握 Docker,必须深入理解镜像的生命周期——如何获取、如何创建、如何管理、如何共享。

本文将带你系统掌握 Docker 镜像的核心操作:从官方仓库拉取镜像、查看本地镜像列表、删除无用镜像,到通过 docker commit 快速构建自定义镜像,并为后续使用 Dockerfile 打下基础。最后,我们还将简要介绍如何将镜像推送到私有仓库(如阿里云容器镜像服务),实现团队协作与持续交付。

准备好了吗?让我们一起“玩转” Docker 镜像!


一、镜像是什么?为什么它是只读的?

1.1 镜像的本质:分层文件系统

Docker 镜像并不是一个单一的文件,而是一个由多层只读文件系统叠加而成的联合文件系统(Union File System,简称 UnionFS)。

每一层代表一次变更:比如安装一个软件包、复制一个配置文件、设置环境变量等。这些层按顺序堆叠,最终形成完整的根文件系统。

Base Layer: OS (e.g., Ubuntu)
Layer 1: Install curl
Layer 2: Copy app code
Layer 3: Set ENV PORT=8080
Top Read-Only Image

这种设计带来两大优势:

  • 高效复用:多个镜像若基于同一基础镜像(如 ubuntu:22.04),则底层共享,节省磁盘空间;
  • 快速构建:修改某一层时,只需重建该层及之后的层,前面的缓存可直接复用。

💡 当你运行一个容器时,Docker 会在镜像顶部动态添加一个可写层(Container Layer),所有运行时的写入操作(如日志、临时文件)都发生在这里。容器停止后,该层可被丢弃或保留。

1.2 镜像 ≠ 容器

再次强调这个关键区别:

项目镜像(Image)容器(Container)
状态只读、静态可写、动态(运行时实例)
类比类(Class)对象(Object)
存储位置/var/lib/docker/image/...镜像 + 可写层
是否可变不可变可变(但重启后可写层丢失,除非持久化)

二、从 Docker Hub 拉取镜像

Docker Hub 是官方提供的公共镜像仓库,类似于 GitHub 之于代码。几乎所有主流软件都有官方镜像。

2.1 查找镜像

你可以通过以下方式查找镜像:

  • 浏览网站:搜索 “nginx”、“mysql”、“redis” 等;

  • 使用命令行:

    docker search nginx
    

    输出示例:

    NAME                DESCRIPTION                          STARS   OFFICIAL
    nginx               Official build of Nginx.             18000   [OK]
    jwilder/nginx-proxy Automated Nginx reverse proxy         5800
    

建议优先选择带 [OK] 标记的官方镜像(Official Images),它们经过安全审计、文档完善、更新及时。

2.2 拉取镜像

使用 docker pull 命令下载镜像:

# 拉取最新版 Nginx
docker pull nginx# 拉取指定版本(强烈推荐!)
docker pull nginx:1.25-alpine

📌 最佳实践:永远不要在生产环境中使用 latest 标签!它可能随时变动,导致不可预测的行为。应明确指定版本号(如 1.258u292-jre)。


三、管理本地镜像:查看、删除与清理

3.1 查看本地镜像

docker images

输出示例:

REPOSITORY    TAG           IMAGE ID       CREATED        SIZE
nginx         1.25-alpine   a6bd7d1c5b3a   2 weeks ago    42.3MB
hello-world   latest        feb5d9fea6a5   12 months ago  13.3kB
  • REPOSITORY:镜像名(通常对应软件名);
  • TAG:版本标签(如 latest, 1.0, alpine);
  • IMAGE ID:镜像唯一标识(SHA256 哈希值前几位);
  • SIZE:仅显示顶层大小,不包括共享层。

3.2 删除镜像

# 删除指定镜像(需先停止并删除相关容器)
docker rmi nginx:1.25-alpine# 强制删除(即使有容器引用)
docker rmi -f <IMAGE_ID># 删除所有未被使用的镜像(悬空镜像 + 无标签镜像)
docker image prune -a

⚠️ 注意:如果某个镜像正在被容器使用(即使是已停止的容器),Docker 默认不允许删除。可先执行 docker rm $(docker ps -aq) 清理所有容器(谨慎操作!)。


四、实战:用 docker commit 创建自定义镜像

虽然正式项目应使用 Dockerfile,但在调试或快速原型阶段,docker commit 是一个非常实用的技巧。

4.1 场景:定制一个带 curl 的 Nginx 镜像

假设我们需要一个既能运行 Nginx,又能用 curl 测试内部服务的容器。

步骤 1:启动基础容器
docker run -it --name my-nginx nginx:alpine sh
步骤 2:在容器内安装 curl
# 在容器 shell 中执行
apk add --no-cache curl
curl -I http://127.0.0.1  # 测试是否安装成功(会失败,因为 Nginx 未启动)

💡 注意:此时 Nginx 进程并未运行,因为我们覆盖了默认 CMD(nginx -g 'daemon off;')为 sh

步骤 3:提交为新镜像

另开一个终端,执行:

docker commit my-nginx my-nginx-with-curl:v1

现在,my-nginx-with-curl:v1 就包含了 curl 工具!

步骤 4:验证新镜像
docker run -d --name test-nginx my-nginx-with-curl:v1
docker exec test-nginx curl -I http://127.0.0.1

输出应包含 HTTP/1.1 200 OK,说明一切正常。

4.2 docker commit 的局限性

虽然方便,但 commit 方式存在明显缺点:

  • 不可追溯:无法知道镜像是如何构建的;
  • 难以复现:手动操作步骤容易遗漏;
  • 镜像臃肿:可能包含临时文件或调试工具。

因此,仅建议用于临时调试。正式项目请使用 Dockerfile(下一篇重点讲解)。


五、镜像标签(Tag)与推送(Push)

5.1 为镜像打标签

你可以为同一镜像设置多个标签:

# 为刚创建的镜像添加新标签
docker tag my-nginx-with-curl:v1 registry.cn-hangzhou.aliyuncs.com/your-namespace/my-nginx:v1

格式:<仓库地址>/<命名空间>/<镜像名>:<标签>

5.2 推送镜像到私有仓库(以阿里云为例)

  1. 登录阿里云容器镜像服务
    访问 阿里云容器镜像服务控制台,创建命名空间和镜像仓库。

  2. 登录 Docker Registry

    docker login --username=your-aliyun-account registry.cn-hangzhou.aliyuncs.com
    # 输入密码(可使用访问凭证)
    
  3. 推送镜像

    docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/my-nginx:v1
    

✅ 成功后,团队成员即可通过 docker pull 拉取该镜像,实现标准化部署。


六、常见误区与最佳实践

❌ 误区 1:“镜像越大越好,功能越全越好”

正解:镜像应遵循最小化原则。只包含运行应用所必需的组件。Alpine Linux 镜像(几 MB)远优于 Ubuntu(几百 MB)。

❌ 误区 2:“每次修改都要重新 pull 整个镜像”

正解:Docker 采用分层拉取。若基础层已存在,只会下载变更层,速度极快。

✅ 最佳实践清单:

  • 明确指定镜像 TAG,避免 latest
  • 优先使用官方或可信来源镜像;
  • 定期清理无用镜像(docker system prune);
  • 敏感信息(密码、密钥)绝不写入镜像;
  • 生产环境使用私有仓库,避免依赖公网。

七、进阶预告:Dockerfile 才是王道

虽然 docker commit 能快速构建镜像,但它无法满足工程化需求。下一讲,我们将深入学习 Dockerfile —— 一种声明式的镜像构建脚本,让你:

  • 完全掌控构建过程;
  • 实现构建可重复、可审计;
  • 利用缓存加速构建;
  • 编写符合安全规范的镜像。

届时,你会明白为什么所有 CI/CD 流水线都依赖 Dockerfile,而不是 commit


结语

镜像,是 Docker 生态的基石。掌握其拉取、管理、构建与发布,是你迈向 DevOps 和云原生开发的关键一步。

记住:好的镜像 = 小体积 + 明确版本 + 安全可靠 + 可复现

现在,你已经可以自信地说:“我不再只是运行容器,我还能打造属于自己的镜像!”


系列预告
下一篇 → 《Docker 容器生命周期管理:从创建到消亡》
我们将全面掌握 docker runexecstoprm 等核心命令,并理解容器状态机!


参考资料

  • Docker 官方镜像指南:https://docs.docker.com/develop/develop-images/
  • 阿里云容器镜像服务文档:https://help.aliyun.com/product/60716.html
  • 《Docker in Action》 by Jeff Nickoloff

博客签名2021
http://www.dtcms.com/a/597245.html

相关文章:

  • 技师院校人工智能技术应用专业实训室建设方案
  • HarmonyOS Tabs标签页组件深度解析:超越基础的高级技巧与实践
  • 无锡网站建设推荐wordpress 的分类目录
  • elasticSearch之java客户端详细使用:文档搜索API
  • 网页美工设计网站运维工程师可以自学吗
  • 手机网站制作注意事项卖产品的网站怎么做
  • Vue3 + Pinia 移动端Web应用:页面缓存策略解决方案
  • 可视化智能动作测评系统:用数据重塑每一个动作的科学评估时代
  • 算法32.0
  • 基于SpringBoot的锦州红色旅游资源信息管理系统的设计与实现
  • 静态网站建设教程wordpress采集接口
  • 网上购物有哪些网站?如何加入广告联盟赚钱
  • 解决 elementui el-cascader组件懒加载时存在选中状态丢失的问题?
  • vue3封装alert 提示组件 仿element-plus
  • Day33-动态规划
  • 域名访问过程会不会影响网站访问商务网站设计
  • 模仿elementUI 中Carousel 走马灯卡片模式 type=“card“ 的自定义轮播组件 图片之间有宽度
  • 公司网站建设哪家正规wordpress 按别名
  • 网站建设安全架构网络购物平台哪个最好
  • 2048——逻辑思维与矩阵合并算法
  • Qt:判断一个sql语句是否是select语句
  • 【题解】洛谷 P2470 [SCOI2007] 压缩
  • Java1111 实现一个方法,获取属性值 返回name
  • 存储核心:EXT文件系统
  • 品牌型网站的特点站长工具seo查询5g5g
  • 量子信息中的QASM
  • 阿里巴巴做网站费用网站功能价格表
  • MongoDB 删除数据库
  • android studio 在终端指定 jdk 1.8 打包 release~ MacOS版
  • 【STM32】HDC2080温湿度计驱动