3、镜像获取:docker pull 命令详解、配置镜像加速器、从私有仓库拉取镜像、拉取策略

好,咱们接着聊镜像获取。说白了,镜像就是容器的“原材料”。你跑容器之前,得先把镜像搞到手。怎么搞?最常用的方式就是 docker pull。今天我就把这块掰开了讲讲,顺便聊聊我踩过的那些坑。

3.1 docker pull 命令详解

docker pull 这命令,看着简单,其实门道不少。它的基本格式是:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

我来拆解一下:

  • NAME:镜像名,比如 nginx、ubuntu。默认从 Docker Hub 拉。
  • TAG:标签,比如 latest、1.21。不指定的话默认 latest。
  • DIGEST:摘要值,用这个能精确锁定某个版本的镜像,避免标签被覆盖。

举个例子:

# 拉取最新版 nginx
docker pull nginx

# 拉取指定版本
docker pull nginx:1.21

# 用摘要拉取,最安全的方式
docker pull nginx@sha256:abc123...
我的习惯:生产环境我从来不用 latest 标签。为啥?你想想看,今天拉的是 1.21,明天再拉可能就变成 1.22 了。版本不一致,出了事你都不知道怎么查。我一般用具体版本号或者摘要。

常用的选项有:

选项 说明
-a, --all-tags 拉取所有标签的镜像
--platform 指定平台,比如 linux/amd64
-q, --quiet 静默模式,只输出镜像 ID

嗯,这里要注意:--platform 这个选项在 ARM 和 x86 混用的环境里特别有用。我在做边缘计算项目时,经常需要在 ARM 开发板上拉 x86 的镜像做交叉编译,这个选项帮了大忙。

3.2 配置镜像加速器

在国内从 Docker Hub 拉镜像,那速度……我都不想吐槽。几十 KB 的下载速度,拉个几百 MB 的镜像能等到你怀疑人生。解决办法就是配镜像加速器。

配置方式很简单,编辑 /etc/docker/daemon.json:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

然后重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker
重要:配置完加速器后,记得验证一下是否生效:
docker info | grep -A 5 "Registry Mirrors"
如果看到你配置的地址,就说明成功了。

我曾经遇到过一个问题:配了加速器,但拉取速度还是很慢。查了半天,发现是公司内网限制了 443 端口。后来改用 HTTP 的镜像源才解决。所以,如果你配了加速器还是慢,先检查网络环境。

3.3 从私有仓库拉取镜像

很多公司都有自己的私有仓库,比如 Harbor、Nexus 或者自建的 Registry。从私有仓库拉镜像,格式是:

docker pull registry.example.com/myapp:v1.0

关键点在于认证。私有仓库一般都需要登录:

docker login registry.example.com
# 输入用户名和密码

# 然后就可以拉了
docker pull registry.example.com/myapp:v1.0
注意:如果私有仓库用的是自签名证书,Docker 默认会拒绝连接。你需要把证书放到 /etc/docker/certs.d/registry.example.com/ca.crt,或者配置 insecure-registries。

我个人建议用证书方式,别图省事开 insecure。安全这东西,一旦出事就是大事。

3.4 拉取策略(Always / IfNotPresent / Never)

拉取策略是在运行容器时用的,但跟镜像获取直接相关。它决定了 Docker 在启动容器时怎么处理镜像。策略有三种:

策略 行为 适用场景
Always 每次都从仓库拉取,不管本地有没有 需要确保镜像最新,比如 CI/CD 环境
IfNotPresent 本地没有时才拉取 开发环境,节省带宽和时间
Never 只使用本地镜像,没有就报错 离线环境,或者严格管控的场景

在 docker run 或 docker-compose 中指定:

# 命令行方式
docker run --pull=always nginx:latest

# docker-compose 方式
services:
  web:
    image: nginx:latest
    pull_policy: always
避坑指南:我曾经在 Kubernetes 集群里遇到过一个问题:明明更新了镜像,Pod 重启后还是旧版本。查了半天,发现是 imagePullPolicy 默认是 IfNotPresent,而本地已经有旧镜像了。后来改成 Always 才解决。所以,如果你的镜像标签是 latest,一定要用 Always 策略。

反过来,如果你用具体版本号(比如 v1.0),用 IfNotPresent 就够了。没必要每次都去仓库拉,浪费带宽。

知识体系总览

下面这张图,我把镜像获取的核心逻辑画出来了,方便你理解:

镜像获取核心流程 docker pull 命令 拉取策略 Always:强制拉取 IfNotPresent:按需拉取 Never:仅用本地 获取镜像到本地 镜像源:Docker Hub / 镜像加速器 / 私有仓库

这张图把整个流程串起来了。你从输入命令开始,经过拉取策略的判断,最终决定从哪获取镜像。记住,策略的选择直接影响你的部署效率和稳定性。

好了,镜像获取这块就聊到这儿。核心就是:选对源、配好加速、定好策略。这三步做好了,后面跑容器就顺了。

可可精品资料库