Docker コンテナの状態確認方法

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

はじめに

Docker は、アプリケーションの開発、デプロイ、管理方法に革命をもたらしました。強力なコンテナ化プラットフォームである Docker を使用すると、アプリケーションとその依存関係を分離されたポータブルな環境にパッケージ化できます。Docker コンテナの状態を確認する方法を知っておくことは、効果的な管理とトラブルシューティングに不可欠です。

この実践的な実験(Lab)では、Docker コンテナを監視し、その状態を理解し、ライフサイクルを管理するための基本的なコマンドを学びます。このチュートリアルを終える頃には、効率的なアプリケーション開発とデプロイのために、Docker コンテナの状態を自信を持って確認し、管理できるようになるでしょう。

Docker コンテナの作成と実行

Docker コンテナの状態を確認する前に、いくつかのコンテナを実行する必要があります。このステップでは、シンプルな Docker コンテナを作成して実行します。

Docker コンテナの理解

Docker コンテナは、アプリケーションの実行に必要なすべて(コード、ランタイム、システムツール、ライブラリ、設定)を含む、軽量でスタンドアロンの実行可能なソフトウェアパッケージです。これらは、開発のさまざまな段階で一貫した環境を提供します。

Docker コンテナを使用する利点には、以下が含まれます。

  • 一貫したランタイム環境
  • 他のアプリケーションからの分離
  • 迅速なデプロイとスケーリング
  • 効率的なリソース利用

Docker のインストール確認

まず、Docker がシステムに正しくインストールされていることを確認しましょう。

docker --version

次のような出力が表示されるはずです。

Docker version 20.10.21, build baeda1f

最初のコンテナの実行

公式の Nginx Web サーバーイメージを使用して、シンプルなコンテナを実行してみましょう。これにより、次のステップで監視するコンテナが得られます。

ターミナルで次のコマンドを実行します。

docker run --name my-nginx -d -p 8080:80 nginx

このコマンドは次のことを行います。

  • my-nginx という名前のコンテナを作成します
  • デタッチモード (-d) で実行します。つまり、バックグラウンドで実行されます
  • ホストのポート 8080 をコンテナのポート 80 にマッピングします (-p 8080:80)
  • Docker Hub から公式の nginx イメージを使用します

コンテナ ID である長い文字列が表示されるはずです。

a72369167c214c20247f786a47b6b0b8581b60324bd2d151a7a0db8ddb024959

次に、コンテナが実行されていることを確認しましょう。

docker ps

次のような出力が表示されるはずです。

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   my-nginx

おめでとうございます!Docker コンテナの作成と起動に成功しました。次のステップでは、このコンテナの状態をより詳細に確認する方法を説明します。

基本的なコンテナ状態コマンド

実行中のコンテナができたので、Docker の最も一般的なコマンドを使用して、その状態を確認する方法を学びましょう。

docker ps コマンドの使用

docker ps コマンドは、実行中のコンテナを表示するための最も基本的な方法です。

docker ps

出力は次のようになります。

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    0.0.0.0:8080->80/tcp   my-nginx

このコマンドは以下を表示します。

  • CONTAINER ID: コンテナの一意の識別子
  • IMAGE: コンテナの作成に使用された Docker イメージ
  • COMMAND: コンテナ内で実行されたコマンド
  • CREATED: コンテナが作成された日時
  • STATUS: コンテナの現在の状態
  • PORTS: ホストとコンテナ間のポートマッピング
  • NAMES: コンテナに割り当てられた名前

すべてのコンテナの表示

基本的な docker ps コマンドは、実行中のコンテナのみを表示します。停止したコンテナを含むすべてのコンテナを表示するには、次のようにします。

docker ps -a

これにより、状態に関係なく、すべてのコンテナが表示されます。

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   5 minutes ago    Up 5 minutes    0.0.0.0:8080->80/tcp   my-nginx

現在、コンテナは 1 つだけですが、停止したコンテナがある場合は、ここにも表示されます。

フォーマットを使用したコンテナの状態表示

--format オプションを使用して、必要な情報のみを表示するように docker ps の出力をカスタマイズできます。

docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

