(Photo by:Tom Driggers)
Docker Swarmの紹介
Docker SwarmはDockerコンテナのクラスター管理ツールキットです。複数のDockerコンテナをクラスター化してアプリケーションとして提供する機能をAPIやCLIのコマンド経由で利用できます。
Docker 1.12 から Docker Swarm が本体に同梱されているためステーブル版Dockerをインストールすると最初からDocker Swarmを利用できます。
Docker Swarmのインストール
Ubuntu16.04にDockerを新しくインストールする所から始めます。もしも古いバージョンが入っている場合は削除します。
$ sudo apt-get remove docker docker-engine
Dockerが利用するパッケージをインストールします。
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
DockerオフィシャルのGPGキーを追加します。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
ステーブルリポジトリーをインストールします。$(lsb_release -cs)のサブコマンドには xenial が入ります。
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
パッケージインデックスの更新をした後、docker-ceをインストールします。
$ sudo apt-get update $ sudo apt-get install docker-ce
バージョンを見てインストールに成功したかを確認します。
$ docker --version Docker version 17.03.1-ce, build c6d412e
動作テスト用のhello-worldで正しく動作するかを確認します。Hello worldと表示されれば成功です。
$ sudo docker run hello-world
次にswarmコマンドが使える事をhelpで確認します。docker swarm COMMANDの形式でswarmを利用できます。
$ docker swarm help
Docker Swarmの使い方を簡単に説明
Ubuntu16.04を3台利用してDocker Swarmの使い方を簡単に説明します。それぞれのホスト名を以下のように変更しています。
- 192.168.7.130 :manager (マネージャー)
- 192.168.7.135 :node1 (ノード1)
- 192.168.7.136 :node2 (ノード2)
ホスト名の変更
前準備としてホスト名を変更するにはhostnamectl set-hostnameを利用します。
$ hostnamectl set-hostname manager
ホスト名を変更した後は/etc/hostsファイルに変更後のホスト名を追加します。
$ sudo vi /etc/hosts 127.0.0.1 localhost manager
新しいホスト名がdockerで使われるようにするためdockerを再起動します。
$ sudo service docker restart
上記手順をnode1とnode2でも行います。
マネージャーを作成
managerに接続しマネージャーとなるノードを作成します。成功するとマネージャーへの参加方法がtoken込みで表示されます。
$ sudo docker swarm init
ノードが作られマネージャーになっている事をdocker nodeかdocker infoコマンドで確認します。
$ sudo docker node ls $ sudo docker info
ノードの追加
node1とnode2をマネージャーに参加させます。node1とnode2にSSHで接続しdocker swarm joinコマンドを実行します。
パラメーターの–token以下にはdocker swarm init時に生成されたtokenを指定します。tokenの次の引数はマネージャーのIPとポート番号です。
$ sudo docker swarm join --token xxxxxxxx 192.168.7.130:2377
This node joined a swarm as a worker.と表示されれば成功です。
tokenを再表示するにはマネージャーで以下コマンドを実行します。
$ sudo docker swarm join-token worker
マネージャーでノード一覧を表示すると、ノードが3つ増えている事を確認できます。
$ sudo docker node ls
サービスとコンテナの追加
マネージャーにAlpine Linuxからdocker.comにpingを行うサービスを追加します。起動するインスタンス数は1つです。
$ sudo docker service create --replicas 1 --name helloworld alpine ping docker.com
起動しているサービス一覧にhelloworldが追加されている事を確認します。
$ sudo docker service ls $ sudo docker service inspect --pretty helloworld
サービスが動作している事を確認します。
$ sudo docker service ps helloworld
スケーリングの実施
helloworldを5つにスケールさせます。managerとnode1、node2に分散されてスケールされます。
$ sudo docker service scale helloworld=5
サービスのリストを表示すると5つに増えています。
$ sudo docker service ps helloworld
マネージャーとノードにそれぞれhelloworldのコンテナが追加されているのを確認します。無事にサービスのスケールが出来ています。
$ sudo docker ps
スケールを小さく・大きくする場合には数を変更するだけです。指定した数に合わせて参加ノードに自動で配分されます。
$ sudo docker service scale helloworld=3
Docker Swarmの運用上の注意点
(Photo by:ecoev)
Raftアルゴリズムによるノード管理
Docker Swarmのノード分散・再分配・フォールトトレラント(機能縮小しての継続)はRaft分散合意アルゴリズムを採用しています。そのためDocker Swarmを本運用する場合はRaftのコンセプトを理解する事が求められています。
マネージャー数について
Docker Swarmは過半数のマネージャーを 失うとタスクを評価できなくなり自動的に回復できなくなります。そのため分散合意アルゴリズムの性質に合わせ、マネージャーの数には過半数を維持し易い奇数を指定する事が推奨されます。
強制でタスクの再分配を行う
Docker Swarmで利用可能ノードに対して強制的にタスクの再分配を行う場合はforceオプションを追加します。ローリングアップデートが適用されます。
$ docker service update --force
強制的なノードの削除
ノードの応答がない場合や危険な状態にある場合等、ノードを強制的に削除したい場合はforceオプションを追加して削除します。
$ docker node rm --force node1
クラウドプラットフォームの対応状況
(Photo by:University of the Fraser Valley)
主要なクラウドプラットフォームでのDocker Swarmへの対応状況と同様のオーケストレーションツールのサポート状況です。
AWS
AWSのDockerコンテナ管理サービスとしてEC2 Container Service (ECS)があります。ECSはフルマネージドサービスであり、Docker Swarmとの連携機能は特にありません。
Microsoft Azure
Azure Container ServiceではDocker Swarm/Docker Compose、または Kubernetesを利用できます。
Docker Swarmを利用したAzure Container Serviceへの連携方法が紹介されています。
Google Cloud Platform
GCPのコンテナ管理サービスであるGoogle Container Engine(GCE)は Kubernetes で構築されています。GCE は Kubernetes と連携可能ですが、Docker Swarm はサポートされていません。
まとめ
Dockerコマンドから簡単にクラスタリングを作成でき、コンテナのスケーリングを実現できました。Dockerコンテナの普及に伴いDocker swarmのような構成管理ツールも合わせて充実しつつあります。
Docker swarmはDocker本体に同梱されていますので、外部ツールや自作スクリプトを組み合わせてクラスタリングの運用をされていた方はDocker swarmに乗り換えると楽が出来るかも知れません。
参考
https://www.docker.com/
https://github.com/docker/swarm
https://docs.docker.com/engine/swarm/
本ブログは、Git / Subversionのクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。
エンタープライズ向け Git / Subversion 導入や DevOps による開発の効率化を検討している法人様必見!
「tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。
1 Comment
[…] Docker Swarmのインストール方法と紹介(Ubuntu16.04版) […]