はじめに
この実験では、docker service update コマンドを使用して Docker サービスを効果的に管理および変更する方法を学びます。まずは簡単なサービスを作成し、その後、レプリカの数を更新することでサービスをスケールする方法を探ります。
さらに、サービスのローリング再起動を実行する方法、公開ポートの追加または削除の方法、およびサービスを以前のバージョンにロールバックする方法を学びます。これらは、Docker Swarm 環境でコンテナ化されたアプリケーションのライフサイクルを管理するために必要なスキルです。
簡単なサービスを作成する
このステップでは、シンプルな Docker サービスを作成する方法を学びます。サービスは、同じイメージのコンテナのグループです。サービスは、アプリケーションをスケールし、高可用性を確保するのに役立ちます。
まず、Docker Hub から alpine イメージを取得しましょう。このイメージは非常に小さく、テストに便利です。
docker pull alpine
イメージが取得され、ダウンロードされていることを示す出力が表示されるはずです。
次に、alpine イメージを使用して my-service という名前のサービスを作成しましょう。コンテナ内で "Hello, LabEx!" を出力してから終了する簡単なコマンドを実行します。
docker service create --name my-service alpine echo "Hello, LabEx!"
このコマンドは新しいサービスを作成します。--name my-service フラグはサービスに名前を付けます。alpine は使用するイメージで、echo "Hello, LabEx!" はコンテナ内で実行するコマンドです。
サービス ID を示す、次のような出力が表示されるはずです。
<service_id>
サービスが正常に作成されたことを確認するには、サービスを一覧表示できます。
docker service ls
出力に my-service が表示されるはずです。
サービスのレプリカを更新する
このステップでは、レプリカの数を更新することで Docker サービスをスケールする方法を学びます。レプリカは、サービスのコンテナの同一コピーです。レプリカの数を増やすことで、サービスはより多くの負荷を処理でき、より高い可用性を提供できます。
現在、私たちの my-service はレプリカが 1 つだけです。これは、docker service ls の出力の "REPLICAS" 列で確認できます。
サービスを 3 つのレプリカにスケールしましょう。これは、--replicas フラグを使用した docker service update コマンドで行うことができます。
docker service update --replicas 3 my-service
このコマンドは、Docker Swarm に my-service を 3 つのレプリカに更新するよう指示します。Docker Swarm は、目的のレプリカ数に達するために必要な追加のコンテナを自動的に作成します。
サービスが更新されたことを示す出力が表示されるはずです。
サービスがスケールされたことを確認するには、再度サービスを一覧表示しましょう。
docker service ls
my-service の "REPLICAS" 列を見てください。ここには 3/3 と表示され、3 つのレプリカが必要で、現在 3 つが実行中であることを示しています。
また、サービスに関連付けられたタスクを調べて、個々のコンテナを確認することもできます。
docker service ps my-service
このコマンドは、サービスの各レプリカ(タスク)の状態を表示します。おそらく "Running" の状態で 3 つのタスクが表示されるはずです。
サービスのローリング再起動を実行する
このステップでは、Docker サービスのローリング再起動を実行する方法を学びます。ローリング再起動は、サービスのタスクを 1 つずつ更新し、更新プロセス中もサービスが利用可能な状態を維持します。これは、アプリケーションの稼働時間を維持するために重要です。
ローリング再起動をトリガーするには、--force フラグを使用した docker service update コマンドを使います。このフラグは、サービスの設定が変更されていなくても新しい更新を強制的に行います。
docker service update --force my-service
このコマンドは、my-service のローリング再起動を開始します。Docker Swarm は、サービスの各レプリカを順次停止して再起動します。
サービスが更新されたことを示す出力が表示されるはずです。
進行中のローリング再起動を観察するには、サービスのタスクを継続的に監視できます。
docker service ps my-service
このコマンドを複数回実行してください。各レプリカが再起動されるにつれて、タスクの "CURRENT STATE" が "Running" から "Shutdown" へ、そして再度 "Running" へ変化するのが見られます。このプロセスはレプリカごとに 1 つずつ行われ、再起動のローリング性質を示しています。
すべてのタスクが再起動されると、docker service ps my-service の出力には、すべてのタスクが "Running" 状態で、"UPDATED" 列に更新されたタイムスタンプが表示されます。
公開ポートの追加または削除
このステップでは、Docker サービスの公開ポートを追加または削除する方法を学びます。ポートを公開することで、コンテナ内のポートを Docker Swarm クラスタの外部からアクセス可能にします。これは、アプリケーションをユーザーや他のサービスに公開するために不可欠です。
現在の my-service は、単純な echo コマンドを実行して終了するだけなので、公開ポートがありません。ポートの公開をデモンストレーションするために、簡単な Web サーバーを実行する新しいサービスを作成しましょう。これには nginx イメージを使用します。
まず、nginx イメージを取得します。
docker pull nginx
次に、web-service という名前の新しいサービスを作成し、コンテナのポート 80 をホストのポート 8080 に公開します。
docker service create --name web-service --publish 8080:80 nginx
このコマンドは、nginx イメージを使用して web-service という名前のサービスを作成します。--publish 8080:80 フラグは、コンテナ内のポート 80 をホストのポート 8080 にマッピングします。
サービス ID を示す出力が表示されるはずです。
ポートが公開されていることを確認するには、サービスを調べることができます。
docker service inspect web-service
出力の EndpointSpec セクションを探してください。Ports の下に、公開されたポートのマッピングが表示されるはずです(例:PublishedPort: 8080, TargetPort: 80)。
次に、web-service から公開ポートを削除しましょう。これは、--publish-rm フラグを使用した docker service update コマンドで行うことができます。コンテナ内のターゲットポートを指定します。
docker service update --publish-rm 80 web-service
このコマンドは、コンテナ内のポート 80 のポートマッピングを削除します。
サービスが更新されたことを示す出力が表示されるはずです。
ポートが削除されたことを確認するには、再度サービスを調べます。
docker service inspect web-service
EndpointSpec セクションには、削除したポートマッピングが表示されなくなっているはずです。
サービスを前のバージョンにロールバックする
このステップでは、Docker サービスを前のバージョンにロールバックする方法を学びます。新しいサービスの更新に問題が生じた場合、ロールバックは不可欠です。Docker Swarm は以前のサービス設定を追跡しており、安定した状態に迅速に戻すことができます。
まず、ロールバックする可能性のある更新をシミュレートしましょう。web-service を更新して、別の仮想的なイメージバージョンを使用するようにします(実際にはそのイメージを取得しませんが、ロールバックに関してはコマンドの構造が重要です)。
docker service update --image nginx:1.20.0 web-service
このコマンドは、web-service を nginx:1.20.0 イメージを使用するように更新しようとします。実際のシナリオでは、これはバグのある新しいバージョンかもしれません。
ここで、この更新に問題があることが判明し、前のバージョン(デフォルトの nginx イメージを使用していたもの)にロールバックしたいとしましょう。docker service rollback コマンドを使用することができます。
docker service rollback web-service
このコマンドは、Docker Swarm に web-service を前の設定に戻すよう指示します。Docker Swarm は、新しいイメージを実行しているタスクを停止し、前のイメージバージョンを使用するタスクを開始します。
サービスがロールバックされていることを示す出力が表示されるはずです。
ロールバックが成功したことを確認するには、再度サービスを調べることができます。
docker service inspect web-service
出力の Image フィールドを見てください。最初に最新のデフォルトイメージを取得したと仮定すると、ここには元の nginx イメージ(:1.20.0 タグなし)が表示されるはずです。
また、サービスのタスクを確認して、古いイメージを実行しているコンテナを確認することもできます。
docker service ps web-service
タスクは現在、元のイメージを実行しているはずです。
まとめ
この実験では、docker service update コマンドを使用して Docker サービスを管理する方法を学びました。まず、alpine イメージと基本的な echo コマンドを使用して簡単なサービスを作成しました。
その後、重要なサービス更新操作を探索しました。レプリカの数を変更することでサービスをスケーリングし、ダウンタイムなしでサービスタスクを更新するためのローリングリスタートを実行し、サービスを外部に公開するための公開ポートの追加または削除方法を学びました。最後に、サービスを前のバージョンにロールバックする練習を行い、更新に問題が生じた場合に変更を元に戻す方法を実証しました。これらのステップを通じて、Docker サービスのライフサイクルと設定の管理に関する実践的な経験を得ることができました。



