1. 概要

このチュートリアルでは、 DockerComposeで再起動ポリシーを使用する方法を学習します。

最初に、再起動ポリシーを使用してDockerコンテナを再起動する方法について説明します。 次に、DockerComposeがマルチコンテナーDockerアプリケーションの構成として通常モードとスウォームモードで再起動ポリシーを定義する方法について説明します。

2. Docker再起動ポリシー

再起動ポリシーは、Dockerコンテナーを自動的に再起動し、そのライフサイクルを管理するために使用できる戦略です。

コンテナーが予期せず失敗する可能性があることを考えると、 Dockerには、サービスが再起動ループに陥るのを防ぐための保護手段があります。 障害が発生した場合、コンテナが少なくとも10秒間正常に実行されない限り、再起動ポリシーは有効になりません。

また、コンテナを手動で停止すると、再起動ポリシーが提供されたときにDockerがサービスを自動的に再起動することも想定できます。 ただし、この場合、コンテナが任意に停止された後に再起動するのを防ぐために、これらのポリシーは却下されます。

再起動ポリシーを使用するために、Dockerには次のオプションがあります。

  • no :コンテナは自動的に再起動しません
  • on-failure [:max-retries] :ゼロ以外の終了コードで終了した場合にコンテナーを再起動し、Dockerデーモンがコンテナーを再起動するための最大試行回数を提供します
  • 常にコンテナが停止した場合は常に再起動します
  • unless-stopped :コンテナが任意に停止された場合、またはDockerデーモンによって停止された場合を除き、常にコンテナを再起動します

次に、単一のコンテナーに対してDockerCLIを使用して再起動ポリシーを設定する方法の例を見てみましょう。

docker run --restart always my-service

上記の例から、コンテナの実行が停止すると、my-serviceは常に再起動します。 でも、 コンテナーを明示的に停止した場合、再起動ポリシーは、Dockerデーモンが再起動したときまたはrestartコマンドを使用したときにのみ有効になります。

前の例は、 restart フラグが、単一のコンテナーを自動的に再始動する戦略を構成する方法を示しています。 ただし、 Docker Composeでは、通常モードまたはスウォームモードでrestartまたはrestart_policyプロパティを使用して、複数のコンテナーを管理するように再起動ポリシーを構成できます。

3. 設定

Docker Composeを使用した再起動ポリシーの実装に飛び込む前に、作業環境をセットアップしましょう。

指定する再起動ポリシーをテストするには、実行中のDockerコンテナが必要です。 前回の記事spring-cloud-docker のプロジェクトを使用します。これは、Docker化されたSpring Bootアプリケーションです。 このプロジェクトには、DockerComposeでさまざまな再起動戦略を実装するために使用する2つのDockerサービスがあります。

まず、プロジェクトルートから次のコマンドを実行して、両方のコンテナを実行できることを確認する必要があります。

docker-compose up --detach --build

これで、 docker-compose ps を実行することで、両方のサービスが実行されていることを確認できるはずです。

$ docker ps
     Name                   Command              State            Ports         
--------------------------------------------------------------------------------
message-server   java -jar /message-server.jar   Up      0.0.0.0:18888->8888/tcp
product-server   java -jar /product-server.jar   Up      0.0.0.0:19999->9999/tcp

さらに、ブラウザで localhost:18888またはlocalhost:19999 に移動し、アプリケーションサービスによって表示されるメッセージが表示されることを確認できます。

4. DockerComposeでポリシーを再起動します

以下のような再起動 Dockerコマンド、 Docker Composeには、コンテナーを自動的に再起動するためのrestartプロパティが含まれています。

さらに、docker-compose.ymlファイルのサービスにrestartプロパティを提供することで、DockerComposeで再起動ポリシーを定義できます。 Docker Composeは、DockerCLIのrestartコマンドで提供されるのと同じ値を使用して再起動戦略を定義します。

それでは、コンテナの再起動ポリシーを作成しましょう。 spring -cloud-docker プロジェクトでは、再起動ポリシープロパティを追加して、docker-compose.yml構成ファイルを変更する必要があります。 例えば:

message-server:
    container_name: message-server
    build:
        context: docker-message-server
        dockerfile: Dockerfile
    image: message-server:latest
    ports:
        - 18888:8888
    networks:
        - spring-cloud-network
    restart: no
product-server:
    container_name: product-server
    build:
        context: docker-product-server
        dockerfile: Dockerfile
    image: product-server:latest
    ports:
        - 19999:9999
    networks:
        - spring-cloud-network
    restart: on-failure

restartプロパティを両方のサービスに追加した方法に注目してください。 この場合、message-serverが自動的に再起動することはありません。 product-server は、on-failure値で指定されたゼロ以外のコードで終了した場合にのみ再起動します。

次に、スウォームモードでDockerComposeを使用して同じポリシーがどのように宣言されるかを見てみましょう。

5. DockerComposeSwarmモードでポリシーを再起動します

スウォームモードのDockerComposeは、コンテナーが自動的に再起動する方法を指定するときに、より多くのオプションのセットを提供します。 ただし、次の実装はDocker Compose v3でのみ機能します。これにより、構成にデプロイキーと値のペアが導入されます。

以下に、スウォームモードでの再起動ポリシーの構成をさらに拡張するためのさまざまなプロパティを示します。

  • 状態 なし障害時、または任意の(デフォルト)
  • 遅延再起動試行間の期間
  • max_attempts 再起動ウィンドウ外での最大試行回数
  • window 再起動が成功したかどうかを判断するための期間

それでは、再起動ポリシーを定義しましょう。 まず、バージョンプロパティを次のように変更して、DockerComposev3を使用していることを確認する必要があります。

version: '3'

バージョンを変更したら、restart_policyプロパティをサービスに追加できます。 前のセクションと同様に、メッセージサーバーコンテナは、条件任意の値を指定することにより、常に自動的に再起動します。

deploy:
    restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 120s

同様に、on-failure再起動ポリシーをproduct-serverに追加します。

deploy:
    restart_policy:
        condition: on-failure
        delay: 3s
        max_attempts: 5
        window: 60s

restart_policyプロパティがdeployキー内にあることに注意してください。これは、再起動ポリシーが、スウォームモードでコンテナーのクラスターを管理するために提供するデプロイメント構成であることを示しています。

また、両方のサービスの再起動ポリシーには、ポリシーをコンテナーのより堅牢な再起動戦略にする追加の構成メタデータが含まれています。

6. 結論

この記事では、DockerComposeを使用して再起動ポリシーを定義する方法を学習しました。 Dockerの再起動ポリシーを導入した後、以前のBaeldungプロジェクトを使用して、コンテナーの再起動戦略を構成する2つの方法を取り上げました。

最初に、Docker Compose restart プロパティ構成を使用しました。これには、DockerCLIのネイティブrestartコマンドと同じオプションが含まれています。 最後に、 restart_policy プロパティを使用しました。これは、再起動ポリシーを定義する他の構成値とともに、swarmモードとDockerComposeバージョン3でのみ使用できます。

いつものように、このチュートリアルで使用されるすべてのサンプルコードは、GitHubから入手できます。