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
/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
imagePullPolicy 默认是 IfNotPresent,而本地已经有旧镜像了。后来改成 Always 才解决。所以,如果你的镜像标签是 latest,一定要用 Always 策略。
反过来,如果你用具体版本号(比如 v1.0),用 IfNotPresent 就够了。没必要每次都去仓库拉,浪费带宽。
知识体系总览
下面这张图,我把镜像获取的核心逻辑画出来了,方便你理解:
这张图把整个流程串起来了。你从输入命令开始,经过拉取策略的判断,最终决定从哪获取镜像。记住,策略的选择直接影响你的部署效率和稳定性。
好了,镜像获取这块就聊到这儿。核心就是:选对源、配好加速、定好策略。这三步做好了,后面跑容器就顺了。