Docker 入門ラボ:止まったサービスを直して、コンテナー、ログ、再起動を学ぶ

このラボは、各生徒に 3 つのコンテナーを渡して、コンテナーとは何かを教えます。そのうち 1 つはわざと壊してあります。Web ページ、キュー、そして起動した直後に止まるワーカーです。生徒は docker ps と docker logs で理由を調べ、docker exec で正常な隣のコンテナーの中を見て、足りない設定を直し、docker restart でワーカーをもう一度起動します。

攻撃のラボではありません。どのコピーもインターネットにも他の生徒にも通じておらず、ターミナルの docker が操作できるのは、生徒自身のコピーの 3 つのコンテナーだけです。

生徒が学ぶこと

コンテナーとは何か、docker ps の各列が何を示すか。止まったコンテナーは削除するまで残り、docker ps -a でだけ表示されること。サービスのログを読んで何が悪いかを調べる方法、動いているコンテナーの中でコマンドを実行する方法、再起動する方法。そしてこのラボが軸にしている考え方、つまりコンテナー自身のファイルは再起動では残るが、ラボが止まると消えること、名前付きボリュームは残ることです。コンピューティング、ネットワーク、DevOps の単元でコンテナーを入門するのに向いています。

ブラウザーで動かす

ラボは Web ページとキューを起動し、両方が正常になるまで待ちます。そのあとワーカーが起動してすぐ止まります。それが演習で、動いていないのはワーカーだけのはずです。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。Docker basicsを探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. ラボのページで「ターミナルを開く」を押し、docker ps -a と入力します。ワーカーは Exited (1) と表示されます。docker logs worker が理由を教えてくれます。設定ファイル /settings/worker.conf に QUEUE_HOST の行がないのです。web の中のシェル(docker exec -it web sh)から QUEUE_HOST=cache を追加し、docker restart worker を実行すると、docker ps に Up と healthy で表示されます。「ブラウザーで」の下の Docker basics page のリンクで、web が配信するページを見られます。

何を提出させるか

修正の前と後の docker ps -a の出力、何が悪いかを教えてくれたログの行、そして自分が書いたファイルのうち、ラボが止まっても残るものはどれで、それはなぜかを書いた一文を提出させます。最後の一文で、コンテナー自身のファイルシステムとボリュームの違いを理解したかが分かります。

このラボの基本レッスン

Docker Basics は、このラボで進める小さなレッスンです。生徒は docker ps -a でコンテナーを一覧し、ワーカーのログを読み、web の中から設定ファイルを表示し、足りない行を追加して、ワーカーを再起動し、正常になるのを確かめます。そのあとラボを停止して起動し直し、修正が名前付きボリュームに残っていることを確かめます。

無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダから自分のモジュールにコピーでき、新しい学校ではサンプルモジュールの Lab Basics (Sample) に入っています。意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、自分のモジュールにコピーしてください。

GitHub のコード

compose ファイルに Dockerfile はありません。公開されている標準のイメージ、nginx と Valkey の 2 つをバージョンを固定して実行し、各サービスの動作はそれぞれの entrypoint に書いてあるので、すべてを 1 つのファイルで読めます。nginx のイメージは BSD-2-Clause、Valkey は BSD-3-Clause ライセンスで、どちらも当社は配布していません。ラボの中では、生徒がコンテナーを作成、取得、ビルド、削除することは一切できないので、ラボはそれを求めません。それらのコマンドは自分のマシンで使えます。

課題として出す

何を提出するかを、課題に書いておきます。

  1. ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-docker-basics とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、先にリポジトリをフォークしてください。
  2. 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
  3. 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
  4. 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。

よくある質問

ワーカーが docker ps に出ないのはなぜですか?
設定が足りないため起動してすぐ止まり、docker ps は動いているものだけを一覧するからです。docker ps -a なら止まったコンテナーも一覧され、docker logs worker では、止まる前に出したメッセージが今も表示されます。
ラボのターミナルで使える docker コマンドは何ですか?
docker ps、docker logs、docker exec、docker restart のほか、docker inspect のように 3 つのコンテナーを見るだけのものがいくつかあります。作成、取得、ビルド、削除は一切できず、docker volume と docker network は拒否されます。
ラボを停止して起動し直したあとに残るものは何ですか?
/settings を収めた名前付きボリュームです。直したワーカーはすぐに正常な状態で起動します。生徒がコンテナーの中のほかの場所に書いたファイルは消えます。