これにより、コンテナ名、ステータス、ポートのみを含む簡略化されたテーブルが表示されます。

NAMES       STATUS          PORTS
my-nginx    Up 7 minutes    0.0.0.0:8080->80/tcp

コンテナの停止

コンテナの状態がどのように変化するかを確認するために、コンテナを停止してみましょう。

docker stop my-nginx

出力:

my-nginx

次に、状態をもう一度確認します。

docker ps

実行中のコンテナの一覧に、コンテナが表示されなくなったことに気付くでしょう。表示するには、次のようにします。

docker ps -a

出力:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   10 minutes ago   Exited (0) 10 seconds ago             my-nginx

コンテナの状態が「Exited」に変わり、実行されなくなったことを示しています。

コンテナの起動

コンテナをもう一度起動してみましょう。

docker start my-nginx

出力:

my-nginx

状態を確認して、実行されていることを確認します。

docker ps

出力:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   12 minutes ago   Up 5 seconds    0.0.0.0:8080->80/tcp   my-nginx

素晴らしい! docker ps コマンドを使用して Docker コンテナの基本的な状態を確認する方法、およびコンテナを停止および起動する方法を理解しました。

高度なコンテナ監視

コンテナの状態を確認する基本を理解したところで、コンテナに関する詳細な情報を提供する、より高度な監視コマンドを調べてみましょう。

docker inspect を使用した詳細なコンテナ情報

docker inspect コマンドは、コンテナに関する詳細な設定とランタイム情報を提供します。

docker inspect my-nginx

このコマンドは、コンテナに関する包括的な情報を含む JSON 配列を返します。出力は非常に長くなりますが、以下が含まれます。

  • ネットワーク設定
  • ボリュームマウント
  • 環境変数
  • リソース制限
  • コンテナの状態
  • その他多数

--format オプションを使用して、特定のセクションを見てみましょう。

docker inspect --format='{{.State.Status}}' my-nginx

出力:

running

他の特定の情報を抽出することもできます。

docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx

これにより、コンテナの内部 IP アドレスが表示されます。

docker stats を使用したリアルタイムのコンテナメトリクス

docker stats コマンドは、コンテナのリソース使用状況に関する統計情報のライブストリームを提供します。

docker stats my-nginx

次のような出力が表示されます。

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
a72369167c21   my-nginx   0.00%     2.312MiB / 7.764GiB   0.03%     1.05kB / 1.51kB   0B / 4.1kB       2

これは以下を示しています。

  • CPU 使用率 (パーセント)
  • メモリ使用量
  • ネットワーク I/O
  • ブロック I/O
  • プロセス数

ライブ統計ビューを終了するには、Ctrl+C を押します。

すべてのコンテナの統計情報を一度に表示するには、次のようにします。

docker stats --no-stream

これにより、継続的な更新なしで、統計情報のスナップショットが表示されます。

コンテナログの表示

問題をトラブルシューティングするには、コンテナのログを確認することが役立つことがよくあります。

docker logs my-nginx

Nginx サーバーからのログが表示されます。Web サーバーにアクセスした場合は、HTTP リクエストログが表示されます。

ログをリアルタイムで追跡するには (tail -f に似ています)。

docker logs -f my-nginx

ログストリームを終了するには、Ctrl+C を押します。

コンテナプロセスの確認

コンテナ内で実行されているプロセスを表示するには、次のようにします。

docker top my-nginx

出力は次のようになります。

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12345               12321               0                   14:15               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            12401               12345               0                   14:15               ?                   00:00:00            nginx: worker process

これは、コンテナ内で実行されているすべてのプロセス、その PID、およびリソース使用量を示しています。

比較用の新しいコンテナの作成

既存のコンテナと比較するために、別のコンテナを作成してみましょう。

docker run --name redis-server -d redis

次に、両方のコンテナの統計情報を比較してみましょう。

docker stats --no-stream my-nginx redis-server

両方のコンテナの統計情報が表示され、リソース使用量を比較できます。

これらの高度な監視コマンドを使用すると、コンテナの健全性とパフォーマンスに関するより深い洞察が得られます。これは、問題のトラブルシューティングとリソース使用量の最適化に不可欠です。

コンテナのライフサイクル管理

