Docker のStackについて

Tuyoshi Akiyama
5 min readSep 5, 2017

--

前回の記事の続きになります。今回は、2つの新しいサービス(Visualizer, redis)を、前回のswarmに加えていきます。

スタックは、依存関係を共有する相互に関連し合ったサービスのグループであり、swam間を連携して調整します。

単一のスタックは、アプリケーション全体の機能を定義し調整することができます。実際には、非常に複雑なアプリケーションでは、複数のスタックを使用されることが多いです。

では、実際に新しいサービスを追加していきます。今まで同様に、 docker-compose.yml ファイルに定義して、そのファイルをmyvm1(swarm manager)にコピーして、アプリを再度デプロイします。

docker-compose.yml


// webと同じ階層に次のサービスを追加します。
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet

上の処理は、volumesで、visualizerにhostソケットファイルへのアクセス権を渡しています。また、swarm managerのみが、このサービスを実行できる設定を placement で指示しています。

このcomposeファイルをコピーし、再度デプロイ(新しいcomposeファイルを基に)します。

$ docker-machine scp docker-compose.yml myvm1:~$ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"$ docker-machine ssh myvm1 "docker stack ps getstartedlab"

上の処理を終えたら、VM(myvm1, 2どちらか)のIPアドレスをブラウザで確認し、visualizerが表示されているのを確認します。ここでのport番号は、8080で、visualizerにアクセスできます。

次は、redisサービスを追加していきます。まずはcomposeファイルに、新しく入れるサービスを追加します。設定方法は、上のvisualizerと同様です。

docker-compose.yml

// web, visualizerと同じ階層に追加します
redis:
image: redis
ports:
- "6379:6379"
volumes:
- ./data:/data
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet

ここでのポイントは、resisがswarm manager上で実行されるので、同じファイルシステムを使用しているということです。

redisはコンテナー内の /data ディレクトリーをアクセスし、そこにデータを格納します。したがって、redisがデータ保存をする用のファイルが、ホストの物理的なファイルシステムで管理されることになり、コンテナーが再度デプロイしても、データは消えなくなります。

後は、swarm managerに dataディレクトリを作成し

$ docker-machine ssh myvm1 "mkdir ./data"

composeファイルをコピーし、それを読み込んで再度デプロイします。

$ docker-machine scp docker-compose.yml myvm1:~$ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"

これで、http://192.168.99.101をブラウザで見た時にredisの動作によって、ユーザーカウンターが追加されるのが確認できます。

上のredisは、visualizerをみても(portに8080を追加)しても、確認することができます。

以上が、Docker上で複数のマシンと、複数のサービスを扱う方法になります。

ざっくりといえば、composeファイルに新しいサービスを追加して、そのファイルを基にしたアプリを再度デプロイすることになります。

また、redisのように、コンテナーを止めても、データ自体は保存される方法などが分かりました。

次は、Dockerにおけるネットワークについて、学んでいきます。

--

--