Docker Swarm を Windows 上に構築してみます。 https://docs.docker.com/get-started/part4/ にドキュメントがありました。私の家の Laptop は Windows Pro じゃないから VirtualBox 使うやつです。
Docker Machine を2台作成
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Stopped Unknown
myvm1 * virtualbox Running tcp://192.168.99.100:2376 v17.12.1-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.12.1-ce
Swarm の初期化と node の追加
myvm1 で swarm init
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr \$(ip a s eth1 | grep 'inet ' | awk '{print \$2}' | sed 's/\/.*//')"
Swarm initialized: current node (u6otahnn4p9q72p734vcmtskt) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4pwif80w4dgtdrb7zo2j6bq1v22cun6cn4ftt1fj99tx5nlhmh-dl0ikqtubkk2ejkx5tvh99ul0 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
myvm2 を swarm に worker として参加させる
$ docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-4pwif80w4dgtdrb7zo2j6bq1v22cun6cn4ftt1fj99tx5nlhmh-dl0ikqtubkk2ejkx5tvh99ul0 192.168.99.100:2377"
This node joined a swarm as a worker.
完成!!
$ docker-machine ssh myvm1 docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
u6otahnn4p9q72p734vcmtskt * myvm1 Ready Active Leader
su7h7svkmocwvrp55u3xygjd4 myvm2 Ready Active
SSH しなくても環境変数を設定すれば docker コマンドで確認できます(Windows だけど git-bash だから eval です)。
$ eval $(docker-machine env myvm1)
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
u6otahnn4p9q72p734vcmtskt * myvm1 Ready Active Leader
su7h7svkmocwvrp55u3xygjd4 myvm2 Ready Active
demo アプリを stack で deploy する
前回の stackdemo を stack で deploy してみます。
$ docker stack deploy --compose-file docker-compose.yml stackdemo
Ignoring unsupported options: build
Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis
できましたね。
$ docker stack ls
NAME SERVICES
stackdemo 2
$ docker stack ps stackdemo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
rlh00omfhh6g stackdemo_redis.1 redis:alpine myvm1 Running Running 32 seconds ago
4e07tj4g36u9 stackdemo_web.1 yteraoka/stackdemo:0.0.4 myvm2 Running Starting 28 seconds ago
どちらの node の 8000 番ポートにアクセスしても mesh routing によってアクセスできます。
$ curl -s http://192.168.99.100:8000/
Hello World! I have been seen 1 times.
version: 0.0.4
$ curl -s http://192.168.99.101:8000/
Hello World! I have been seen 2 times.
version: 0.0.4
Portainer を stack で deploy する
次に Portainer を stack で deploy してみます。https://github.com/portainer/portainer-compose にある docker-stack.yml
を使いますが、port
のところをちょっといじります。
$ git diff
diff --git a/docker-stack.yml b/docker-stack.yml
index b54df0e..c18e063 100644
--- a/docker-stack.yml
+++ b/docker-stack.yml
@@ -4,7 +4,7 @@ services:
portainer:
image: portainer/portainer
ports:
- - "9000"
+ - "9000:9000"
networks:
- portainer-net
volumes:
$ git clone https://github.com/portainer/portainer-compose.git
Cloning into 'portainer-compose'...
remote: Counting objects: 71, done.
remote: Total 71 (delta 0), reused 0 (delta 0), pack-reused 71
Unpacking objects: 100% (71/71), done.
$ cd portainer-compose/
$ docker stack deploy --compose-file docker-stack.yml portainer
Creating network portainer_portainer-net
Creating service portainer_portainer
http://192.168.99.100:9000 にアクセスすると Portainer にアクセスできます。
Dashboard はこんな感じ
Swarm Visualizer なんてのもありました