技術備忘記

日々調べたこととかとりとめなく

MacにDocker Swarmクラスタを構築 ①

Docker Swarm

最近Dockerを本番環境(オンプレミス)への導入を検討しています。となると、オーケストレーションどうしようかという話になると思いますが、 選択肢がいろいろあってどうしようかなーと思っていました。

  • Kubernetes
  • Docker Swarm
  • Mesos
  • Nomad

Nomad がだいぶ良さそうでしたが、いかんせん日本語の情報、導入事例などが少なかったので、まず今回はとりあえずはお手軽そうな Docker Swarm を候補として触ってみました。尚、Docker Swarmの特徴は以下です。

構築

MacなのでDocker-machineを使います。 Docker for Mac/Windows をお使いの方は適宜読み解いて下さい。 (執筆時点ではプライベートベータなので、ほぼいらっしゃらないとは思いますが・・)

検証バージョン

以下の通りです。

$ docker version
Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.6
 Git commit:   20f81dd
 Built:        Sat Mar 12 04:08:57 UTC 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.11.0-rc3
 API version:  1.23
 Go version:   go1.5.3
 Git commit:   eabf97a
 Built:        Fri Apr  1 23:33:49 2016
 OS/Arch:      linux/amd64

$ docker-machine version
docker-machine version 0.6.0, build e27fb87

$ docker-swarm --version
docker-swarm version 1.1.3 (HEAD)

Swarm Discovery

公式ドキュメントにもあるとおり、Swarmクラスタの構築にはService DiscoveryとしてのKVSが必要となります。 etcdでもconsulでも何でも良かったのですが、Zookeeperの環境が手元にあったので、今回はZookeeperでやってみます。

Zookeeperのコンテナを起動します。(もちろんコンテナである必要は特にありません)

$eval "$(docker-machine env zk-host)"
$docker run -d -p 2181:2181 -p 2888:2888  -p 3888:3888 wurstmeister/zookeeper

docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                                                            NAMES
d58f1a1b5b70        wurstmeister/zookeeper   "/bin/sh -c '/usr/sbi"   About an hour ago   Up About an hour    0.0.0.0:2181->2181/tcp, 0.0.0.0:2888->2888/tcp, 22/tcp, 0.0.0.0:3888->3888/tcp   furious_mahavira

$ docker-machine ls
docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM                    DOCKER        ERRORS
zk-host         *        virtualbox   Running   tcp://192.168.99.108:2376                            v1.11.0-rc3 

Docker swarm manager用のホストを作成

さきほど起動したZookeeperホストを -swarm-discovery zk:// と指定します。 その他 --swarm などswarm関連のオプションを指定します。

$ docker-machine create --driver virtualbox --swarm --swarm-master --swarm-discovery zk://192.168.99.108:2181 swarm-manager

$ docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM                    DOCKER        ERRORS
zk-host         *        virtualbox   Running   tcp://192.168.99.108:2376                            v1.11.0-rc3   
swarm-manager   -        virtualbox   Running   tcp://192.168.99.109:2376   swarm-manager (master)   v1.11.0-rc3 

Docker swarm node用のホストを作成

managerを起動したコマンドから --swarm-masterだけを取り除いてnode用のホストを立ち上げます。 今回は2つ立ち上げてみます。

$ docker-machine create --driver virtualbox --engine-insecure-registry 10.6.215.231:5000 --swarm --swarm-discovery zk://192.168.99.108:2181 swarm-node01

$ docker-machine create --driver virtualbox --engine-insecure-registry 10.6.215.231:5000 --swarm --swarm-discovery zk://192.168.99.108:2181 swarm-node02

確認

swarmの情報を得る為にいつものeval..に --swarmを付けます

eval "$(docker-machine env --swarm swarm-manager)"

こんな感じでクラスタが立ち上がっています。

$ docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM                    DOCKER        ERRORS
zk-host         *        virtualbox   Running   tcp://192.168.99.108:2376                            v1.11.0-rc3   
swarm-manager   -        virtualbox   Running   tcp://192.168.99.109:2376   swarm-manager (master)   v1.11.0-rc3   
swarm-node01    -        virtualbox   Running   tcp://192.168.99.110:2376   swarm-manager            v1.11.0-rc3   
swarm-node02    -        virtualbox   Running   tcp://192.168.99.111:2376   swarm-manager            v1.11.0-rc3  

$ docker info
Containers: 3
 Running: 1
 Paused: 0
 Stopped: 2
Images: 13
Server Version: 1.11.0-rc3
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 44
 Dirperm1 Supported: true
Logging Driver: json-file
Plugins: 
 Volume: local
 Network: bridge null host
Kernel Version: 4.1.19-boot2docker
Operating System: Boot2Docker 1.11.0-rc3 (TCL 7.0); HEAD : fed36ed - Sat Apr  2 00:03:40 UTC 2016
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 996.1 MiB
Name: zk-host
ID: PXK5:IAL6:DVXA:33ZH:CTMP:GVES:HJUG:KW5U:PZOX:PXWV:3HJC:55MY
Debug mode (server): true
 File Descriptors: 15
 Goroutines: 36
 System Time: 2016-04-18T06:39:56.693979855Z
 EventsListeners: 0
 Init SHA1: 
 Init Path: 
 Docker Root Dir: /mnt/sda1/var/lib/docker
Labels:
 provider=virtualbox

ちなみに、managerが1nodeして動いてしまっていたり、そもそもレプリケーション出来てなかったりと 本番環境の参考とするには色々まずいのでご注意下さい。

せっかくなので、zk-webを使ってZooKeeperの中身も少し覗いてみました。 swarmのノード情報が書き込まれています。 f:id:junchang1031:20160418165133p:plain f:id:junchang1031:20160418165145p:plain

Blue/Green Deployment

長くなりそうなので今回はこの辺で。 次回はこの環境下での Blue/Green Deployment実現方法を投稿しようと思います。