# E021 视频文稿

西楚极客

## 镜像卡住时先做什么

上期装好了 Docker，启动网页时，镜像却卡在下载。你遇到这个画面，先把拉取单独跑一遍，看是哪一步失败。如果目标机确实拉不到，我会从准备镜像开始，演示怎么导入，再用本地镜像启动，直到网页返回 200。

## 单独拉取与修正镜像标签

先到 Compose 文件所在的目录。运行 docker compose config --images，确认项目实际要用的镜像。这个项目只有一个服务，叫 web。接着单独拉 web 的镜像。

屏幕上的 plain 会把进度按行留下来，失败时你就能回看最后几行。等拉取成功，再执行启动命令。这两步拆开，拉取报错就有了单独的输出。

这次错误指向一条具体的镜像引用，末尾说找不到。我故意把 alpine 末尾的字母拼错了。你可以对照镜像发布方列出的标签，把 Compose 文件里的 image 改成实际存在的版本。

我把它改回 stable-alpine，再看一次配置展开后的镜像名，重跑刚才的拉取。现在能看到每层下载和解包，最后显示 Pulled。这就确认了改对标签之后，镜像可以拉下来。

## 看报错区分连接、认证与限流

如果你看到的是超时，先看错误里写的是哪个域名。我在这台 Ubuntu 上用 curl 请求 Docker Hub 的 v2 入口，连接最多等 5 秒，整次请求最多等 12 秒。

这里没带登录凭据，收到 401，说明这一次请求拿到了仓库入口的响应。拉取还涉及认证和镜像层下载，所以接下来仍要重跑 Compose 的拉取命令。

如果 curl 提示域名无法解析，就先查目标机的 DNS。如果能解析，连接却反复超时，就拿报错中的域名检查目标机的网络出口，或者联系管理这台机器的人。遇到 429，先读完整提示，按对应的限流处理。

如果你眼下只想把服务跑起来，又有一台能拉到同一个镜像的机器，可以走下面这条离线路线。

## 导出、校验并导入本地镜像

先在目标机确认 CPU 架构。这台 Ubuntu 返回 amd64。准备镜像的机器也要有目标平台的版本。先拉项目实际使用的镜像，再用 image inspect 看平台和镜像 ID。

我这里是 linux/amd64，标签是 nginx:stable-alpine。

接着执行 docker image save，把这个标签保存成 tar 文件。再用 sha256sum 生成校验清单。把归档和清单一起传给目标机，比如用已有的文件传输方式，或者用 U 盘。

清单用来检查传过去的文件有没有变化。镜像的来源，还得由你选可信的发布方。

接下来看目标端。我用同一台演示虚拟机分两阶段做对照。这个阶段开始时，本地没有刚才那个标签。先试一次只用本地镜像启动，Docker 报找不到镜像。

进入放着归档和校验清单的目录，执行 sha256sum -c。看到归档显示 OK，再用 docker image load 导入。如果校验失败，重新传一份，校验通过后再继续。

导入完成会显示 Loaded image 和标签。用 image inspect 再查一次，确认目标端的镜像平台和 ID 与来源端一致，标签也与 Compose 里写的相同。

## 用本地镜像启动并验证 HTTP 200

回到 Compose 项目目录，执行屏幕上这条命令。pull never 让 Compose 只用本地已有的镜像，no-build 跳过构建。

再运行 docker compose ps，这次 web 是 Up。最后请求演示项目映射的本地端口，返回 HTTP 200，服务已经能响应。

换成自己的项目时，用配置展开后的镜像清单逐个准备，再按你的项目端口验证。数据库数据和挂载文件还要单独准备，镜像归档只解决镜像这一关。你可以先用这个单服务示例把整条路线走一遍，再用到自己的项目。

这里是西楚极客，我们继续用 AI，把真正能运行的项目做出来。下期见。
