クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

コンテナの設定とログを読む

このレッスンのあとで: コンテナがどう設定され、何を出力したかを調べることができる。

50分のレッスンコマンド9件Docker 入門ラボ:止まったサービスを直して、コンテナー、ログ、再起動を学ぶ

夜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 -a1分前に Exited (137)
どう終わった?docker inspect --format '{{.State.ExitCode}}' report137: 強制終了された
最後に何と言った?docker logs --tail 5 reportメモリ不足についての行
何を指示されていた?docker inspect --format '{{.HostConfig.Memory}}' reportジョブに足りない小さな上限

学生が入力するセルは、このプレビューでは空白です。

もう一歩先へ

ラボの worker は止まっています。これで worker への4つの質問がそろいました。状態、終了コード、ログ、設定です。ラボの課題は、それに答えて直すことです。

その前に、--format なしで docker inspect web を実行しましょう。大きな3つの部分、Config、State、HostConfig を探します。

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

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。