Dockerのserviceについて
前回の記事の続きです。今回はserviceについて、下記の記事(公式サイト)を見ながらまとめていきます。
前回同様、次のコマンドで、イメージが動くことが前提になります。
docker-test $ docker run -p 80:80 akitsuyoshi/get-started:part1
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
分散アプリでは、様々なアプリを形成する部分をservices(サービス)といいます。
このサービスは、実際に稼働しているコンテナーともいえます。というのは、サービスは一つのイメージを動かすものである一方で、またイメージがどのように動くかをコード化するという意味です。
使用するポート、サービスに必要な容量、コンテナーの複製数などをサービスは決めていきます。サービスの拡張はコンテナー数の増減を起こし、サービスの処理により多くのリソースを割り当てて行くことになっていきます。
では、実際にそれらサービスを docker-compose.yml
を使用して、定義していきます。このファイルの置き場所はどこでも大丈夫です。
docker-compose.yml
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repository:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:
上のイメージ部分には、自分のタグ付けしたイメージ名に置き換えます。
このサービスは、Dockerに次の処理を伝えます。
- 指定したイメージをpullする
- このイメージのインスタンス化を5つ作り(replica)、webと名付け、それぞれのインスタンスに最大CPUの10%(cpus)と50MのRAM(memory)を割り当てる
- failしたらすぐにコンテナーを再起動する(restart-policy)
- ポート80番と、webの80番を結びつける
- webコンテナーに、Webネットと呼ばれる負荷分散(load-balanced)されたネットワークから、ポート80番を共有するようにさせる
- (負荷分散されたoverlay networkをデフォルトの設定として)、Webネットを定義します。
ここでcompose ファイルのバージョンを3にしているのは、後々に出てくる、swarm modeやdeploy keyをサポートする為のバージョンになります(どちらも、-v 3以上からのサポートになります)。
次に、負荷分散をどのようにサービスに設定するか見ていきます。
// swarm managerを始めます
docker-test $ docker swarm init
Swarm initialized: current node (yr79szlovnfq8hmft1j13va9b) is now a manager.
// [...]// アプリをデプロイします。同時に名前をつける必要があります。
docker-test $ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web// 実際にcomposeファイルで設定した、5つのインスタンスが、host上で動作しているかを確認します。
docker-test $ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS5xcaihnvfen0 getstartedlab_web replicated 5/5 akitsuyoshi/get-started:part1 *:80->80/tcp// docker service ps <service>で、Taskの状態と固有のIDが振り分けられていることが分かります。
docker-test $ docker service ps getstartedlab_webID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTShawpgkhra9wa getstartedlab_web.1 akitsuyoshi/get-started:part1 moby Running Running 6 minutes agokpgxr0yaa3k3 getstartedlab_web.2 akitsuyoshi/get-started:part1 moby Running Running 6 minutes ago// [...]// 上の5個のコンテナー(インスタンス化された)を全て表示する。
docker-test $ docker container ls -q// ブラウザでhttp://localhost/を叩いて、上のIDがバラバラに表示される、つまり負荷分散の確認が出来ます。
更に、docker-componse.ymlファイルの replica
(インスタンス化させるコンテナーの数を設定)の値を変更して、保存し、次のコマンドを打ち変化を反映させます。
この際、コンテナーをストップさせる等の処理は必要ありません。
// アプリのデプロイ、上にでてきたコマンドと同じものになります$ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web (id: 5xcaihnvfen0111monxvwrdf1)
最後にアプリを次のコマンドでダウンさせます。
$ docker stack rm getstartedlab// 上の処理後に、まだ、1つのノードswarmが動作していることが確認されます
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUSyr79szlovnfq8hmft1j13va9b * moby Ready Active Leader// なので、swarm自体をダウンさせるコマンドを打ってアプリを終了させます。
$ docker swarm leave --force
Node left the swarm.
以上が composeファイルを通して、serviceを使った、アプリの拡張方法になります。
次は、何度かでてきた、swarm modeについて見ていきます。