Docker を効果的に使用するには、コンテナのライフサイクルを管理する方法を理解することが重要です。このステップでは、コンテナの状態を制御し、コンテナのライフサイクルを理解するためのさまざまなコマンドを調べていきます。

コンテナのライフサイクル状態

Docker コンテナは、いくつかの状態で存在できます。

  • Created (作成済み): コンテナは作成されていますが、起動されていません
  • Running (実行中): コンテナは現在実行中です
  • Paused (一時停止): コンテナの実行が一時停止しています
  • Stopped (停止済み): コンテナは停止していますが、まだ存在しています
  • Removed (削除済み): コンテナは削除されました

これらの状態間の移行方法を調べてみましょう。

起動せずにコンテナを作成する

create コマンドを使用して、起動せずにコンテナを作成できます。

docker create --name test-container nginx

これにより、コンテナが作成されますが、起動されません。その状態を確認します。

docker ps -a

新しいコンテナが「Created (作成済み)」ステータスで表示されるはずです。

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                  NAMES
3f4ab92d1234   nginx     "/docker-entrypoint.…"   5 seconds ago    Created                                            test-container
a72369167c21   nginx     "/docker-entrypoint.…"   40 minutes ago   Up 30 minutes               0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes               6379/tcp               redis-server

作成されたコンテナの起動

作成されたコンテナを起動するには、次のようにします。

docker start test-container

実行されていることを確認します。

docker ps

コンテナの一時停止と一時停止解除

Docker では、コンテナを一時停止できます。これにより、コンテナ内のすべてのプロセスがフリーズします。

docker pause test-container

その状態を確認します。

docker ps

出力:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                  PORTS                  NAMES
3f4ab92d1234   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 1 minute (Paused)                           test-container
a72369167c21   nginx     "/docker-entrypoint.…"   42 minutes ago   Up 32 minutes           0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   12 minutes ago   Up 12 minutes           6379/tcp               redis-server

コンテナを再開するには、次のようにします。

docker unpause test-container

再び実行されていることを確認します。

docker ps

コンテナの停止と再起動

コンテナを正常に停止するには (SIGTERM を送信し、猶予期間後に SIGKILL を送信します)。

docker stop test-container

コンテナを強制的に停止するには (SIGKILL を送信します)。

docker start test-container ## まず起動します
docker kill test-container  ## 次に停止します

コンテナを再起動するには (停止して再度起動します)。

docker start test-container ## まず起動します
docker restart test-container

コンテナの削除

停止したコンテナを削除するには、次のようにします。

docker stop test-container ## まず停止していることを確認します
docker rm test-container

削除されたことを確認します。

docker ps -a | grep test-container

出力が得られないはずです。これは、コンテナが削除されたことを示しています。

実行中のコンテナの削除

実行中のコンテナを強制的に削除できます。

docker run --name temp-container -d nginx
docker rm -f temp-container

コンテナの再起動ポリシー

Docker では、コンテナの再起動ポリシーを設定できます。

docker run --name always-restart --restart always -d nginx

このコンテナは、終了した場合、または Docker が再起動した場合に自動的に再起動します。

再起動ポリシーを確認します。

docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' always-restart

出力:

always

このコンテナを停止して削除しましょう。

docker rm -f always-restart

これらのライフサイクルコマンドを理解することで、Docker コンテナを完全に制御し、アプリケーションのニーズに基づいて状態を効率的に管理できます。

コンテナの問題のトラブルシューティング

適切な監視と管理を行っていても、コンテナで問題が発生することがあります。このステップでは、Docker の診断ツールを使用して、一般的なコンテナの問題をトラブルシューティングする方法を学びます。

一般的なコンテナの問題

コンテナは、さまざまな理由で失敗する可能性があります。

  • アプリケーションのクラッシュ
  • リソース制限
  • 設定の問題
  • ネットワークの問題
  • アクセス許可エラー

これらの問題を特定し、診断する方法を調べてみましょう。

問題のあるコンテナの作成

無効なコマンドが原因で直ちに終了するコンテナを作成してみましょう。

docker run --name problematic -d nginx sleep 5

このコンテナは、sleep 5 コマンドを実行し、5 秒後に終了します。

