Docker コンテナを適切にシャットダウンする方法

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

はじめに

Docker コンテナは、現代のソフトウェア開発とデプロイメントに欠かせない要素となっています。これらのコンテナが適切にシャットダウンされることを保証することは、アプリケーションの安定性と信頼性を維持するために重要です。このチュートリアルでは、Docker コンテナを適切に停止するプロセスを案内し、コンテナのシャットダウンに関するベストプラクティスを探ります。

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

Docker コンテナのライフサイクルを完全に理解するには、コンテナが取り得るさまざまな状態と、それらの状態間でどのように遷移するかを知ることが重要です。

コンテナの状態

Docker コンテナは以下の状態で存在することができます。

  1. Created(作成済み): コンテナが作成されたが、まだ起動されていません。
  2. Running(実行中): コンテナが現在実行中で、メインプロセスが実行されています。
  3. Paused(一時停止中): コンテナのメインプロセスが一時停止されていますが、コンテナはまだアクティブです。
  4. Stopped(停止済み): コンテナが停止され、メインプロセスが終了しています。
  5. Restarting(再起動中): コンテナが現在再起動されています。
  6. Removing(削除中): コンテナがシステムから削除される過程にあります。
stateDiagram-v2
    [*] --> Created
    Created --> Running
    Running --> Paused
    Paused --> Running
    Running --> Stopped
    Stopped --> Running
    Stopped --> [*]
    Running --> Restarting
    Restarting --> Running
    Running --> Removing
    Removing --> [*]

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

Docker エンジンはコンテナのライフサイクルを管理し、必要に応じてコンテナの作成、起動、停止、削除を行います。これは、docker rundocker stopdocker startdocker rm などのさまざまな Docker コマンドを通じて行われます。

コンテナが作成されると、それは「Created(作成済み)」状態になります。コンテナを起動するには、docker start コマンドを使用します。これにより、コンテナは「Running(実行中)」状態に遷移します。コンテナが実行中のときは、docker pause を使用して一時停止することができ、これによりコンテナは「Paused(一時停止中)」状態になります。コンテナを再開するには、docker unpause を使用します。

実行中のコンテナを停止するには、docker stop コマンドを使用します。これにより、コンテナのメインプロセスが適切にシャットダウンされ、「Stopped(停止済み)」状態に遷移します。停止したコンテナを再起動する必要がある場合は、再度 docker start コマンドを使用することができます。

最後に、コンテナをシステムから削除するには、docker rm コマンドを使用します。これにより、コンテナは「Removing(削除中)」状態に遷移し、永久に削除されます。

## Create a new container

## Start the container

## Pause the container

## Unpause the container

## Stop the container

## Start the stopped container

## Remove the container

Docker コンテナが取り得るさまざまな状態と、そのライフサイクルを管理するために使用されるコマンドを理解することで、コンテナの動作を効果的に制御および監視することができます。

Docker コンテナを適切に停止する

Docker コンテナを停止する際には、スムーズなシャットダウンプロセスを確保し、潜在的なデータ損失やアプリケーションの問題を防ぐために、適切な方法で停止することが重要です。

docker stop コマンド

実行中の Docker コンテナを停止するために主に使用されるコマンドは docker stop です。このコマンドは、コンテナのメインプロセスに SIGTERM シグナルを送信し、強制的に SIGKILL シグナルでプロセスを終了する前に、クリーンなシャットダウンを行う猶予期間(デフォルトは 10 秒)を与えます。

docker stop [OPTIONS] CONTAINER [CONTAINER...]

[OPTIONS] には以下が含まれます。

  • -t, --time=: コンテナを強制終了する前に停止を待つ秒数(デフォルトは 10 秒)。

適切なシャットダウン戦略

Docker コンテナを適切にシャットダウンするために、以下の戦略を実装することができます。

  1. SIGTERM シグナルを処理する: アプリケーションのメインプロセスが SIGTERM シグナルを受信し、データのフラッシュ、接続のクローズ、リソースの解放などのクリーンなシャットダウンを行うようにします。

  2. シャットダウンスクリプトを使用する: コンテナのエントリポイントまたはコマンドとして実行されるカスタムスクリプトを作成します。このスクリプトは SIGTERM シグナルを処理し、コンテナが終了する前に必要なシャットダウン手順を実行することができます。

