夜9時に止まったサイト
通販サイトのページにエラーが出ています。作った人は寝ています。当番はあなたで、本人には聞けません。
手がかりはすべてマシンの中にあります。プログラムに何を指示したか、そしてプログラムが動いている間に何を言ったかです。
このレッスンのゴール
メモ
コンテナがどう設定され、何を出力したかを調べることができる。
大事な言葉
| ことば | いみ | れい |
|---|---|---|
| inspect(調べる) | コンテナの設定をすべて読むこと | |
| ログ | プログラムが動く間に書き出すメッセージ | |
| 終了コード | プログラムが止まるときに返す番号。0 は成功 | |
| ヘルスチェック | サービスがまだ応答するかを、Docker が繰り返す確認 | |
| 環境変数 | プログラムに渡す、名前つきの設定 | NGINX_VERSION |
学生が入力するセルは、このプレビューでは空白です。
docker inspect は設定を読む
docker ps は数列だけを見せます。docker inspect は、1つのコンテナについて Docker が知るすべてを JSON で見せます。
全部を読むことはまれです。--format で、二重の波かっこで書いた項目を1つ取り出します。次の4つのコマンドは、web のイメージ、入り口、メモリの上限、環境変数を読みます。
web はどのイメージで動く?
docker inspect --format '{{.Config.Image}}' webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
どの入り口を使うと言っている?
docker inspect --format '{{json .Config.ExposedPorts}}' webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
メモリは何バイトまで使える?
docker inspect --format '{{.HostConfig.Memory}}' webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
中の環境変数を1つ読む
docker exec web printenv NGINX_VERSIONここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: だれが何を決めたか
| 項目 | だれが決めたか | 読み方 |
|---|---|---|
| イメージ | コンテナを起動した人 | Config.Image |
| 入り口(ポート) | イメージの作者(Dockerfile) | Config.ExposedPorts |
| メモリの上限 | ラボの compose ファイル | HostConfig.Memory |
| NGINX_VERSION | イメージの作者(Dockerfile) | docker exec web printenv NGINX_VERSION |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
docker ps でコンテナのことは全部分かる、と考える人がいます。ps が見せるのは要約です。動かしているユーザー、上限、環境変数、健康状態は docker inspect にしかありません。ps で見つけ、inspect で質問します。
ログはプログラムが言ったこと
コンテナのログは、中のメインのプログラムが出力したものすべてです。docker logs で見ます。
忙しいサービスは大量に書きます。このラボでは、ヘルスチェックが数秒ごとに web を呼び、1回が1行になります。だから絞り込みます。まず、存在しないページを頼みましょう。
web にないページを頼む
curl -s -o /dev/null -w "%{http_code}\n" http://web/missingここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
その要求をログで探す
docker logs web 2>&1 | grep "/missing"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
終了コードとヘルスが結末を語る
コンテナは動いているか、止まっています。止まったとき、終了コードがその終わり方を教えます。0 はうまく終わったことです。それ以外は失敗です。
ヘルスチェックは、コンテナが動く間 Docker が繰り返す確認です。結果は healthy か unhealthy です。
web は動いている? 終了コードは?
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
web はヘルスチェックに通る?
docker inspect --format '{{.State.Health.Status}}' webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
web は今どれだけメモリを使う?
docker stats --no-stream --format "{{.Name}} {{.MemUsage}}" webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 不調なコンテナへの4つの質問
| 質問 | コマンド | 止まった「report」ジョブで見えそうなこと |
|---|---|---|
| 動いている? | docker ps -a | 1分前に Exited (137) |
| どう終わった? | docker inspect --format '{{.State.ExitCode}}' report | 137: 強制終了された |
| 最後に何と言った? | docker logs --tail 5 report | メモリ不足についての行 |
| 何を指示されていた? | docker inspect --format '{{.HostConfig.Memory}}' report | ジョブに足りない小さな上限 |
学生が入力するセルは、このプレビューでは空白です。
もう一歩先へ
ラボの worker は止まっています。これで worker への4つの質問がそろいました。状態、終了コード、ログ、設定です。ラボの課題は、それに答えて直すことです。
その前に、--format なしで docker inspect web を実行しましょう。大きな3つの部分、Config、State、HostConfig を探します。