打包展览

DockerBeginner
立即练习

介绍

Marsh House 要将 River edition 1 的 Along the waterline 展览发送到无法访问镜像仓库的接收展台。展览包含 Web 服务、记录 API 和一个藏品文件目录。你需要准备一个文件夹,包含在其他位置运行这个确切版本所需的全部内容。

你应了解基本 Docker 构建/运行、发布端口及终端路径。本实验讲解简短的 Compose 文件、镜像归档和可迁移的文件集合。无需编程或博物馆知识。Docker 和两个应用镜像已准备好。记录和原创示意插图均为虚构的教学素材。

使用 Workstation 执行命令,Source Exhibition 查看正常样例。Receiving Exhibition 初始为空;你将在下一个独立实验中使用这个交付边界。本实验的成果是完整交付包,而非运行中的接收端。包含阅读和普通错误在内,预计约 45 分钟;这是作者估计。

确认完整展览

本步骤将识别交接后必须保留的内容,并保存确切的镜像对。从 Source Exhibition 开始。页面显示四件展品。打开 Pocket compass,查看插图与故事,选择 Download field sheet。这会下载包含版本、展品 ID 和描述的真实文本记录。使用 Back to collection,打开 Crossing ledger,也下载其记录单。这是不同的展品,各有自己的记录和文件。

集合将每件展品链接到自己的详情页和记录单下载:

源展览中的四件展品

切换到 Workstation。起始目录是 /home/labex/project/exhibition-release。pwd 显示当前文件夹,ls 列出内容,离开后可用 cd 返回这里:

cd /home/labex/project/exhibition-release
ls

compose.yaml 描述两个运行中的服务。release.json 标识此版本及标签对应的不可变镜像 ID。collection/ 包含已发布的 JSON 记录、原创 SVG 插图和文本下载。author-notes/ 包含未发布的草稿,必须排除在交付包之外。保持全部提供的素材和运行中的源服务不变。

cat 显示文本文件。阅读发布记录:

cat release.json

找到 web 和 api 条目。它们的标签是 field-notes/web:pack 和 field-notes/api:pack;各自也有一个以 sha256: 开头的镜像 ID。标签是可移动的名称。ID 标识这些特定的镜像内容。应将发布记录中的两个条目一起交付;仅有正常工作的 Web 镜像无法提供记录或文件。

mkdir 创建目录;-p 创建缺少的父目录,并允许目录已存在。如果之前自己的尝试已创建 packet,用 ls packet 检查后继续补齐,不要删除提供的源文件夹。

mkdir -p packet

--context default 明确指定源 Engine。context 是 Docker 守护进程连接的名称,并非另一台物理机器。docker image save 写出镜像配置、标签和文件系统层。-o 指定输出文件。在同一个归档中包含两个发布标签:

docker --context default image save -o packet/images.tar field-notes/web:pack field-notes/api:pack

这可能需要一会儿,成功时通常没有输出。docker container export 不同:它导出容器文件系统,省略镜像元数据,也不会收集绑定挂载中的文件,无法替代此处的镜像交接。

读懂运行时文件关系

本步骤将 Compose 文件与刚使用的展览联系起来,并复制可迁移的配置。从 Workstation 开始,显示文件:

cat compose.yaml

YAML 用缩进表达关系。services: 包含 gallery 和 records。每个 image: 选择一个已准备的镜像;该文件没有构建配方。gallery 提供浏览器页面,并向 records 请求藏品集合;后者是读取已发布素材的 API。

两个服务都使用 network_mode: host:它们共享各自 Engine 宿主的网络命名空间。此处 Web 服务监听 9100 端口,API 监听 9101。源 Engine 使用 Workstation 网络。接收 Engine 在自身隔离的容器网络命名空间中运行,因此那里相同的端口号不会指向源端。这是刻意简化的本地教学安排,并非通用网络安全方案。

API_ORIGIN 是环境变量,即传给 gallery 程序的具名值。其中的 http://127.0.0.1:9101 指向同一命名空间中的 API。records.volumes 将 ./collection 只读绑定到 /collection,由 :ro 表示。./ 路径相对于 Compose 项目目录,位于 compose.yaml 旁边。这是外部运行依赖:镜像不包含它。

让 Compose 解析文件,但不启动或更改服务:

docker --context default compose config

--context default 明确选择已准备的源 Engine;context 是 Docker 守护进程连接的名称,并非另一台物理计算机。输出将藏品集合的相对路径展开为当前源文件夹的绝对路径。交付时保留原文件的相对路径:将展开后的源路径复制到交付包,仍会依赖原来的 Workstation 位置。

现在完整依赖集合已很清楚:两个镜像的内容、一份 Compose 配置,以及完整的已发布藏品集合。启动接收版本无需编译器、源构建目录、草稿或运行中的源容器。

cp 复制文件;-r 递归复制目录及其子项。复制原始的可迁移配置和已发布集合:

cp compose.yaml packet/compose.yaml

组装可迁移的交付包

本步骤补齐交付包中的已发布藏品集合,并将其作为可移动的交付物检查。从 Workstation 开始。创建交付包的集合文件夹,然后递归复制源目录的内容。/. 表示其内容,因此重复此命令不会再嵌套一层 collection 目录:

mkdir -p packet/collection
cp -r collection/. packet/collection/

检查结果:

ls packet
ls packet/collection
cat packet/compose.yaml

顶层应恰好有 compose.yaml、images.tar 和 collection。集合包含 exhibits.json、art/ 和 download/。Compose 挂载仍以 ./collection 开头,绝不能使用源端的绝对路径。不要将 author-notes 或 release.json 复制到运行交付包中:后者是源端用于选择版本的证据。

文件存在或归档很大,都不能证明完整。检查会将你保存的两个镜像加载到一次性的独立镜像存储中,在没有网络、源端挂载、拉取或构建的情况下运行交付包。它读取全部记录、插图和下载字节,然后删除隔离测试资源。它不会启动或修改你当前实验环境中的接收端展览。

如果检查报告缺少镜像,再次阅读 release.json,用包含两个标签的同一保存命令重试。如果缺少集合文件,对照两次 ls 结果,正确复制已发布目录。如果路径错误,从提供的可迁移文件恢复 packet/compose.yaml。在本实验中将交付包保留在这里;下一个实验会提供自身独立的文件。

总结

你识别了双服务应用完整的运行需求,保存了其确切镜像对,并将外部藏品集合与可迁移的 Compose 文件放在一起。交付包能在独立镜像存储中启动,无需借用源目录。镜像层只是这份交付物的一部分。