はじめに
Dockerコンテナの運用において、コンテナのライフサイクル管理は基本的かつ重要なスキルです。コンテナを適切に起動、停止、再起動できることは、安定したアプリケーション運用の鍵となります。この記事では、Dockerコンテナのライフサイクル管理コマンドと、それらを効果的に活用するための知識を解説します。
コンテナのライフサイクルとは
Dockerコンテナのライフサイクルは、コンテナの作成から削除までの一連の状態遷移を指します。主な状態には以下があります:
- 作成済み (Created): コンテナが作成されたが、まだ起動していない状態
- 実行中 (Running): コンテナが起動し、プロセスが実行されている状態
- 停止 (Stopped/Exited): コンテナのプロセスが終了した状態
- 一時停止 (Paused): コンテナのプロセスが一時的に停止された状態
これらの状態間を移動させるための基本コマンドが、start
、stop
、restart
です。
コンテナの起動 (start)
既に作成されているが停止しているコンテナを起動するには、docker start
コマンドを使用します。
# コンテナIDまたは名前を指定して起動
docker start my-container
# 複数のコンテナを同時に起動
docker start container1 container2
# 起動と同時に出力をアタッチ
docker start -a my-container
オプション
-a, --attach
: コンテナの標準出力・標準エラー出力をアタッチします-i, --interactive
: コンテナの標準入力をアタッチします
注意点
docker start
は既存のコンテナを起動するコマンドです。新しくコンテナを作成して起動するにはdocker run
を使用します- 起動時にコンテナの設定を変更することはできません。設定変更が必要な場合は新しいコンテナを作成する必要があります
コンテナの停止 (stop)
実行中のコンテナを停止するには、docker stop
コマンドを使用します。
# コンテナを安全に停止
docker stop my-container
# タイムアウトを設定して停止
docker stop --time=10 my-container
# 複数のコンテナを同時に停止
docker stop $(docker ps -q)
オプション
-t, --time
: 停止までのタイムアウト時間(秒)を指定します(デフォルト: 10秒)
停止プロセス
- コンテナのメインプロセスに
SIGTERM
シグナルを送信 - 指定したタイムアウト時間(デフォルト10秒)待機
- タイムアウト後もプロセスが終了しない場合は、
SIGKILL
シグナルを送信して強制終了
強制停止 (kill)
コンテナをすぐに強制停止したい場合は、docker kill
コマンドを使用します。
# コンテナを強制停止
docker kill my-container
# 特定のシグナルを送信
docker kill --signal=USR1 my-container
docker kill
はSIGKILL
(または指定したシグナル)を直接送信するため、プロセスは適切なシャットダウン処理を行えません。緊急時以外はdocker stop
の使用が推奨されます。
コンテナの再起動 (restart)
実行中または停止中のコンテナを再起動するには、docker restart
コマンドを使用します。
# コンテナを再起動
docker restart my-container
# タイムアウトを設定して再起動
docker restart --time=20 my-container
オプション
-t, --time
: 停止までのタイムアウト時間(秒)を指定します(デフォルト: 10秒)
再起動のプロセス
docker restart
は内部的に以下の2つのコマンドを連続して実行するのと同等です:
docker stop my-container
docker start my-container
つまり、一旦適切に停止処理を行ってから、再度起動します。
コンテナの状態確認
コンテナの現在の状態を確認するには、docker ps
コマンドを使用します。
# 実行中のコンテナを表示
docker ps
# すべてのコンテナ(停止中含む)を表示
docker ps -a
# コンテナの詳細情報を表示
docker inspect my-container
特にコンテナの状態に関する詳細情報は、docker inspect
コマンドで確認できます:
# コンテナの状態のみを抽出して表示
docker inspect --format='{{.State.Status}}' my-container
自動再起動ポリシー
コンテナが予期せず停止した場合に自動的に再起動させる設定も可能です。これは本番環境での可用性を高めるために重要な機能です。
# コンテナ作成時に再起動ポリシーを設定
docker run --restart=always --name my-container my-image
# 既存コンテナの再起動ポリシーを更新
docker update --restart=on-failure:5 my-container
再起動ポリシーのオプション
no
: 自動再起動しない(デフォルト)on-failure[:max-retries]
: 異常終了時のみ再起動(最大試行回数を指定可能)always
: 常に再起動(手動で停止した場合でも、Dockerデーモン再起動時に起動)unless-stopped
: 手動で停止した場合を除き常に再起動
Docker Composeでのライフサイクル管理
複数のコンテナで構成されるアプリケーションでは、Docker Composeを使用してライフサイクル管理を行うことが一般的です。
# docker-compose.yml
version: '3'
services:
web:
image: nginx
restart: always
db:
image: postgres
restart: on-failure
基本コマンド
# すべてのサービスを起動
docker-compose up -d
# すべてのサービスを停止
docker-compose stop
# すべてのサービスを再起動
docker-compose restart
# 特定のサービスのみ再起動
docker-compose restart web
実践的なシナリオ
シナリオ1: メンテナンス時の操作
アプリケーションのメンテナンスを行う際の典型的なワークフローです:
# 現在のコンテナ状態を確認
docker ps
# アプリケーションコンテナを停止
docker stop my-app
# メンテナンス作業を実行
# ...
# アプリケーションコンテナを再起動
docker start my-app
# ログを確認してエラーがないか確認
docker logs -f my-app
シナリオ2: 問題発生時のデバッグ
アプリケーションに問題が発生した場合のデバッグプロセス:
# コンテナの状態を詳細確認
docker inspect my-container
# コンテナのログを確認
docker logs my-container
# コンテナを再起動してみる
docker restart my-container
# 再起動後もログを監視
docker logs -f my-container
シナリオ3: 設定変更の反映
設定ファイルを変更した後の反映方法:
# 設定ファイルを変更(バインドマウントされていると仮定)
vim /path/to/config/file
# 関連コンテナを再起動して設定を反映
docker restart my-container
# 変更が反映されたか確認
docker logs my-container
パフォーマンスと考慮事項
起動・停止時間の最適化
コンテナの起動・停止時間はアプリケーションのダウンタイムに直結します。最適化のためのポイント:
- 軽量イメージの使用: ベースイメージは可能な限り軽量なものを選びましょう
- 初期化スクリプトの効率化: ENTRYPOINTスクリプトを最適化し、起動時間を短縮
- グレースフルシャットダウンの実装: アプリケーションがSIGTERMを適切に処理できるようにする
- ヘルスチェックの設定: 起動完了を正確に検知するためのヘルスチェックを設定
コンテナの依存関係管理
複数コンテナがある場合、起動順序が重要になることがあります。Docker Composeではdepends_on
を使って依存関係を定義できますが、これはサービスの起動順序のみを制御し、アプリケーションの準備完了は保証しません。より高度な依存関係管理には、以下を検討しましょう:
- ヘルスチェックの活用
- リトライロジックの実装
- サードパーティツールの使用 (例: wait-for-it, dockerize)
まとめ
コンテナのライフサイクル管理は、Dockerを使った運用において基礎となるスキルです。start
、stop
、restart
の各コマンドを適切に使い分け、再起動ポリシーなども活用することで、安定したコンテナ運用が可能になります。
特に本番環境では、コンテナの起動・停止プロセスを理解し、適切な再起動ポリシーを設定することが、システムの安定性と可用性を高める鍵となります。
また、単一コンテナの管理だけでなく、Docker Composeなどを活用した複数コンテナの一括管理も習得することで、より複雑なアプリケーション構成にも対応できるようになります。
コメント