Docker Stack はマルチサービス クラスターをデプロイします

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 スタック サービス スタック内のサービスを一覧表示する

おすすめ

転載: blog.csdn.net/qq_36306519/article/details/130877724