mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-08 08:19:35 +00:00
233 lines
6.2 KiB
Go
233 lines
6.2 KiB
Go
# 获取镜像
|
||
|
||
## docker pull 命令
|
||
|
||
从镜像仓库获取镜像的命令是 `docker pull`:
|
||
|
||
```bash
|
||
docker pull [选项] [Registry地址/]仓库名[:标签]
|
||
```
|
||
|
||
### 镜像名称格式
|
||
|
||
```
|
||
docker.io / library / ubuntu : 24.04
|
||
────┬──── ───┬─── ──┬─── ──┬──
|
||
│ │ │ │
|
||
Registry地址 用户名 仓库名 标签
|
||
(可省略) (可省略)
|
||
```
|
||
|
||
| 组成部分 | 说明 | 默认值 |
|
||
|---------|------|--------|
|
||
| Registry 地址 | 镜像仓库地址 | `docker.io`(Docker Hub) |
|
||
| 用户名 | 镜像所属用户/组织 | `library`(官方镜像) |
|
||
| 仓库名 | 镜像名称 | 必须指定 |
|
||
| 标签 | 版本标识 | `latest` |
|
||
|
||
### 示例
|
||
|
||
```bash
|
||
# 完整格式
|
||
$ 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
|
||
```
|
||
|
||
---
|
||
|
||
## 下载过程解析
|
||
|
||
```bash
|
||
$ docker pull ubuntu:24.04
|
||
24.04: Pulling from library/ubuntu
|
||
92dc2a97ff99: Pull complete
|
||
be13a9d27eb8: Pull complete
|
||
c8299583700a: Pull complete
|
||
Digest: sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26
|
||
Status: Downloaded newer image for ubuntu:24.04
|
||
docker.io/library/ubuntu:24.04
|
||
```
|
||
|
||
### 输出解读
|
||
|
||
| 输出内容 | 说明 |
|
||
|---------|------|
|
||
| `Pulling from library/ubuntu` | 正在从官方 ubuntu 仓库拉取 |
|
||
| `92dc2a97ff99: Pull complete` | 各层的下载状态(显示层 ID 前 12 位) |
|
||
| `Digest: sha256:...` | 镜像内容的唯一摘要 |
|
||
| `docker.io/library/ubuntu:24.04` | 镜像的完整名称 |
|
||
|
||
### 分层下载
|
||
|
||
从输出可以看到,镜像是**分层下载**的:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ ubuntu:24.04 镜像 │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ 第3层 c8299583700a ───────► 已存在,跳过下载 │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ 第2层 be13a9d27eb8 ───────► 下载中... 完成 │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ 第1层 92dc2a97ff99 ───────► 下载中... 完成 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
如果本地已有相同的层,Docker 会跳过下载,节省带宽和时间。
|
||
|
||
---
|
||
|
||
## 常用选项
|
||
|
||
| 选项 | 说明 | 示例 |
|
||
|------|------|------|
|
||
| `--all-tags, -a` | 拉取所有标签 | `docker pull -a ubuntu` |
|
||
| `--platform` | 指定平台架构 | `docker pull --platform linux/arm64 nginx` |
|
||
| `--quiet, -q` | 静默模式 | `docker pull -q nginx` |
|
||
|
||
### 指定平台
|
||
|
||
在 Apple Silicon Mac 上拉取 x86 镜像:
|
||
|
||
```bash
|
||
$ docker pull --platform linux/amd64 nginx
|
||
```
|
||
|
||
---
|
||
|
||
## 拉取后运行
|
||
|
||
拉取镜像后,可以基于它启动容器:
|
||
|
||
```bash
|
||
# 拉取镜像
|
||
$ 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
|
||
```
|
||
|
||
**参数说明**:
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| `-it` | 交互式终端模式 |
|
||
| `--rm` | 退出后自动删除容器 |
|
||
| `bash` | 启动命令 |
|
||
|
||
> 💡 `docker run` 在需要时会自动 `pull` 镜像,因此通常不需要单独执行 `docker pull`。
|
||
|
||
---
|
||
|
||
## 镜像加速
|
||
|
||
从 Docker Hub 下载可能较慢。可以配置镜像加速器:
|
||
|
||
```json
|
||
// /etc/docker/daemon.json (Linux)
|
||
// ~/.docker/daemon.json (Docker Desktop)
|
||
{
|
||
"registry-mirrors": [
|
||
"https://your-accelerator-url"
|
||
]
|
||
}
|
||
```
|
||
|
||
配置后重启 Docker:
|
||
|
||
```bash
|
||
$ sudo systemctl restart docker # Linux
|
||
# 或在 Docker Desktop 中重启
|
||
```
|
||
|
||
详见 [镜像加速器](../install/mirror.md) 章节。
|
||
|
||
---
|
||
|
||
## 验证镜像完整性
|
||
|
||
### 查看镜像摘要
|
||
|
||
```bash
|
||
$ docker images --digests ubuntu
|
||
REPOSITORY TAG DIGEST IMAGE ID
|
||
ubuntu 24.04 sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26 ca2b0f26964c
|
||
```
|
||
|
||
### 使用摘要拉取
|
||
|
||
用摘要拉取可确保获取完全相同的镜像:
|
||
|
||
```bash
|
||
$ docker pull ubuntu@sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26
|
||
```
|
||
|
||
> 笔者建议:生产环境使用摘要而非标签,因为标签可能被覆盖,摘要则是不可变的。
|
||
|
||
---
|
||
|
||
## 常见问题
|
||
|
||
### Q: 下载速度很慢
|
||
|
||
1. 配置镜像加速器
|
||
2. 检查网络连接
|
||
3. 尝试拉取更小的镜像版本(如 `alpine` 变体)
|
||
|
||
### Q: 提示镜像不存在
|
||
|
||
```bash
|
||
Error: pull access denied, repository does not exist
|
||
```
|
||
|
||
可能原因:
|
||
- 镜像名拼写错误
|
||
- 私有镜像未登录(需要 `docker login`)
|
||
- 镜像确实不存在
|
||
|
||
### Q: 磁盘空间不足
|
||
|
||
```bash
|
||
# 清理未使用的镜像
|
||
$ docker image prune
|
||
|
||
# 清理所有未使用资源
|
||
$ docker system prune
|
||
```
|
||
|
||
---
|
||
|
||
## 本章小结
|
||
|
||
| 操作 | 命令 |
|
||
|------|------|
|
||
| 拉取镜像 | `docker pull 镜像名:标签` |
|
||
| 拉取所有标签 | `docker pull -a 镜像名` |
|
||
| 指定平台 | `docker pull --platform linux/amd64 镜像名` |
|
||
| 用摘要拉取 | `docker pull 镜像名@sha256:...` |
|
||
|
||
## 延伸阅读
|
||
|
||
- [列出镜像](list.md):查看本地镜像
|
||
- [删除镜像](rm.md):清理本地镜像
|
||
- [镜像加速器](../install/mirror.md):加速镜像下载
|
||
- [Docker Hub](../repository/dockerhub.md):官方镜像仓库
|