视频加载失败

Docker 镜像的使用

1798 字
9 分钟
Docker 镜像的使用

获取镜像#

从 Docker 镜像仓库获取镜像可谓是 Docker 运作的第一步。本节将介绍如何使用 docker pull 命令下载镜像,以及如何理解下载过程。

版本号最佳实践

  • 永远指定版本号:避免使用 latest 标签,应指定具体的版本(如 ubuntu:24.04、nginx:1.28),以确保镜像内容稳定一致。
  • 在生产环境使用摘要:优先使用镜像摘要(SHA256)而非标签,如 nginx@sha256:abc123...,因为摘要不可变。
  • 定期评估依赖:即使指定了版本号,仍应定期检查依赖的基础镜像是否有安全更新。

docker pull 命令#

从镜像仓库获取镜像的命令是 docker pull:

Terminal window
docker pull [选项] [Registry地址/]仓库名[:标签]

镜像名称格式#

Docker 镜像名称由 Registry 地址、用户名、仓库名和标签组成。其标准格式如下:

默认值

官方镜像默认

示例

示例

镜像地址完整结构

docker.io

Registry地址

可省略

library

用户名

可省略

ubuntu

仓库名

必须指定

24.04

标签

默认latest

docker.io

library

ubuntu / nginx / ros

24.04 / 22.04 / noble

默认值

官方镜像默认

示例

示例

镜像地址完整结构

docker.io

Registry地址

可省略

library

用户名

可省略

ubuntu

仓库名

必须指定

24.04

标签

默认latest

docker.io

library

ubuntu / nginx / ros

24.04 / 22.04 / noble

组成部分在您的示例中的值说明与常见操作
Registry 地址docker.ioDocker Hub 的官方地址。这是默认值,所以拉取时通常可以省略。例如,docker pull ubuntu:24.04 等同于 docker pull docker.io/library/ubuntu:24.04。
用户名library表示官方镜像组。如果是个人用户,这里会是您的 Docker Hub 用户名(如 yourname/nginx)。
仓库名ubuntu镜像的名称,必须指定。
标签24.04版本标识。如果不指定,默认使用 latest。

示例#

Terminal window
# 完整格式
docker pull docker.io/library/ubuntu:24.04
# 省略 Registry(默认 Docker Hub)
docker pull library/ubuntu:24.04
# 省略 library(官方镜像)
docker pull ubuntu:24.04
# 省略标签(默认 latest)
docker pull ubuntu
# 拉取第三方镜像
docker pull bitnami/redis:latest
# 从其他 Registry 拉取
docker pull ghcr.io/username/myapp:v1.0

分层下载#

Docker 镜像不是一个巨大的单个文件,而是由多个只读层(Layers)堆叠而成的。每一层都记录了文件系统上的一组变更(添加、修改或删除文件)。

  • 0926a8eb0e60: Pull complete:表示这一层已经完整下载。这一层通常是 Ubuntu 基础文件系统。
  • 989d374f715e: Download complete:表示另一层正在下载或已完成。可能包含额外的系统工具或配置更新。

节省存储空间与网络带宽:

  • 共享基础层:如果您下载了 ubuntu:24.04 和 ubuntu:22.04,它们共有的基础层(如核心文件系统)在磁盘上只会存储一份,被不同镜像共享。
  • 增量拉取:当您更新镜像时(如从 24.04 更新到 24.04-20240415),Docker 只会拉取变化的新层,而不是整个镜像。

构建缓存加速:

  • 在编写 Dockerfile 时,Docker 会复用之前构建中未发生变化的层(缓存)。例如,如果您的 Dockerfile 前几行(如 FROM 和 ENV)没变,但最后一行 COPY 变了,那么 Docker 会直接使用缓存的旧层,只重新构建 COPY 这一层及其后续层,极大加速构建过程。

镜像的可移植性与可审计性:

  • 每层都有一个唯一的哈希值(如 sha256:33ce...),确保内容的完整性。
  • 您可以使用 docker history ubuntu:24.04 命令查看这个镜像的所有历史层。

