Dockerのserviceについて

Tuyoshi Akiyama
6 min readSep 3, 2017

--

前回の記事の続きです。今回は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 PORTS
5xcaihnvfen0 getstartedlab_web replicated 5/5 akitsuyoshi/get-started:part1 *:80->80/tcp// docker service ps <service>で、Taskの状態と固有のIDが振り分けられていることが分かります。
docker-test $ docker service ps getstartedlab_web
ID 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 STATUS
yr79szlovnfq8hmft1j13va9b * moby Ready Active Leader// なので、swarm自体をダウンさせるコマンドを打ってアプリを終了させます。
$ docker swarm leave --force
Node left the swarm.

以上が composeファイルを通して、serviceを使った、アプリの拡張方法になります。

次は、何度かでてきた、swarm modeについて見ていきます。

--

--