Docker 镜像的使用
1798 字
9 分钟
Docker 镜像的使用
获取镜像
从 Docker 镜像仓库获取镜像可谓是 Docker 运作的第一步。本节将介绍如何使用 docker pull 命令下载镜像,以及如何理解下载过程。
版本号最佳实践
- 永远指定版本号:避免使用
latest标签,应指定具体的版本(如ubuntu:24.04、nginx:1.28),以确保镜像内容稳定一致。- 在生产环境使用摘要:优先使用镜像摘要(SHA256)而非标签,如
nginx@sha256:abc123...,因为摘要不可变。- 定期评估依赖:即使指定了版本号,仍应定期检查依赖的基础镜像是否有安全更新。
docker pull 命令
从镜像仓库获取镜像的命令是 docker pull:
docker pull [选项] [Registry地址/]仓库名[:标签]镜像名称格式
Docker 镜像名称由 Registry 地址、用户名、仓库名和标签组成。其标准格式如下:
| 组成部分 | 在您的示例中的值 | 说明与常见操作 |
|---|---|---|
| Registry 地址 | docker.io | Docker Hub 的官方地址。这是默认值,所以拉取时通常可以省略。例如,docker pull ubuntu:24.04 等同于 docker pull docker.io/library/ubuntu:24.04。 |
| 用户名 | library | 表示官方镜像组。如果是个人用户,这里会是您的 Docker Hub 用户名(如 yourname/nginx)。 |
| 仓库名 | ubuntu | 镜像的名称,必须指定。 |
| 标签 | 24.04 | 版本标识。如果不指定,默认使用 latest。 |
示例
# 完整格式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命令查看这个镜像的所有历史层。
拉取后运行
拉取镜像后,可以基于它启动容器:
# 拉取镜像docker pull ubuntu:24.04
# 运行容器docker run -it --rm ubuntu:24.04 bash进入容器后验证一下系统版本:
root@e7009c6ce357:/# cat /etc/os-releasePRETTY_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 都会执行以下操作:
- 新建一个容器:基于
ubuntu:24.04镜像,创建一个全新的容器实例。这个实例拥有自己独立的文件系统、网络栈、进程空间和主机名。 - 分配唯一ID:Docker 会为这个新容器生成一个全局唯一的标识符(Container ID)。
884cd20da902等,就是这个容器 ID 的前 12 位(完整 ID 是 64 位)。这个 ID 是随机生成的,保证了即使在数十亿容器中也不会重复。 - 设置默认主机名:在没有通过
--hostname参数指定主机名的情况下,Docker 默认使用这个容器 ID 的前 12 位作为容器的主机名。 - 创建可写层:每个容器启动时,都会在镜像的只读层之上,创建一个临时的、可写的容器层。在容器内做的任何修改(如创建文件、安装软件)都只会写入这个临时层。
- 退出即清理:由于使用了
--rm参数,当您输入exit退出 bash 后,Docker 会自动删除这个容器及其可写层,释放所有资源。
所以每次运行都是在一个完全干净的、全新的环境里,所以主机名自然每次都不同。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
Docker 镜像加速下载
Docker专题国内从 Docker Hub 拉取镜像困难?配置 registry mirror 镜像加速器,并用 docker info 验证是否生效。
2
Docker 的安装
Docker专题在 Ubuntu 上通过 APT 仓库安装 Docker Engine,配置 docker 用户组,并了解其安全注意事项。
3
Docker Compose 入门与命令速查
Docker专题Docker Compose 解决什么问题、不解决什么,常用命令速查表与易混淆命令对比。
4
Docker Compose 模板文件指令详解
Docker专题Compose 模板文件全部指令按功能分类详解:镜像构建、依赖启动、环境变量、网络端口、数据卷、安全能力、资源限制、profiles 与变量读取。
5
Dockerfile 指令详解
Docker专题Dockerfile 常用指令速查表与 14 条最佳实践,涵盖安全加固、缓存优化与 BuildKit 现代特性。
随机文章随机推荐












