はじめに
Afterlight は小さな地域展示です。来場者はゲストブックに感想を残します。アプリケーションを置き換えても、その投稿を消してはいけません。最初に使い捨てのコピーを試し、その後、本来のゲストブックの既存データを接続し直して、新しい投稿も置き換えを越えて保持します。
基本的なターミナル操作ができれば十分です。Docker、Compose、データパス、編集、HTTP は必要になった時点で説明します。アプリとツールは準備済みで、データベースのコードを書く必要はありません。来場者情報はすべて架空です。
コマンドには Workstation、実際のゲストブックには Exhibition、意図的なデータ消失実験にだけ Practice Copy を使います。2 つのサイトは別々のコンテナとポートを使います。各単元は独立して始まり、サイト、ラベル、出力は英語のままです。
来場者データに専用の保存先を用意する
このステップでは、展示を体験し、使い捨てデータの消失を観察して、本来のゲストブックを既存の記録に接続します。Practice Copy から始めます。これは実際の来場者がいない、別の使い捨て展示です。
通常の来場者の操作を試す
About the exhibition を開き、開館時間を読んで The wall を選択します。Leave a contribution を選び、Your name に Visitor、Your message に A small practice note. を入力して、Add to the wall を選択します。詳細ページに投稿が表示されます。Back to the wall を選ぶとカードが見えます。詳細とフォームは、保持すべき通常の業務機能です。
コンテナが保持しないものを観察する
Workstation に切り替えます。開始ディレクトリは /home/labex/project/afterlight です。パスはファイルやディレクトリを指し、この絶対パスはファイルシステムのルート / から始まります。pwd は現在のディレクトリを表示します。
pwd
Docker は、独自のファイルシステムの見え方を持つプロセスであるコンテナ内でアプリを実行します。イメージは準備済みのアプリケーションパッケージです。afterlight:1 にはプログラムとデザインが含まれますが、後から来場者が投稿した内容は含まれません。コンテナの書き込み可能レイヤーだけに保存したデータは、そのコンテナを削除すると失われます。
使い捨ての練習用コンテナだけを削除します。docker rm はコンテナを削除し、必要なら -f が先に停止します。
docker rm -f afterlight-scratch
docker run は保存済みイメージから新しいコンテナを作ります。-d はバックグラウンドで動作させ、--name は名前を設定します。ポートはネットワークサービスを識別します。-p 8082:8081 はラボのポート 8082 をコンテナ内のアプリのポート 8081 に転送します。
docker run -d --name afterlight-scratch -p 8082:8081 afterlight:1
長い出力は新しいコンテナ ID です。Practice Copy に切り替え、The wall を選んで再読み込みします。練習のカードは消えています。古い詳細 URL を繰り返し再読み込みしないでください。その記録はもう存在しません。今回の消失は使い捨てコピーだけに限定されています。
既存のゲストブックデータを接続する
Exhibition に切り替えます。空のウォールは同じアプリを使っていますが、現在はデータの接続がありません。元の来場者 Iris の記録は、準備済み Docker ボリューム afterlight_messages に安全に保存されています。主な作業は、このデータを再接続し、その後の投稿もアプリの置き換え時に保持することです。
名前付きボリュームは、特定のコンテナの外側で Docker が管理するストレージです。マウントは、その保存先をアプリ内のパスに接続します。このアプリは SQLite データベースを /data/wall.sqlite3 に書き込みます。SQLite はファイルに記録を保存します。ここで SQL やアプリのコードは不要です。
Workstation に切り替えます。cat はファイルを表示します。
cat compose.yaml
Compose はこの YAML 設定を読んでサービスを作ります。YAML は空白による字下げで入れ子構造を表します。services はアプリをまとめ、wall はこのサービスです。image、container_name、ports はパッケージ、名前、ネットワーク対応を記述します。environment はアプリの設定値を渡します。RELEASE は表示版を選びます。両方の版は同じデータ形式を使います。
マウントとボリューム宣言を追加します。messages:/data は論理ボリューム messages をコンテナの /data に接続します。最上位の宣言で既存の Docker 名 afterlight_messages を指定します。external: true は新規作成ではなく準備済みボリュームの再利用を Compose に指定します。名前が間違っているとボリュームが見つからないエラーになります。名前を修正し、元のボリュームを削除したり空の代用品を作ったりしないでください。 保存先を宣言するだけでサービスに接続しなければ、データは保護されません。
cat > compose.yaml は設定ファイルを置き換えます。引用符付きの YAML はヒアドキュメントを開始します。最後に単独行で置く YAML も含め、ブロック全体を貼り付けます。引用符は内容をそのまま保持します。空白は例のとおりにしてください。
cat > compose.yaml <<'YAML'
name: afterlight
services:
wall:
image: afterlight:1
container_name: afterlight-wall
ports:
- "8081:8081"
environment:
MODE: guestbook
RELEASE: "1"
volumes:
- messages:/data
volumes:
messages:
name: afterlight_messages
external: true
YAML
docker compose config -q は設定を静かに検証します。出力がなければ正しく解釈できています。エラーがあれば、適用前に字下げや綴りを直して再実行します。
docker compose config -q
docker compose up -d は、ファイルに合うようサービスをバックグラウンドで作成または置き換えます。名前付きボリュームは保持します。終了を待ちます。
docker compose up -d
Exhibition に切り替え、The wall に戻って再読み込みします。Iris の A beautiful place to pause. が表示されるはずです。Iris のカードを開いて戻ります。これは実際のデータベースから再接続された既存の記録で、起動のたびに再生成されるサンプルではありません。
新しい投稿を書き、保存先を確認する
このステップでは実際に投稿を追加し、画面の結果を実際のマウントと結び付けます。Exhibition から始め、Iris の元のカードを保持します。
Leave a contribution を選びます。Your name に Mira、Your message に正確に The light stays with us. と入力し、Add to the wall を選択します。詳細ページに両方の値が必要です。Back to the wall を選ぶと、Iris と Mira の両方が表示されます。
Workstation に切り替えます。docker inspect は実際のコンテナ設定を読みます。--format はフィールドを選び、単一引用符は波括弧をそのまま渡します。このテンプレートはマウント一覧を JSON で表示します。
docker inspect afterlight-wall --format '{{json .Mounts}}'
"Type":"volume"、"Name":"afterlight_messages"、"Destination":"/data"、"RW":true を探します。RW は読み書きを許可する意味です。設定ファイルの名前は意図を示すだけですが、ここでは動作中のコンテナの実際の接続が分かります。
docker volume ls は利用できるボリュームを一覧表示します。
docker volume ls
プラットフォームの別のボリュームがある場合もあります。変更しないでください。外部ボリューム名を間違えると、Compose はボリュームが見つからないエラーで停止します。ファイルの名前を直して再適用し、空の代用品は作らないでください。 新しい空のボリュームを誤って接続しても、空のウォールだけでは元の記録が削除されたとは判断できません。元のボリュームを保持し、compose.yaml の名前を afterlight_messages に戻して検証し、再適用します。ボリュームの削除をトラブル対応の近道にしないでください。docker compose down -v は Compose 管理のボリュームとデータを削除しますが、external: true のボリュームは残します。ただし外部ボリュームを手動で削除しても安全という意味ではありません。
すべての種類のデータを考慮する
1 つの投稿が複数のディレクトリに依存することがあります。このゲストブックは /data にテキストを保存します。写真ウォールはさらに /photos にアップロード画像のバイト列を保存し、データベースには説明と対応するファイル名を保存します。説明だけを残すと、画像が壊れる可能性があります。
| コンテナ内パス | 内容 | 置き換え後も保持するか |
|---|---|---|
/data |
来場者の記録と写真・説明の対応 | はい |
写真ウォールの /photos |
アップロード写真 | はい。データベースとは別に保持 |
/app |
イメージ内の準備済みプログラム、デザイン、練習サンプル | 提供されたイメージから再作成 |
複数のデータディレクトリも同じマウント構文を使い、それぞれサービスのリスト項目とボリューム宣言を 1 つずつ追加します。空のボリュームを /app にマウントするとプログラムが隠れるため、行わないでください。キャッシュやイメージに含まれるファイルが自動的に来場者データになるわけではありません。
独立したチャレンジでは写真アップロードフォームを使います。River と Garden のリンクで、提供された PNG 練習画像を自分のコンピューターに保存できます。指定の画像を保存し、Photograph (PNG) で選択して、名前と説明を入力し、Add to the wall を送信します。選んだバイト列はブラウザーが送信するため、コマンドラインのアップロードツールは不要です。
アプリを置き換えて展示を継続する
このステップではアプリを edition 2 に置き換え、2 件の投稿を保持し、新しい投稿を受け付けます。Workstation から始めます。
nano はターミナルのテキストエディターです。設定を開きます。
nano compose.yaml
方向キーを使い、RELEASE: "1" だけを RELEASE: "2" に変更します。マウント、イメージ、ポートは保持します。Ctrl+O、Enter で保存し、Ctrl+X で終了します。保存した設定を読み、検証します。
cat compose.yaml
docker compose config -q
docker compose ps -q wall は現在のコンテナ ID を表示します。比較のため覚えておくか、ターミナル出力を残してください。レポートの提出は不要です。
docker compose ps -q wall
版の変更を適用します。--force-recreate は、ほかの設定が同じでも新しいコンテナを要求します。
docker compose up -d --force-recreate
docker compose ps -q wall
ID は異なる必要があります。これは単なる再起動ではなく置き換えです。起動に失敗したら、docker compose logs wall でアプリのメッセージを読み、設定を修正・検証して up -d を再実行します。元のボリュームは保持し、ほかのコンテナは削除しないでください。
Exhibition に切り替え、The wall を選んで再読み込みします。フッターは Edition 2 になるはずです。Iris と Mira が残っている必要があります。両方のカードを開いて戻ります。フォームに Leon と正確な Back for another look. を入力して投稿します。ウォールに戻ると、新しいアプリで 3 件の投稿が機能します。
データだけでなくサービスも確認する
Workstation に切り替えます。HTTP はブラウザーの要求と応答のプロトコルです。状態 200 は応答の成功、404 は要求したリソースが見つからないことを示します。接続失敗は、サーバーからの応答が届かなかったことを意味します。
curl は要求を送ります。-sS は進捗表示を隠して接続エラーを表示し、-o /dev/null は応答本文を破棄します。-w は引用符内の形式を表示します。%{http_code} が状態で、\n が行を終えます。Workstation で使う 127.0.0.1 はこのラボのインスタンスを指し、ポート 8081 は Exhibition です。実行します。
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/about
期待値は 200 です。Exhibition で About the exhibition を開き、開館時間が残っていることを確認して The wall に戻ります。成功状態だけでは、正しい内容や投稿の保持までは証明できません。
ボリュームは今回のコンテナ置き換えからデータを守ります。ただし独立したバックアップではなく、ボリュームの削除やホストの喪失からは守れません。アプリのファイルは再作成可能にし、来場者データは別に保存しましょう。
まとめ
使い捨てのコンテナファイルと永続的な来場者データを区別し、既存の名前付きボリュームを接続して、元の投稿と新しい投稿を置き換え後も保持しました。新規投稿と展示ページは引き続き動作します。次は説明と別保存の写真に同じ方法を応用します。



