Swarm へのデプロイ

前提条件

  • 概要 にて説明している Docker Desktop をダウンロードしインストールしていること。
  • クイックスタート 2 部 においてアプリケーションのコンテナー化を一通り学んでいること。
  • Docker Desktop 上において Swarm が有効になっていること。 これはdocker system infoを入力し、メッセージ内にSwarm: activeがあることで確認(多少スクロールして見ることが必要)。

    Swarm が起動していない場合は、シェルプロンプトから単純にdocker swarm initと入力して起動します。

はじめに

ここまでにはアプリケーションの個々のコンポーネントが、スタンドアロンなコンテナーとして実行され、それを Kubernetes を用いてデプロイするところまでを見てきました。 今度は Docker Swarm によってどのように管理していくのかを見ていきます。 Swarm はコンテナー化されたアプリケーションに対して、そのコンテナーの能力を超えて、スケール、ネットワーク、セキュリティ、保守を行うツールを数多く提供します。

Swarm 上においてコンテナー化アプリケーションが適正に動作していることを確認するために、まずは開発マシン上にて Swarm 環境化の Docker Desktop を用いてアプリケーションデプロイを行います。 完全な Swarm クラスターによる本番環境での稼動は、その次に扱っていくことにします。 Docker Desktop によって構築されている Swarm 環境は 完全な機能 を有しています。 つまりそこには Swarm の全機能が含まれていて、実際のクラスター上でアプリを動作させることができ、開発マシンから容易にアクセスすることができます。

スタックファイルを用いたアプリ記述

本チュートリアルの以前の手順とは違って、Swarm では個別にコンテナーを生成することはしません。 そのかわり、Swarm 全体を サービス としてスケジューリングします。 これはスケール変更可能なコンテナーのグループであり、さらに Swarm によって自動的に管理されるネットワーク機能が付け加えられています。 そして Swarm によるオブジェクトは、すべて スタックファイル(stack file)と呼ばれるファイル内に記述されます。 この YAML ファイルに Swarm アプリのコンポーネントや設定をすべて記述します。 こうして Swarm 環境内でのアプリケーションの生成と削除が容易にできるようになります。

では掲示板アプリを起動し管理するための単純なスタックファイルを記述します。 bb-stack.yamlというファイルに以下の内容を記述してください。

version: '3.7'

services:
  bb-app:
    image: bulletinboard:1.0
    ports:
      - "8000:8080"

この Swarm YAML ファイルにはserviceという1つのオブジェクトがあるのみです。 これはスケール変更可能な同一コンテナーのグループを表わします。 今の場合、(デフォルトにより)ただ1つのコンテナーを生成します。 ベースとするイメージは、クイックスタートチュートリアルの 2 部 の手順にて利用したbulletinboard:1.0です。 そして開発マシン上のポート 8000 にきたトラフィックを、掲示板アプリコンテナー内のポート 8080 にフォワードするように指定しています。

Kubernetes サービスと Swarm サービスはまったく違います。 この 2 つのオーケストレーターはサービスという同じ名前を持っていますが、サービスの意味するところがまったく違います。 Swarm の場合はスケジューリング機能とネットワーク機能が 両方ともに 提供されます。 またコンテナーの生成と、これに向けてトラフィック送信を行うツールが提供されます。 Kubernetes の場合、スケジューリング機能とネットワーク機能は別々に扱われています。 デプロイ機能(あるいは他の制御機能)が、コンテナーのスケジューリングをポッド(pod)として扱います。 また サービス機能 というものが、そのポッドに対してのネットワーク機能付与のみを行います。

アプリケーションのデプロイと確認

  1. Swarm にアプリケーションをデプロイします。

    $ docker stack deploy -c bb-stack.yaml demo
    

    すべて正常であればエラーはなく、スタックオブジェクトがすべて生成できたことを表示します。

    Creating network demo_default
    Creating service demo_bb-app
    

    サービスが生成されると同時に、Swarm はデフォルトで Docker ネットワークを生成し、スタックの一部分としてデプロイされたコンテナーを分離し実行します。

  2. サービス一覧を表示して、正常にすべてが動作していることを確認します。

    $ docker service ls
    

    すべて正常に動作していれば、サービスからレプリカ 1/1 が生成されたことが表示されます。

    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    il7elwunymbs        demo_bb-app         replicated          1/1                 bulletinboard:1.0   *:8000->8080/tcp
    

    これはつまり、サービスの一部分として生成が指示された 1/1 のコンテナーが起動していることが示されています。 また開発マシンの 8000 ポートが、掲示板アプリの 8080 ポートにフォワード設定されていることもわかります。

  3. ブラウザーを開いてlocalhost:30001にアクセスし掲示板アプリを開きます。 ここでも掲示板アプリを見ることができます。 これはクイックスタートチュートリアルの 2 部において、スタンドアロンなコンテナー上に起動させたアプリと同一のものです。

  4. 結果を確認できたらアプリケーションを削除します。

    $ docker stack rm demo
    

まとめ

開発マシン上にて Swarm の全機能を実現した環境に、Docker Desktop を用いてアプリケーションをデプロイすることに成功しました。 Swarm を使った作業には、まだまだ多くのことがあります。 これは入り口に入ったばかりということです。 アプリケーションに別のコンポーネントを加えてみれば、Swarm の優れた機能や性能が見えてきます。 それをまさに開発マシン上で確認できます。

Swarm へのデプロイに加えて、アプリケーションをスタックファイルとして記述しました。 この単純なテキストファイルが、アプリケーションを生成して実行するために必要なものをすべて含んでいるわけです。 このファイルをバージョン管理システムにアップして、仲間と共有してみましょう。 そうすればこのアプリケーションを別の担当者(おそらく開発担当者から受け渡す先として、テスト環境担当者や本番環境担当者)に容易に配布できることになります。

Swarm と CLI リファレンス

本文において新たに用いた Swarm オブジェクトについての詳細は、以下を参照してください。

swarm, swarm services, stacks