1. 概要

このチュートリアルでは、 DockerComposeを使用して単一のDockerコンテナを再起動する方法を学習します。

2. Docker Compose restartコマンド

Docker Composeは、複数のコンテナーを単一のサービスとして管理するためのツールです。 ただし、Docker Compose CLIには、単一のコンテナーに適用できるコマンドが含まれています。 たとえば、 restartコマンドを使用すると、実行中の他のサービスに影響を与えることなく、再起動するサービスの名前を指定できます。

docker-compose restart service-name

restart コマンドの実行に入る前に、作業環境をセットアップしましょう。

3. 設定

Docker Composeコマンドを実行するには、Dockerコンテナーが必要です。 以前のBaeldungプロジェクトspring-cloud-docker を使用します。これは、Docker化されたSpring Bootアプリケーションです。 このプロジェクトには2つのDockerコンテナーがあり、他のサービスに影響を与えることなく1つのサービスを再起動できることを証明するのに役立ちます。

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

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. 単一のコンテナの再起動

これまで、Docker Composeによって2つのコンテナが実行され、単一のサービスとして管理されてきました。 次に、 restart コマンドを使用して、2つのコンテナーのうち1つだけを停止および開始する方法を見てみましょう。

まず、コンテナを再構築せずにこれを実現する方法を見ていきます。 ただし、このソリューションでは、サービスが最新のコードで更新されることはありません。 次に、実行する前に最新のコードでコンテナーをビルドする別のアプローチを確認します。

4.1. 再構築せずに再起動

両方のコンテナが実行されている状態で、再起動するサービスの1つを選択します。 この場合、message-serverコンテナを使用します。

docker-compose restart message-server

ターミナルでコマンドを実行すると、次のメッセージが表示されるはずです。

Restarting message-server ... done

端末が別のコマンドの入力を求めたら、Dockerコマンド ps を実行して実行中のすべてのプロセスの状態を確認することにより、message-serverが正常に再起動されたことを確認できます。

$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                     NAMES
b6541d1c4ddf   product-server:latest   "java -jar /product-…"   10 minutes ago   Up 42 seconds   0.0.0.0:19999->9999/tcp   product-server
1d07d2a7ed7d   message-server:latest   "java -jar /message-…"   10 minutes ago   Up 15 seconds   0.0.0.0:18888->8888/tcp   message-server

最後に、 STATUS 列を確認することで、コマンドがメッセージサーバーコンテナーを正常に再起動したことを確認できます。 メッセージサーバーサービスが、docker-を実行してから稼働していたproduct-serverサービスよりも短い期間稼働していることがわかります。前のセクションでコマンドを作成します。

4.2. 再構築と再起動

コンテナを最新のコードで更新する必要がある場合は、コードの変更を取得するためにサービスを最初にビルドする必要があるため、restartコマンドを実行するだけでは不十分です。

両方のコンテナが実行されている状態で、最初にコードを変更して、再起動する前にサービスを最新のコードで更新することを確認しましょう。 DockerProductController クラスで、returnステートメントを次のように変更してみましょう。

public String getMessage() {
    return "This is a brand new product";
}

それでは、Mavenパッケージをビルドしましょう。

mvn clean package

これで、product-serverコンテナを再起動する準備が整いました。 これは、サービスの開始方法と同様に実現できますが、今回は、再起動するコンテナーの名前を指定することで実現できます。

コマンドを実行して、コンテナを再構築して再起動しましょう。

docker-compose up --detach --build product-server

これで、 docker ps を実行し、出力を確認することで、 product-servercontainerが最新のコードで再起動したことを確認できます。

$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                     NAMES
78a4364e75e6   product-server:latest   "java -jar /product-…"   6 seconds ago    Up 5 seconds    0.0.0.0:19999->9999/tcp   product-server
b559f742973b   message-server:latest   "java -jar /message-…"   22 minutes ago   Up 22 minutes   0.0.0.0:18888->8888/tcp   message-server

ご覧のとおり、product-serverCREATED値とSTATUS値の両方を変更しました。これは、サービスが最初に再構築され、その後に影響を与えることなく再起動されたことを示しています。 メッセージサーバー

さらに、ブラウザで localhost:19999 に移動し、出力が最新であることを確認することで、コードが更新されたことをさらに確認できます。

5. 結論

この記事では、DockerComposeを使用して単一のコンテナーを再起動する方法を学習しました。 これを実現するための2つの方法について説明しました。

まず、 restart コマンドを使用して、サービスの名前を付けて再起動しました。 次に、コードを変更して、最新のコードを再構築し、他のコンテナーに影響を与えることなく1つのコンテナーを再起動できることを示しました。