Docker Swarmを使い始めた
Dockerはローカルでの開発でよく使っている。ただデプロイとなると、Herokuを使ったり、dokkuを使ったり、はたまたコンテナ技術無しにサーバで直にアプリケーションを実行したりしている。
せっかくDockerにSwarmという便利な機能があるのだから、使おうと思った。
学ぶのには以下を参考にした。
https://docs.docker.com/get-started/
Dockerが何たるか、からDocker SwarmやDocker Deployまで学べるので、丁度良かった。Part3辺りから知らなかったので、以下に知見を記す。
まずはデプロイしたいサービスのDocker Imageと、docker-compose.ymlを書く。
Docker ImageはDockerHubだったり自前のレジストリサーバに上げておく。
docker-compose.ymlにはサービスのとこにdeployというキーを書き、そこにswarmで展開した際のコンテナの総数だったり、リソースの制限だったりを書く。
docker-compose.yml
...
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
Docker Swarm clusterをローカルで試すために、VirtualBoxを使用する。
pacman -S virtualbox virtualbox-host-dkms linux-headers
echo vboxdrv >> /etc/modules-load.d/vbox.conf
再起動すると、VirutalBoxが使えるようになる。
docker-machineを使って、tinylinux(docker入り)のVMを作成、管理できるようにする。
pacman -S docker-machine
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
swarm clusterを構築する
docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1's IP addr>"
# swarm managerの設定ができて、他のマシンをnodeに追加するコマンドが表示される
docker-machine ssh myvm2 "docker swarm join --token <token> <ip>:2377"
ローカルに環境変数を食わせて、dockerがmyvm1をイジれるようにする
eval $(docker-machine env myvm1)
docker stack deploy -c docker-compose.yml getstartedlab
これでVMのIP(どちらでも可)でブラウザからアクセスすると、自分が書いたアプリケーションがVMの中で動いているのを確認できる。感動!接続先のコンテナは接続する度に変わるが、その仕組み(順番だったりランダムだったり)は設定で変えられる。
運用
学内で運営しているRailsのサービス(サーバ2, 3台)を、Docker Swarmで管理する。たかだか2, 3台なのだが、現状は1台のみ、Apache+Passengerで動いていて、Infra as Codeになっていない→簡単に冗長な構成にできないので厳しい。
そこでDockerとDocker Swarmを導入することで、サクッとプロセス増やしたりできるようになるし、他のサーバやPaaSに移行したりできるワケ。もうDocker Imageはできたし、期を見てDocker Swarmやっていくぞ。