受け取った展示を開く

DockerBeginner
オンラインで実践に進む

はじめに

Marsh House は A river remembered の River edition 2 を、レジストリから隔離された受信側 Engine に届けます。受け渡しパケットはありますが、Web イメージしか保存されていません。修正して両方のイメージを受信側にロードし、配布元を停止した後も完全な展示を使ってください。

この独立した実験では、配布元、ファイル、受信側をそれぞれ準備しているため、前の VM のものは不要です。Pack the Exhibition でパケットの組み立て、提供された Compose の関係、イメージのタグと ID の違いを学んでいるか、同等の知識があることを前提とします。Docker と Compose は準備済みです。明示的な context、受信側へのロード、オフライン起動を学びます。

Workstation、Source Exhibition、Receiving Exhibition を使います。2 つの Engine は別々のソケット、containerd プロセス、イメージストレージを持ちますが、この VM のカーネルは共有します。これは制御された受け取り境界であり、2 台の物理マシンや完全な災害復旧を意味しません。読む時間とよくある間違いへの対処を含め、約 45 分を見込んでください。作者による見積もりです。

受信側の境界を調べる

このステップでは、どちらかを変更する前に 2 つの Engine を区別します。Source Exhibition から始めます。Pocket compass と Crossing ledger を開き、記録を読んでフィールドシートをダウンロードしてください。一覧ページの River edition 2 に注目します。Receiving Exhibition は現在、HTTP 503 で Exhibition not running と表示します。配布元のページを借りて表示しているわけではありません。

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 に入っているイメージは 1 つだけです。

Docker context はデーモンへの接続名です。以下の context create は受信側の Unix ソケットへの接続を記録するもので、新しい Engine の作成や有効なデフォルトの変更は行いません。unix:// はローカルソケットのプロトコルで、残りのパスはこのコースの隔離された受信側だけに属します。

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

自分の試行ですでに同じ名前があるなら、グローバルな context の切り替えや別の受信側の作成ではなく、docker context inspect receiver で調べます。各操作に --context を付けて対象を明確にしてください。

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

Engine ID は異なります。受信側には、無関係な参照サービス receiving-desk が使う Python ベースイメージがありますが、展示に必要なタグはどちらもありません。そのサービスと受信側 Engine 自体はそのまま保ってください。

受信側 Engine はこのコースのコンテナー dk03-receiver の中にあります。次の 2 つの読み取り専用コマンドは、配布元 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 ソケットをマウントしたりしないでください。パケットだけで受け渡しを完結させる必要があります。

パケットを修正し、コピーしてロードする

このステップでは、必要な両イメージとローカルのコレクションを受信側フォルダーへ運びます。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 のイメージストアを共有していません。配布元でタグを保存するだけでは、ここでは利用できません。1 つしか表示されなければ release.json に戻り、配布元パケットの save アーカイブを修正し、中身を再コピーしてから再ロードします。

配布元なしで受信側を開く

このステップでは受信側のファイルだけで起動し、独立していることを示します。Workstation から始めます。--project-directory は Compose が相対ファイルを解決する場所、-p exhibition はこのコースのアプリケーション資源だけの名前を指定します。up -d はバックグラウンドで起動し、--pull never はレジストリからの pull、--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 がイメージ不足を示したら、pull せずにパケットを修正してロードします。ページが Collection unavailable を示したら、同じ Compose のコマンド接頭部に logs records を続けて records サービスのログを調べ、受信側の collection フォルダーと :ro マウントを比較し、パケットを修正して再コピーします。以前の部分的な試行を置き換える場合は、同じ接頭部に down を続け、表示した起動コマンドを繰り返します。これはアプリケーションのコンテナーだけを削除し、receiving desk やその Engine は削除しません。

Receiving Exhibition に切り替えて再読み込みし、4 つの展示物とその画像、詳細、フィールドシートのダウンロードを使います。これは受信側サービスであり、配布元ページのコピーではありません。

Workstation に切り替えます。docker stop は指定したコンテナーに停止を要求します。次の配布元 2 サービスだけを停止し、受信側 Engine と receiving-desk は動かしたままにします。

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

Source Exhibition に切り替え、再読み込みします。今度は Exhibition not running と表示されるはずです。Receiving Exhibition に切り替え、再読み込みして Pocket compass と Crossing ledger を開き、フィールドシートを再びダウンロードします。受信側には正しい版、4 つすべての展示物、すべての画像、完全なダウンロードが残る必要があります。その閲覧画面は配布元へフォールバックしません。新しいブラウザーセッションでも、以前のページのキャッシュなしで動くはずです。

配布元を停止した後も利用できる、受信した River edition 2 の一覧です。

異なる 4 つの展示物を持つ受信済み展示

受信したアプリケーションは動かしたままにします。チェックはこの稼働状態を観察して維持します。さらに隔離した再実行で、未変更のパケットをネットワークのない新しいストアへロードし、繰り返し配布できることを確認します。稼働環境の不足ファイルやイメージを、チェックが補うことはありません。

まとめ

明示的な context で独立した Docker Engine を指定し、2 イメージのパケットを修正して、レジストリから隔離された受信側へロードしました。Compose は pull と build を禁止して、受信側の構成と素材から起動しました。配布元の両サービスを停止した後も、完全な展示は動き続けました。