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でから入手できます。