1. Docker スタックの概要
スタンドアロン モードでは、Docker Compose を使用して複数のサービスを調整できますが、Docker Swarm は単一サービスの単純なデプロイメントのみを実装できます。この記事の主役は Docker スタックです。Docker スタックを通じて、既存の docker-compose.yml 構成ファイルを少し変更するだけで、Docker クラスター環境でのマルチサービス オーケストレーションを完了できます。
2. Docker Stackクラスタ構築事例
次のサービスを含む投票 APP を展開します。
- 5 つのアプリケーション サービス: 投票、Redis、ワーカー、DB、結果
- ツールサービス: ポーターおよびビジュアライザー
まず、Docker Compose v3 構文を使用して docker-compose.yml ファイルを作成します。
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
サービスをマネージャー ノードにデプロイします。
[root@swarm-manager example-voting-app]# docker stack deploy example --compose-file=docker-compose.yml
Creating network example_frontend
Creating network example_default
Creating network example_backend
Creating service example_result
Creating service example_worker
Creating service example_visualizer
Creating service example_portainer
Creating service example_redis
Creating service example_db
Creating service example_vote
1234567891011
導入が完了しました:
[root@swarm-manager example-voting-app]# docker stack services example
ID NAME MODE REPLICAS IMAGE PORTS
cdmrhfag3zje example_vote replicated 2/2 dockersamples/examplevotingapp_vote:before *:5000->80/tcp
csjcltpwvpzs example_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
ihys1qvpz4i5 example_worker replicated 1/1 dockersamples/examplevotingapp_worker:latest
l0ufhl8n0ozg example_portainer replicated 1/1 portainer/portainer:latest *:9000->9000/tcp
m2icguw00ls9 example_db replicated 1/1 postgres:9.4
pu2h7rqzpaa0 example_redis replicated 2/2 redis:alpine *:30001->6379/tcp
tom14od7paf1 example_result replicated 1/1 dockersamples/examplevotingapp_result:before *:5001->80/tcp
123456789
[root@swarm-manager example-voting-app]# docker stack ps example
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
loj1h2dk9l1s example_vote.1 dockersamples/examplevotingapp_vote:before swarm-worker3 Running Running 2 minutes ago
kp4n980ldv49 example_db.1 postgres:9.4 swarm-manager Running Running 2 minutes ago
0hf6d80nwwyf example_worker.1 dockersamples/examplevotingapp_worker:latest swarm-manager Running Running 2 minutes ago
rnjnwhl86ro6 example_redis.1 redis:alpine swarm-worker1 Running Running 2 minutes ago
1376pp1lvrly example_portainer.1 portainer/portainer:latest swarm-manager Running Running 2 minutes ago
xj9a9iu9g2s8 example_worker.1 dockersamples/examplevotingapp_worker:latest swarm-manager Shutdown Failed 2 minutes ago "task: non-zero exit (1)"
g5ts3oiibrhn example_visualizer.1 dockersamples/visualizer:stable swarm-manager Running Running 3 minutes ago
kgcttt1xigu2 example_worker.1 dockersamples/examplevotingapp_worker:latest swarm-manager Shutdown Failed 3 minutes ago "task: non-zero exit (1)"
jpqdinh0st7b \_ example_worker.1 dockersamples/examplevotingapp_worker:latest swarm-manager Shutdown Failed 3 minutes ago "task: non-zero exit (1)"
ff9bq1vcgbz9 example_result.1 dockersamples/examplevotingapp_result:before swarm-manager Running Running 2 minutes ago
q27wp9nna0yc example_vote.2 dockersamples/examplevotingapp_vote:before swarm-worker1 Running Running 2 minutes ago
s6hvxlgdz77v example_redis.2 redis:alpine swarm-worker2 Running Running 2 minutes ago
1234567891011121314
ブラウザアクセス:
vote ip:5000
result ip:5001
portainer ip:9000
visualizer ip:8080
1234
3. Docker Stack と Docker Compose の違い
- Docker スタックは「build」コマンドを無視するため、新しいイメージをビルドするために stack コマンドを使用できません。イメージを事前にビルドする必要があります。したがって、docker-compose は開発シナリオにより適しています。
- Docker Compose は、内部で Docker API 仕様を使用してコンテナーを操作する Python プロジェクトです。したがって、Docker で使用するには、コンピューターに Docker-compose をインストールする必要があります。
- Docker Stack 機能は Docker Engine に含まれています。これを使用するために追加のパッケージをインストールする必要はありません。Docker スタックは swarm モードの一部にすぎません。
- Docker スタックは、バージョン 2 に基づいて作成された docker-compose.yml をサポートしていません。これは、バージョンが少なくとも 3 であることを意味します。ただし、Docker Compose はバージョン 2 および 3 のファイルを引き続き処理できます。
- Docker スタックは docker compose のすべての作業を行っているため、docker スタックが優勢になります。同時に、ほとんどのユーザーにとって、Docker スタックの使用への切り替えは難しくなく、多くのオーバーヘッドも必要としません。Docker を初めて使用する場合、または新しいプロジェクトのテクノロジを選択している場合は、docker stack を使用してください。
这个命令就是docker stack,它看起来与docker-compose完全相同。 这是一个他们的用法比较:
$ docker-compose -f docker-compose up
$ docker stack deploy -c docker-compose.yml somestackname
4. Docker Stackの共通コマンド
注文 | 説明する |
---|---|
ドッカースタックデプロイ | 新しいスタックをデプロイするか、既存のスタックを更新します |
ドッカースタックls | 既存のスタックをリストする |
ドッカースタックPS | スタック内のタスクをリストする |
ドッカースタックrm | 1 つ以上のスタックを削除する |
Docker スタック サービス | スタック内のサービスを一覧表示する |