拉取后运行#

拉取镜像后,可以基于它启动容器:

Terminal window
# 拉取镜像
docker pull ubuntu:24.04
# 运行容器
docker run -it --rm ubuntu:24.04 bash

进入容器后验证一下系统版本:

root@e7009c6ce357:/# cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
root@e7009c6ce357:/# exit

本例使用 ubuntu:24.04 这样的具体版本标签是最佳实践。若无特殊需求,避免使用 docker pull ubuntu 或 ubuntu:latest,因为镜像内容可能在某个时刻发生变化。

docker run 常用参数:

参数说明使用示例/备注
-it交互式终端模式。-i(--interactive)保持标准输入打开,-t(--tty)分配一个伪终端。两者结合使用,可以在容器内进行交互式操作,如运行 bash。是调试、开发时进入容器内部的首选方式。
--rm退出后自动删除容器。当容器进程停止后,自动移除该容器及其文件系统,释放资源。非常适合运行一次性任务或临时测试,避免遗留大量已停止的容器。
bash启动命令。指定容器启动后要执行的命令或程序。在交互式模式下,通常启动一个Shell(如 bash、sh)。如果镜像有默认命令(如 CMD),可省略,容器将执行默认命令。
--name为容器指定一个名称。方便后续通过名称引用容器,而不是使用自动生成的ID。示例:--name my-robot-test。名称必须唯一。
-d后台运行模式(Detach)。容器在后台运行,不附着到当前终端。适合运行长期服务(如Web服务器、机器人后台节点)。
-p端口映射。将容器端口映射到宿主机端口,格式为 宿主机端口:容器端口。示例:-p 8080:80,将容器的80端口映射到宿主机的8080端口。
-v 或 --volume挂载数据卷。将宿主机目录或数据卷挂载到容器内,实现数据持久化或共享。示例:-v /host/data:/container/data。
--restart容器重启策略。设置容器退出后是否自动重启。常用值:no(默认)、always、on-failure。适合生产环境部署。

💡 docker run 在需要时会自动 pull 镜像,因此通常不需要单独执行 docker pull。

每次运行 docker run -it --rm ubuntu:24.04 bash 后,容器的主机名(即 root@ 后面的字符串,如 884cd20da902、615f777abfb5、efd2cdcd3738)都不同,这正是 Docker 容器隔离性和无状态性核心设计原则的直观体现。

核心原因:每个容器都是独立的全新实例#

每次执行 docker run 命令,Docker 都会执行以下操作:

  1. 新建一个容器:基于 ubuntu:24.04 镜像,创建一个全新的容器实例。这个实例拥有自己独立的文件系统、网络栈、进程空间和主机名。
  2. 分配唯一ID:Docker 会为这个新容器生成一个全局唯一的标识符(Container ID)。 884cd20da902 等,就是这个容器 ID 的前 12 位(完整 ID 是 64 位)。这个 ID 是随机生成的,保证了即使在数十亿容器中也不会重复。
  3. 设置默认主机名:在没有通过 --hostname 参数指定主机名的情况下,Docker 默认使用这个容器 ID 的前 12 位作为容器的主机名。
  4. 创建可写层:每个容器启动时,都会在镜像的只读层之上,创建一个临时的、可写的容器层。在容器内做的任何修改(如创建文件、安装软件)都只会写入这个临时层。
  5. 退出即清理:由于使用了 --rm 参数,当您输入 exit 退出 bash 后,Docker 会自动删除这个容器及其可写层,释放所有资源。

所以每次运行都是在一个完全干净的、全新的环境里,所以主机名自然每次都不同。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Docker 镜像的使用
https://astroluxi.top/posts/docker-image-basics/
作者
Lux
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Lux
技术学习者 · 机器人爱好者
公告
欢迎来到我的博客!有所记录,有所分享。
分类
标签
最新动态
站点统计
文章
21
分类
5
标签
35
总字数
105,578
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.16.5
文章许可
CC BY-NC-SA 4.0