#!/bin/bash

## Trap the SIGTERM signal and perform a graceful shutdown
trap 'echo "Received SIGTERM signal, performing graceful shutdown..."; \
     your_shutdown_logic; \
     exit 0;' SIGTERM

## Run your application's main process
your_application_command
  1. ヘルスチェックを活用する: アプリケーションの準備状態と生存状態を検証する Docker ヘルスチェックを構成します。これにより、コンテナを停止する前に健全な状態にあることを確認するのに役立ちます。
## Dockerfile
HEALTHCHECK --interval=5s --timeout=3s \
 CMD your_healthcheck_command || exit 1
  1. 適切な --time オプションを設定する: docker stop を使用する際には、--time オプションを使用して適切な猶予期間を設定し、アプリケーションが適切にシャットダウンするのに十分な時間を与えます。
docker stop --time=30 my-container

これらの戦略を実装することで、Docker コンテナを制御可能かつ信頼性の高い方法で停止し、データ損失やアプリケーションの問題のリスクを最小限に抑えることができます。

コンテナシャットダウンのベストプラクティス

Docker コンテナを信頼性が高く効率的にシャットダウンするには、以下のベストプラクティスを検討してください。

適切なシャットダウン処理を実装する

前のセクションで説明したように、SIGTERM シグナルを処理し、アプリケーションを適切にシャットダウンすることが重要です。これには以下が含まれます。

  1. アプリケーションのメインプロセスで SIGTERM シグナルを待ち受ける。
  2. データのフラッシュ、接続のクローズ、リソースの解放など、必要なクリーンアップとシャットダウンロジックを実行する。
  3. シャットダウンが完了した後、プロセスをきれいに終了する。

シャットダウンスクリプトを使用する

コンテナのエントリポイントまたはコマンドとして実行されるカスタムシャットダウンスクリプトを活用します。このスクリプトは SIGTERM シグナルを処理し、シャットダウンプロセスを調整して、すべてのコンテナで一貫した信頼性の高いシャットダウンを確保することができます。

#!/bin/bash

## Trap the SIGTERM signal and perform a graceful shutdown
trap 'echo "Received SIGTERM signal, performing graceful shutdown..."; \
     your_shutdown_logic; \
     exit 0;' SIGTERM

## Run your application's main process
your_application_command

ヘルスチェックを構成する

アプリケーションの準備状態と生存状態を検証する Docker ヘルスチェックを設定します。これにより、コンテナを停止する前に健全な状態にあることを確認でき、シャットダウンプロセス中の問題のリスクを軽減することができます。

## Dockerfile
HEALTHCHECK --interval=5s --timeout=3s \
 CMD your_healthcheck_command || exit 1

適切な --time オプションを設定する

docker stop コマンドを使用する際には、--time オプションを使用して適切な猶予期間を設定します。これにより、アプリケーションが適切にシャットダウンするのに十分な時間を確保でき、データ損失やアプリケーションの問題が発生する可能性を低減できます。

docker stop --time=30 my-container

コンテナのシャットダウンを監視する

コンテナのシャットダウンプロセスを、特にデプロイメントやスケーリング操作中に注意深く監視します。シャットダウンフェーズ中の問題や予期しない動作を特定するために、コンテナのログとメトリクスを確認します。

再起動ポリシーを実装する

alwayson-failureunless-stopped など、コンテナに適切な再起動ポリシーを構成します。これにより、予期しないシャットダウンや障害が発生した場合にコンテナが自動的に再起動されることを確保できます。

## docker-compose.yml
version: "3"
services:
  my-app:
    restart_policy:
      condition: on-failure

これらのベストプラクティスに従うことで、Docker コンテナを信頼性が高く制御可能な方法でシャットダウンし、データ損失やアプリケーションの問題のリスクを最小限に抑えることができます。

まとめ

このチュートリアルでは、Docker コンテナを適切にシャットダウンする方法を学びました。コンテナのライフサイクルを理解し、適切な停止技術を実装し、ベストプラクティスに従うことで、Docker ベースのアプリケーションを効果的に管理し、予期しない問題を回避することができます。コンテナを適切にシャットダウンすることは、Docker の使用における重要な側面であり、この知識は堅牢で信頼性の高いインフラストラクチャを維持するのに役立ちます。