
大家好,我是刘叨叨,一个致力于让碎片化技术系统性的运维人。
如果说容器是“正在运行的进程”,那么镜像就是容器的“静态蓝图”。今天,我们将深入幕后,掌握镜像的完整操作链条——从拉取、推送到分析、管理,直至搭建你自己的私有镜像仓库。这是实现环境标准化和高效交付的基石。
镜像操作是Docker日常使用中最频繁的部分。
# 1. 从仓库拉取镜像(推荐指定具体标签,而非默认的latest)
docker pull nginx:alpine
# 2. 列出本地镜像(-q 参数仅显示镜像ID,便于脚本处理)
docker images
docker images -q
# 3. 搜索Docker Hub上的镜像
docker search redis --limit 5
# 4. 删除本地镜像(-f 强制删除)
docker rmi nginx:alpine
# 5. 镜像的离线导入与导出(适用于内网/离线环境迁移)
在内网部署或需要迁移特定版本镜像时,常用 docker save 和 docker load 命令进行离线操作。
# 将指定镜像导出为一个 `.tar` 归档文件(适合备份或传输)
docker save -o nginx_alpine.tar nginx:alpine
# 参数说明:-o (--output) 指定输出文件名
# 从归档文件将镜像完整加载到本地(包含其所有历史层和元数据)
docker load -i nginx_alpine.tar
# 参数说明:-i (--input) 指定输入文件
# 另一种常用简写(效果相同)
docker save nginx:alpine > nginx_alpine.tar
docker load < nginx_alpine.tar镜像是通过 仓库地址/命名空间/镜像名:标签 来唯一标识的。
# 1. 为本地镜像打上新标签(准备推送或版本管理)
docker tag nginx:alpine 192.168.1.100:5000/lddops/nginx:v1.0
# 命令格式:docker tag 源镜像[:标签] 新镜像名:新标签
# 2. 推送镜像到远程仓库(需先登录或有权限)
docker push 192.168.1.100:5000/lddops/nginx:v1.0
# 3. 登录/登出镜像仓库
docker login 192.168.1.100:5000
docker logout 192.168.1.100:5000理解镜像的分层存储是优化镜像和高效运维的关键。
# 1. 查看镜像的详细元数据(JSON格式)
docker image inspect nginx:alpine | jq .[0].RootFS.Layers
# 使用 jq 工具可以清晰看到组成该镜像的所有只读层(Layer)的哈希值
# 2. 查看镜像的构建历史(每一层对应的Dockerfile指令)
docker history nginx:alpine分层带来的核心优势:
在生产环境中,出于安全、速度和合规性要求,搭建私有镜像仓库是必然选择。我们将从最简单的官方 Registry 开始。作为基础入门,后续我们还将单篇详细讲解功能更强大的企业级镜像仓库解决方案—— Harbor。
Docker官方提供了开源的 Registry 镜像,搭建非常简单。
# 1. 拉取 registry:2 镜像
docker pull registry:2
# 2. 运行一个基础私有仓库容器
docker run -d \
--name private-registry \
-p 5000:5000 \
-v /opt/lddops/registry:/var/lib/registry \
--restart=always \
registry:2
# 参数拆解:
# -d : 后台运行
# --name : 容器名称
# -p 5000:5000 : 端口映射,将宿主机的5000端口映射到容器的5000端口
# -v /opt/lddops/registry:/var/lib/registry : 数据卷挂载,将容器内镜像存储目录持久化到宿主机,防止容器重启数据丢失
# --restart=always : 重启策略,确保服务在Docker守护进程重启后也能自动运行执行后,一个私有仓库就在 http://你的服务器IP:5000 运行了。
默认情况下,Docker认为本地localhost的Registry是安全的,但非localhost的HTTP仓库需要显式声明为“受信任”。
# 1. 【关键】配置Docker Daemon,信任你的私有仓库地址(假设IP为192.168.1.100)
# 编辑 /etc/docker/daemon.json,添加或合并 "insecure-registries" 配置项
{
"insecure-registries": ["192.168.1.100:5000"]
}
# 保存后,重启Docker服务使配置生效
sudo systemctl restart docker
# 2. 重标签并推送镜像到私有仓库
docker tag nginx:alpine 192.168.1.100:5000/my-nginx:prod-v1
docker push 192.168.1.100:5000/my-nginx:prod-v1
# push 命令会将镜像及其所有层推送到指定仓库
# 3. 从私有仓库拉取镜像
docker pull 192.168.1.100:5000/my-nginx:prod-v1Registry API 是 RESTful 风格的,我们可以用 curl 命令进行基础查询。
# 1. 查询仓库中有哪些镜像项目(`_catalog`)
curl -X GET http://192.168.1.100:5000/v2/_catalog
# 返回示例:{"repositories":["my-nginx"]}
# 2. 查询某个镜像的所有标签(`tags/list`)
curl -X GET http://192.168.1.100:5000/v2/my-nginx/tags/list
# 返回示例:{"name":"my-nginx","tags":["prod-v1"]}长期使用后,系统会积累临时镜像和悬虚镜像(<none>:<none>),可按需求清理(谨慎操作)。
# 1. 删除所有悬虚镜像(未被任何标签引用的中间构建层)
docker image prune -f
# `-f` 或 `--force` 参数表示跳过确认提示
# 2. 删除所有未被使用的镜像(未被任何容器引用的所有镜像)
docker image prune -a -f
# `-a` 或 `--all` 参数表示删除所有未使用的镜像,不仅仅是悬虚镜像
# 3. 【谨慎使用】一键清理(停止的容器、未使用的网络、悬虚镜像、构建缓存)
docker system prune -f镜像管理是高效运维的基本功,建议你动手实践:
busybox:latest 镜像到其中。在配置 insecure-registries 前后,执行 docker push 命令有什么不同?这个配置解决了什么问题?欢迎在评论区分享你的操作笔记或排查思路。
🔜 下期预告
掌握了镜像的“收与藏”,下一步我们将学习如何“造”。下一篇,我们将进入更高阶的主题:《Dockerfile基础:FROM、RUN、COPY指令与构建优化》,手把手教你如何像编写代码一样,通过 Dockerfile 来定制和构建属于自己的、高效安全的容器镜像。
搜索关注【刘叨叨趣味运维】公众号,用有趣的方式,啃下最硬核的技术。咱们下期见!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。