展示を梱包する

DockerBeginner

はじめに

Marsh House は Along the waterline の River edition 1 を、イメージレジストリへ接続できない受け取り側のキオスクへ送ります。この展示には Web サービス、記録 API、コレクションファイルのディレクトリがあります。このリリースそのものを別の場所で動かすために必要なものを、すべて含むフォルダーを準備してください。

Docker の基本的な build/run、公開ポート、ターミナルのパスを知っていることを前提とします。この実験では小さな Compose ファイル、イメージアーカイブ、持ち運べるファイル一式を学びます。プログラミングや博物館の知識は不要です。Docker とアプリケーションの 2 つのイメージは準備済みです。記録とオリジナルの模式図は架空の教材です。

コマンドには Workstation、動く見本には Source Exhibition を使います。Receiving Exhibition は空の状態で始まり、次の独立した実験でその受け渡し先を使います。この実験の成果物は、稼働中の受信側ではなく、完全なパケットです。読む時間とよくある間違いへの対処を含めて約 45 分を見込んでください。これは作者による見積もりです。

完全な展示を確認する

このステップでは、受け渡し後にも必要なものを特定し、正確なイメージの組を保存します。Source Exhibition から始めます。ページには 4 つの展示物が表示されます。Pocket compass を開いて画像と物語を調べ、Download field sheet を選びます。版、展示物 ID、説明を持つ実際のテキスト記録がダウンロードされます。Back to collection で戻り、Crossing ledger を開いてそのフィールドシートもダウンロードしてください。それぞれ独自の記録とファイルを持つ別の展示物です。

コレクションは各展示物を、それ自身の詳細ページとフィールドシートのダウンロードに結び付けています。

配布元の展示にある 4 つの展示物

Workstation に切り替えます。開始場所は /home/labex/project/exhibition-release です。pwd は現在のフォルダーを表示し、ls は一覧を表示します。移動した場合は cd で戻れます。

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

compose.yaml は動いている 2 つのサービスを記述します。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 デーモンへの接続名であり、2 台目の物理マシンではありません。docker image save はイメージ構成、タグ、ファイルシステムのレイヤーを書き出します。-o は出力ファイル名を指定します。この 1 つのアーカイブに両方のリリースタグを含めます。

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 はブラウザーページを提供し、公開素材を読む API である records にコレクションを要求します。

両サービスは 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.yaml の隣にある Compose プロジェクトディレクトリを基準とします。これは外部の実行時依存関係で、イメージには含まれていません。

サービスを起動・変更せず、Compose にファイルを解析させます。

docker --context default compose config

--context default は準備済みの配布元 Engine を明示的に選びます。context は Docker デーモンへの名前付き接続であり、2 台目の物理コンピューターではありません。出力では、コレクションの相対パスが現在のソースフォルダーの絶対パスに展開されます。配布には元ファイルの相対パスを保ってください。展開されたソースパスをパケットへコピーすると、元の Workstation の場所に依存したままになります。

必要な一式が明確になりました。2 つのイメージ内容、1 つの Compose 構成、完全な公開済みコレクションです。受け取った版を起動するために、コンパイラー、ソースのビルドディレクトリ、下書き、実行中の配布元コンテナーは不要です。

cp はファイルをコピーし、-r はディレクトリとその子を再帰的にコピーします。元の持ち運び可能な構成と公開済みコレクションをコピーします。

cp compose.yaml packet/compose.yaml

持ち運び可能なパケットをまとめる

このステップでは、公開済みコレクションでパケットを完成させ、移動できる配布物として調べます。Workstation から始めます。パケットの collection フォルダーを作り、ソースディレクトリの中身を再帰的にコピーします。/. はその中身を表すため、このコマンドを繰り返しても collection ディレクトリがさらに入れ子になりません。

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

結果を調べます。

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

最上位にあるのは compose.yaml、images.tar、collection のみです。collection には exhibits.json、art/、download/ があります。Compose のマウントは引き続き ./collection から始まり、ソースの絶対パスではありません。author-notes と release.json は実行用パケットにコピーしないでください。後者は配布元側で選択を裏付ける証拠です。

ファイルの存在やアーカイブの大きさでは、完全性は証明できません。チェックは保存された 2 つのイメージを使い捨ての独立したイメージストアにロードし、ネットワーク、ソースのマウント、pull、build なしでパケットを実行します。すべての記録、画像、ダウンロードしたバイトを読み、隔離したテスト資源を削除します。学習者の環境にある受信側展示を起動・変更することはありません。

チェックでイメージ不足が報告されたら release.json を再読し、両方のタグを指定して同じ save コマンドを再実行します。コレクションファイルが足りなければ、2 つの ls の結果を比べ、公開済みディレクトリを正しくコピーしてください。パスが間違っていれば、提供された持ち運び可能なファイルから packet/compose.yaml を復元します。この実験ではパケットをここに保ちます。次の実験は独立したファイルで始まります。

まとめ

2 サービスのアプリケーションの完全な実行環境を特定し、正確なイメージの組を保存し、外部コレクションを持ち運び可能な Compose ファイルの隣に集めました。このパケットはソースディレクトリを借りずに、独立したイメージストアで起動できます。イメージレイヤーだけでは、配布物の一部にすぎませんでした。