启动接收端展览

DockerBeginner
立即练习

介绍

Marsh House 正在将 River edition 2 的 A river remembered 展览交付到无法连接镜像仓库的接收 Engine。交付包已存在,但只保存了 Web 镜像。修复交付包,将两个镜像都加载到接收端,并在源端停止后使用完整展览。

本独立实验准备了自己的源端、文件和接收端,不需要上一台 VM 的任何内容。你应已通过 Pack the Exhibition 学过交付包组装、提供的 Compose 关系,以及镜像标签与 ID 的区别,或具备同等知识。Docker 和 Compose 已就绪。本实验将讲解显式 context、接收端加载和离线启动。

使用 Workstation、Source Exhibition 和 Receiving Exhibition。两个 Engine 具有不同的 socket、containerd 进程和镜像存储,但共享此 VM 的内核;这是受控的接收边界,并非两台物理机器,也不代表完整灾难恢复。包含阅读和普通错误在内,预计约 45 分钟;这是作者估计。

检查接收边界

本步骤在更改任何一端之前区分两个 Engine。从 Source Exhibition 开始。打开 Pocket compass 和 Crossing ledger,阅读记录并下载记录单。留意集合页上的 River edition 2。Receiving Exhibition 当前显示 Exhibition not running,HTTP 状态为 503:它不会借用源页面。

切换到 Workstation,从 /home/labex/project/exhibition-handoff 开始:

cd /home/labex/project/exhibition-handoff
cat release.json

所需标签是 field-notes/web:receive 和 field-notes/api:receive。已准备的 packet 包含集合与使用相对路径的 Compose 文件,但 images.tar 只有一个镜像。

Docker context 为到守护进程的连接命名。下面的 context create 记录到接收端 Unix socket 的连接;它不会创建新 Engine,也不会改变当前默认 context。unix:// 是本地 socket 协议,剩余路径仅属于本课程的隔离接收端:

docker context create receiver --docker host=unix:///opt/labex/dk03/receiver-socket/docker.sock

如果自己之前的尝试已创建此名称,使用 docker context inspect receiver 检查,不要切换全局 context 或创建另一个接收端。每项操作都使用 --context,明确其目标。

docker --context default info --format '{{.ID}}'
docker --context receiver info --format '{{.ID}}'
docker --context receiver image ls

Engine ID 不同。接收端有一个 Python 基础镜像,用于与任务无关的 receiving-desk 参考服务,但没有任何所需展览标签。保持该服务及接收 Engine 本身完好。

接收 Engine 位于课程容器 dk03-receiver 内。以下两条只读命令通过源 Engine 在该容器内运行工具。ip route 显示直连路由,没有默认路由。wget 尝试发出真实的镜像仓库请求;-T 5 限制网络等待时间,-O /dev/null 丢弃响应正文。由于接收网络命名空间没有通往镜像仓库的路由,此尝试预期会以非零状态失败:

docker --context default exec dk03-receiver ip route
docker --context default exec dk03-receiver wget -T 5 -O /dev/null https://registry-1.docker.io/v2/

阅读连接错误。网络连接失败与应用的 HTTP 404 或 503 不同。不要通过添加路由、启用镜像仓库访问或挂载源 Docker socket 绕过问题:交付包必须包含完成交接所需的全部内容。

修复、复制并加载交付包

本步骤将两个所需镜像与本地集合送入接收文件夹。从 Workstation 开始。之前的交付包实验已讲解 image save、cp 和 Compose 相对路径。用本实验发布记录中列出的确切镜像对替换不完整归档:

docker --context default image save -o packet/images.tar field-notes/web:receive field-notes/api:receive
cat packet/compose.yaml

确认挂载为 ./collection:/collection:ro,服务标签以 :receive 结尾。相对路径将相对于接收配置所在位置解析。复制完整交付包,而不仅是镜像归档:

cp -r packet /home/labex/project/receiving/packet
ls /home/labex/project/receiving/packet

首次尝试时,目标目录不存在。如果重复自己的复制操作,应使用 cp -r packet/. /home/labex/project/receiving/packet/ 复制内容,不要再嵌套一层 packet 目录。接收端父目录还包含 desk/,属于必须保留的参考服务。不要删除或覆盖它。

image load -i 从保存的归档中将镜像配置、层和标签导入所选 Engine:

docker --context receiver image load -i /home/labex/project/receiving/packet/images.tar
docker --context receiver image ls

现在应同时显示两个所需标签。接收端不共享源 Engine 的镜像存储;仅在源端保存标签,无法让它在这里可用。如果只显示一个标签,返回 release.json,修复源交付包的保存归档,重新复制内容后再次加载。

脱离源端打开接收展览

本步骤只使用接收端文件启动,并证明其独立性。从 Workstation 开始。--project-directory 设置 Compose 解析相对文件的位置,-p exhibition 仅为本课程应用资源命名,up -d 在后台启动,--pull never 禁止从镜像仓库拉取,--no-build 禁止构建缺少的镜像:

docker --context receiver compose --project-directory /home/labex/project/receiving/packet -p exhibition up -d --pull never --no-build
docker --context receiver compose --project-directory /home/labex/project/receiving/packet -p exhibition ps

gallery 和 records 都应运行。如果 Compose 提示缺少镜像,应修复并加载交付包,而不是拉取。如果页面显示 Collection unavailable,使用相同的 Compose 命令前缀加上 logs records 检查 records 服务日志,对照接收端集合文件夹及其 :ro 挂载,然后修正交付包并重新复制。如果之前的部分尝试需要替换,使用相同前缀加上 down,再重复所示启动命令。这只删除应用容器,不删除接收服务台或其 Engine。

切换到 Receiving Exhibition,刷新并使用四件展品、插图、详情与记录单下载。这是接收服务,而不是源页面副本。

切换到 Workstation。docker stop 请求停止指定容器。只停止以下两个源服务,保持接收 Engine 和 receiving-desk 运行:

docker --context default stop dk03-source-web dk03-source-api

切换到 Source Exhibition 并刷新:现在应显示 Exhibition not running。切换到 Receiving Exhibition,刷新,打开 Pocket compass 和 Crossing ledger,再次下载记录单。接收端必须仍保有正确版本、全部四件展品、每张插图和完整下载。其读取界面不会回退到源端。全新浏览器会话也应正常使用,不依赖之前缓存的页面。

这是源端停止后仍可访问的 River edition 2 接收集合:

接收展览中的四件不同展品

保持接收应用运行。检查会观察并保留此实时状态;额外的隔离重放会将你未修改的交付包加载到新的无网络存储中,检查可重复交付性。任何检查都不会替你补齐实时现场缺少的文件或镜像。

总结

你使用显式 context 指向独立的 Docker Engine,修复双镜像交付包,并在无法连接镜像仓库的接收端加载它。Compose 使用接收端配置和素材启动,且禁用了拉取与构建。两个源服务停止后,完整展览仍继续提供服务。