Docker Quickstartを超意訳する Part 4

Swarmでのデプロイ

Part 3ではKubernetesにアプリをデプロイした.
Part 4では同じアプリをSwarmにデプロイしてみる.
正直Kubernetesのほうが便利だし内容もほとんど被っているので飛ばして良かったかもしれない…


Get Started, Part 4: Deploying to Swarm

https://docs.docker.com/get-started/part4/

もくじ

  • Prerequisites
  • Introduction
  • Describing Apps Using Stack Files
  • Deploying and Checking Your Application
  • Conclusion

Prerequisites

https://docs.docker.com/get-started/part4/#prerequisites

  • Part 2でのアプリのコンテナ化ができていること.
  • Docker Desktop上でSwarmが動作していること
    • docker system infoで確認できる. Swarm: activeとなっていればOK.
    • 動作していない場合はdocker swarm initで起動する.
# Dockerのシステム情報を表示
# 長いのでSwarmを含む行を抜き出し
$ docker system info | grep Swarm
 Swarm: active

Introduction

https://docs.docker.com/get-started/part4/#introduction
これまでのパートではアプリを単一のコンテナで起動する方法とKubernetes上にデプロイする方法を学んできたが, このパートではDocker Swarmでアプリを管理してみる.
SwarmKubernetesと同様にコンテナアプリのスケーリング, ネットワーク, セキュリティ, メンテナンスのための, コンテナ自体に最初から入っている機能よりも強力な様々なツールを提供する.

Part 2で作成したコンテナアプリがSwarm上で動作することを検証するために, 今回は本番環境のSwarmクラスタではなくDocker Desktopでセットアップした開発マシンのSwarmを使用する.
Docker Desktopで構築したSwarm環境は本番環境のクラスタで動作するものと同じ機能を持ち, 開発マシンから容易にアクセスできるという利点がある.
[追加]Swarm(Docker社製)とKubernetes(Google社製)はどちらもコンテナを管理(オーケストレーション)するシステムであり, 正直Kubernetesのほうが強力だと思う… 自分で1からセットアップする場合の触りやすさではまだSwarmに分がある?

Describing Apps Using Stack Files

https://docs.docker.com/get-started/part4/#describing-apps-using-stack-files
SwarmではPart 2のようにコンテナを1つずつ作成することはせず, Swarmが自動で管理するネットワーク機能を付与されたスケーラブルな複数のコンテナで構成されるserviceという単位で運用される.
また, 全てのSwarmオブジェクトはStackファイルと呼ばれるマニフェストファイルで定義される.
このファイルにはSwarmアプリを構成するコンポーネントと設定の情報が記述されていて, Swarm環境でのアプリの作成/削除に使用される.
[追記]ここらへんの原文はほとんどPart 3と変わらない… Kubernetesと機能が被っていることがよくわかる.

1: 掲示板アプリを動かすための簡単なStackファイルをつくってみる.
任意の場所にbb-stack.yamlというファイルを以下の内容で作成する.

version: '3.7'    

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

このSwarmYAMLファイルでは1つのオブジェクトを定義している:
serviceは中身が同じでスケーリングが可能な複数のコンテナを定義する.
今回はコンテナ数が1つで(デフォルト値), そのコンテナはPart 2で作成したimage(bulletinboard:1.0)を元に起動することが記述されており, さらにホスト(開発マシン)の8000番ポートとコンテナの8080番ポートを通信させるよう設定している.

KubernetesServiceSwarmserviceは違うことに注意!
serviceという同じ名前ではあるが, 2つのオーケストレーターではこれらはまったく違うものとして扱われる.
Swarmではコンテナの起動/管理設定とネットワーク設定を同じ1つのserviceで定義するが,
KubernetesではこれらはDeploymentServiceという2つのコンポーネントで定義する.
[追加]混同を避けるため, この意訳ではSwarmのものはservice(小文字)と表記する.

Deploying and Checking Your Application

https://docs.docker.com/get-started/part4/#deploying-and-checking-your-application
1: アプリをSwarmにデプロイする.

# bb-stack.yamlで定義されたStackにdemoという名前をつけてデプロイ
$ docker stack deploy -c bb-stack.yaml demo
Creating network demo_default
Creating service demo_bb-app

また, このときservice以外にStack内で使用するデフォルトのnetworkが作成される.

2: serviceの一覧を表示して動作を確認する.

# serviceの一覧を表示
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
po8srxqtzf13        demo_bb-app         replicated          1/1                 bulletinboard:1.0   *:8000->8080/tcp

bb-stack.yamlserviceで定義したコンテナが1台起動しており, 開発マシンの8000番ポートがコンテナの8080番ポートに転送されていることがわかる.

3: 開発マシンのブラウザで http://localhost:8000/ を開く.

Part 2でコンテナを単体で動かしたときと同じ画面が表示される.

4: 動作確認ができたら, アプリを削除する.

# Stack(demo)を削除
$ docker stack rm demo

Conclusion

https://docs.docker.com/get-started/part4/#conclusion
このパートでは, Docker Desktopを用いて開発マシン上のSwarmに掲示板アプリをデプロイした.
この程度ではまだSwarmを使いこなしているとは言えないが, 最初のステップは既にクリアしている.
環境はすでに開発マシンに構築できているので, 同じ手順でSwarmの機能をさらに活用すればアプリに他のコンポーネントを追加することもできる.

また, このパートではアプリのデプロイに加えてStackファイルでのアプリ定義も行った.
アプリを動作させるために必要なすべての情報がシンプルなファイルに記述されているため, バージョンコントロール(Gitなど)で管理したり, 他の開発者と簡単に共有することができる.
また, Stackファイルがあればアプリを異なるクラスタに配置することも簡単に行うことができる(例: テスト環境と本番環境を分ける場合など).
[追加]まとめの文章もPart 3とほとんど一緒. 仕事でもほとんど使わないし正直飛ばしたほうがよかったかも…