はじめに
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 コンテナの監視と管理に必要なスキルを習得しました。
コンテナの作成と実行 -
docker runコマンドを使用して Docker コンテナを作成し、実行する方法を学びました。基本的なステータス確認 - 実行中のコンテナを一覧表示し、基本的なステータス情報を確認するために、
docker psコマンドを習得しました。高度な監視 - 詳細なコンテナ情報とリアルタイムのパフォーマンスメトリクスを取得するために、
docker inspectおよびdocker statsを使用した高度な監視技術を調べました。コンテナのライフサイクル管理 - コンテナの作成、起動、停止、一時停止、削除など、コンテナの完全なライフサイクルを管理する方法を学びました。
トラブルシューティング - ログ、リソース監視、および直接コンテナアクセスを使用して、一般的なコンテナの問題を診断し、解決するスキルを開発しました。
これらのスキルは、開発、テスト、および本番環境で Docker コンテナを効果的に使用するための基本です。コンテナの正常性を自信を持って監視し、ライフサイクルを管理し、問題が発生したときにトラブルシューティングできるようになりました。
Docker の旅を続けるには、マルチコンテナアプリケーション向けの Docker Compose、Docker ネットワーキング、Kubernetes を使用したコンテナオーケストレーションなどのトピックを検討してください。



