はじめに
この実験では、Docker Compose プロジェクトで定義されたサービスをスケーリングするためにdocker compose alpha scaleコマンドを使用する方法を学びます。まず、Docker Compose のインストール、基本的な Web アプリケーションの作成、Dockerfile と依存関係の定義を含むシンプルな Docker Compose プロジェクトの準備から始めます。
プロジェクトのセットアップ後、docker compose alpha scaleを使用して単一サービスをスケーリングする方法、複数のサービスを同時にスケーリングする方法、依存関係を起動せずにサービスをスケーリングする方法について探求します。この実践的な経験を通じて、サービスの実行インスタンス数を管理するためのscaleコマンドの柔軟性と強力さを実感できるでしょう。
シンプルな Docker Compose プロジェクトの準備
このステップでは、シンプルな Docker Compose プロジェクトを準備します。LabEx 環境には Docker Compose がプリインストールされていないため、まずインストールを行います。その後、簡単な Web アプリケーションと、それを定義・実行するための Docker Compose ファイルを作成します。
まず、Docker Compose をインストールしましょう。Docker Compose バイナリをダウンロードし、実行可能にします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
次に、Docker Compose のバージョンを確認してインストールを検証します。
docker-compose --version
出力にインストールされた Docker Compose のバージョンが表示されるはずです。
続いて、シンプルな Web アプリケーションを作成します。基本的な Python Flask アプリケーションを使用します。プロジェクト用のディレクトリを作成し、移動します。
mkdir my-web-app
cd my-web-app
my-web-appディレクトリ内に、以下の内容でapp.pyファイルを作成します:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker Compose!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
これは「Hello, Docker Compose!」を返すシンプルな Flask アプリケーションです。
次に、Flask アプリケーション用の Docker イメージをビルドするためのDockerfileが必要です。my-web-appディレクトリ内に以下の内容でDockerfileを作成します:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
この Dockerfile は、Python 3.9 のスリムイメージを使用し、作業ディレクトリを設定し、requirements.txtから依存関係をコピーしてインストールし、アプリケーションコードをコピーし、ポート 5000 を公開し、アプリケーションを実行するコマンドを指定します。
Flask の依存関係用にrequirements.txtファイルも必要です。my-web-appディレクトリ内に以下の内容でrequirements.txtを作成します:
Flask==2.2.2
最後に、サービスを定義するdocker-compose.ymlファイルを作成します。my-web-appディレクトリ内に以下の内容でdocker-compose.ymlを作成します:
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
このdocker-compose.ymlファイルはwebという名前のサービスを定義しています。カレントディレクトリ (.) のDockerfileを使用してイメージをビルドし、ホストのポート 5000 をコンテナのポート 5000 にマッピングするように指示します。
では、Docker Compose を使用してサービスをビルド・実行しましょう。~/project/my-web-appディレクトリにいることを確認してください。
docker-compose up -d
このコマンドは、イメージをビルドし(まだビルドされていない場合)、webサービスのコンテナを作成し、デタッチドモード (-d) で起動します。
docker psコマンドを使用してコンテナが実行中か確認できます。
docker ps
my-web-app-web-1サービスのコンテナが実行中であることが表示されるはずです。
アプリケーションが動作していることを確認するには、curlを使用してアクセスします。
curl http://localhost:5000
「Hello, Docker Compose!」という出力が表示されるはずです。
docker compose alpha scale を使用したサービスのスケーリング
このステップでは、docker compose alpha scale コマンドを使用してサービスをスケーリングする方法を学びます。サービスのスケーリングとは、そのサービスの実行インスタンス(コンテナ)の数を増減させることを意味します。これは負荷増加への対応や高可用性を実現するのに役立ちます。
docker compose alpha scale コマンドを使用すると、特定のサービスの希望するレプリカ数を設定できます。alpha サブコマンドは、これが Docker Compose の新しい機能であることを示しています。
docker-compose.yml ファイルがある ~/project/my-web-app ディレクトリにいることを確認してください。
現在、web サービスのインスタンスが 1 つ実行されています。実行中のコンテナをリスト表示し、サービス名でフィルタリングすることで確認できます。
docker ps --filter "name=my-web-app-web"
1 つのコンテナのみが表示されるはずです。
では、web サービスを 3 インスタンスにスケーリングしましょう。docker compose alpha scale コマンドの後にサービス名と希望するレプリカ数を指定します。
docker compose alpha scale web=3
このコマンドにより、web サービスの新しいコンテナが 2 つ起動され、インスタンスの総数が 3 つになります。
コマンド実行後、再度実行中のコンテナを確認してスケーリングされたインスタンスを確認できます。
docker ps --filter "name=my-web-app-web"
今度は 3 つのコンテナが表示されるはずです(例:my-web-app-web-1、my-web-app-web-2、my-web-app-web-3)。
docker compose alpha scale コマンドは、docker-compose.yml ファイルを変更したり docker compose up を再度実行したりすることなく、サービスレプリカ数を動的に調整する便利な方法です。
サービスをスケールダウンするには、同じコマンドに小さい数を指定します。例えば、1 インスタンスに戻すには:
docker compose alpha scale web=1
これにより余分なコンテナが停止・削除され、1 つのインスタンスのみが実行状態になります。
次のステップのために、再度 3 インスタンスにスケーリングしましょう。
docker compose alpha scale web=3
複数サービスを同時にスケーリング
このステップでは、docker compose alpha scale コマンドを使用して複数のサービスを同時にスケーリングする方法を学びます。これは、負荷増加に対応したりバランスの取れたアーキテクチャを維持したりするために、アプリケーション内の複数サービスを同時にスケーリングする必要がある場合に便利です。
これを実証するために、docker-compose.yml ファイルに別のシンプルなサービスを追加しましょう。静的コンテンツを提供するシンプルな Nginx サービスを作成します。
まず、Nginx の静的コンテンツ用ディレクトリを作成します。
mkdir static
static ディレクトリ内に、以下の内容で index.html というシンプルな HTML ファイルを作成します:
<!doctype html>
<html>
<head>
<title>Static Content</title>
</head>
<body>
<h1>Hello from Nginx!</h1>
</body>
</html>
次に、~/project/my-web-app ディレクトリ内の docker-compose.yml ファイルを更新して Nginx サービスを含めます。nano を使用して docker-compose.yml ファイルを開きます。
nano docker-compose.yml
web サービスの下に以下のサービス定義を追加します:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./static:/usr/share/nginx/html
更新後の docker-compose.yml ファイルは以下のようになります:
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./static:/usr/share/nginx/html
これにより、nginx:latest イメージを使用し、ホストのポート 80 をコンテナのポート 80 にマッピングし、./static ディレクトリを Nginx のデフォルト Web ルート (/usr/share/nginx/html) にマウントする nginx サービスが追加されます。
docker-compose.yml ファイルを保存し、nano を終了します(Ctrl+X、Y、Enter)。
では、新しいサービスを起動しましょう。docker-compose.yml ファイルを変更したので、再度 docker compose up を実行する必要があります。-d フラグはコンテナをデタッチドモードで実行します。
docker compose up -d
Docker Compose は nginx サービスを作成して起動します。web サービスは前のステップからすでに実行されているはずです。
docker ps を使用して両方のサービスが実行中であることを確認できます。
docker ps
my-web-app-web-1、my-web-app-web-2、my-web-app-web-3 と my-web-app-nginx-1 のコンテナが表示されるはずです。
では、web サービスを 5 インスタンス、nginx サービスを 2 インスタンスに同時にスケーリングしましょう。docker compose alpha scale コマンドでサービスと希望するレプリカ数を列挙することでこれを行えます。
docker compose alpha scale web=5 nginx=2
このコマンドは web サービスを 5 インスタンス、nginx サービスを 2 インスタンスにスケーリングします。
コマンド実行後、再度実行中のコンテナを確認します。
docker ps
web サービス用の 5 コンテナと nginx サービス用の 2 コンテナが表示されるはずです。
これにより、単一の docker compose alpha scale コマンドで複数サービスをスケーリングできることが実証され、アプリケーションコンポーネントのスケーリング管理が効率的に行えることがわかります。
依存サービスの起動なしでサービスをスケーリング
このステップでは、依存関係を起動せずに docker compose alpha scale を使用して特定のサービスをスケーリングする方法を探ります。デフォルトでは、サービスをスケーリングする際、Docker Compose はその依存関係も起動したり実行状態を確認したりする場合があります。しかし、他のサービスに影響を与えずに単一のサービスのみをスケーリングしたいシナリオも存在します。
これを説明するために、web サービスに依存関係を追加しましょう。この例ではウェブアプリケーションにデータベースロジックを実装しませんが、シンプルなデータベースサービスを追加して依存関係の概念を実演します。
~/project/my-web-app ディレクトリ内の docker-compose.yml ファイルを nano で開きます。
nano docker-compose.yml
データベース(例:シンプルな postgres イメージ)の新しいサービス定義を追加し、web サービスに depends_on セクションを追加します。
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./static:/usr/share/nginx/html
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
更新された docker-compose.yml ファイルには、postgres:latest イメージを使用する db サービスが含まれ、web サービスには depends_on: - db 行が追加され、web サービスが db サービスに依存していることを示しています。
docker-compose.yml ファイルを保存し、nano を終了します(Ctrl+X、Y、Enter)。
では、更新された設定でサービスを起動しましょう。
docker compose up -d
Docker Compose は web サービスが依存しているため、db サービスも作成して起動します。
docker ps を使用してすべてのサービスが実行中であることを確認できます。
docker ps
web、nginx、db のコンテナが表示されるはずです。
ここで、db サービスを起動したり影響を与えたりせずに(すでに実行されていない場合)、web サービスのみを 4 インスタンスにスケーリングしたいとします。docker compose alpha scale コマンドはデフォルトで依存関係を考慮しますが、特定のサービスのみをスケーリングしたいこのシナリオでは、標準の docker compose alpha scale コマンドで十分です。depends_on 関係は主に docker compose up 使用時の起動順序に影響します。docker compose alpha scale を使用する場合、指定したサービスのインスタンス数の調整に焦点を当てます。
web サービスを 4 インスタンスにスケーリングしましょう。
docker compose alpha scale web=4
このコマンドは web サービスを 4 インスタンスにスケーリングします。db サービスが実行されていない場合、明示的に起動することはありませんが、前の docker compose up で起動されているため実行されたままになります。重要なポイントは、docker compose alpha scale は指定したサービスをスケーリングするように設計されており、依存関係がすでに実行されていない場合、それらの起動を必ずしもトリガーしないということです。
実行中の web サービスコンテナの数を確認します。
docker ps --filter "name=my-web-app-web"
web サービスの 4 つのコンテナが表示されるはずです。db サービスコンテナもまだ実行中である必要があります。
これは docker compose alpha scale がスケーリング対象のサービスに焦点を当てていることを実証しています。
最後に、すべてのサービスを停止しましょう。
docker compose down
このコマンドは、このプロジェクトのために Docker Compose が作成したすべてのコンテナ、ネットワーク、ボリュームを停止して削除します。
まとめ
この実験では、シンプルな Docker Compose プロジェクトを準備する方法を学びました。LabEx 環境に Docker Compose をインストールし、インストールを確認した後、基本的な Python Flask ウェブアプリケーションを作成しました。また、アプリケーション用の Docker イメージをビルドするためのDockerfileと、アプリケーションの依存関係をリストするrequirements.txtファイルを作成しました。この初期設定は、Docker Compose の機能、特に後続のステップで焦点を当てるサービスのスケーリングを探求するための基礎を提供します。