数秒待ってから、その状態を確認します。

docker ps -a

出力:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                  NAMES
1a2b3c4d5e6f   nginx     "sleep 5"                10 seconds ago   Exited (0) 5 seconds ago                           problematic
a72369167c21   nginx     "/docker-entrypoint.…"   1 hour ago       Up 50 minutes               0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   30 minutes ago   Up 30 minutes               6379/tcp               redis-server

コンテナはコード 0 (成功) で終了しましたが、実行されていません。

コンテナの終了コードの確認

終了コードは、コンテナが停止した理由を教えてくれます。

  • 0: 成功
  • 0 以外:エラーが発生しました

終了コードを確認するには、次のようにします。

docker inspect problematic --format='{{.State.ExitCode}}'

出力:

0

これは、コンテナが割り当てられたタスクを完了した後、正常に終了したことを意味します。

コンテナログの検査

ログは、トラブルシューティングに不可欠です。

docker logs problematic

この場合、sleep コマンドはログを生成しないため、出力が表示されない可能性があります。

ログを生成する別の問題のあるコンテナを作成してみましょう。

docker run --name crash-test -d nginx sh -c "echo 'Starting container'; sleep 2; echo 'About to crash'; exit 1"

数秒後、その状態とログを確認します。

docker ps -a | grep crash-test

出力:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
f1e2d3c4b5a6   nginx     "sh -c 'echo 'Starti…"   10 seconds ago   Exited (1) 7 seconds ago              crash-test

次に、ログを確認します。

docker logs crash-test

出力:

Starting container
About to crash

これらのログは、コンテナがクラッシュする前に何が起こったかについての手がかりを提供します。

リソース使用量の確認

リソースの制約により、コンテナがクラッシュしたり、パフォーマンスが低下したりする可能性があります。

docker stats --no-stream my-nginx

これにより、CPU、メモリ、I/O の使用状況が表示され、リソースのボトルネックを特定するのに役立ちます。

コンテナ設定の確認

設定ミスは、問題の一般的な原因です。

docker inspect my-nginx

以下を探します。

  • ボリュームマウント
  • 環境変数
  • ネットワーク設定
  • リソース制限

実行中のコンテナへのアクセス

実行中のコンテナ内の問題をデバッグするには、次のようにします。

docker exec -it my-nginx bash

これにより、コンテナ内にシェルが作成され、そこでコマンドを実行して問題を診断できます。

ls -la
ps aux
cat /etc/nginx/nginx.conf
exit ## コンテナシェルを終了する

クリーンアップ

問題のあるコンテナをクリーンアップしましょう。

docker rm problematic crash-test

これらのトラブルシューティング手法を習得することで、Docker コンテナの問題を迅速に特定して解決し、アプリケーションがスムーズかつ確実に実行されるようにすることができます。

まとめ

この実践的な実験 (Lab) では、Docker コンテナの監視と管理に必要なスキルを習得しました。

  1. コンテナの作成と実行 - docker run コマンドを使用して Docker コンテナを作成し、実行する方法を学びました。

  2. 基本的なステータス確認 - 実行中のコンテナを一覧表示し、基本的なステータス情報を確認するために、docker ps コマンドを習得しました。

  3. 高度な監視 - 詳細なコンテナ情報とリアルタイムのパフォーマンスメトリクスを取得するために、docker inspect および docker stats を使用した高度な監視技術を調べました。

  4. コンテナのライフサイクル管理 - コンテナの作成、起動、停止、一時停止、削除など、コンテナの完全なライフサイクルを管理する方法を学びました。

  5. トラブルシューティング - ログ、リソース監視、および直接コンテナアクセスを使用して、一般的なコンテナの問題を診断し、解決するスキルを開発しました。

これらのスキルは、開発、テスト、および本番環境で Docker コンテナを効果的に使用するための基本です。コンテナの正常性を自信を持って監視し、ライフサイクルを管理し、問題が発生したときにトラブルシューティングできるようになりました。

Docker の旅を続けるには、マルチコンテナアプリケーション向けの Docker Compose、Docker ネットワーキング、Kubernetes を使用したコンテナオーケストレーションなどのトピックを検討してください。