Docker Swarmを使ったコンテナ配置戦略

black laptop computer turned on showing computer codes

一般的に、多くのリクエストをシステムは単一のサーバーで構成されることは珍しく、複数のサーバーで構成されています。単一のDockerホストで構成する場合は比較的単純でしたが、複数のDockerホストやコンテナの配置をどのように制御するべきかには単一のDockerホストと違い単純ではありません。複数のDockerホストを制御するための方法について手順を解説します。

目次

Docker Swarmとは?

Docker Swarmは複数のDockerホストを束ねてクラスタ化するためのツールです。コンテナーオーケストレーションシステムの一つです。

Dockerでのコンテナオーケストレーションに関わる名称のまとめは以下のようになります。

名称役割対応するコマンド
Compose複数のコンテナを使うDockerアプリケーションの管理 (主にシングルホスト)docker-command
Swarmクラスタの構築や管理 (主にマルチホスト)docker swarm
Service Swarmを前提とし、クラスタ内のService (1つ以上のコンテナの集まり)の管理 docker service
StackSwarmを前提とし、複数のServiceをまとめたアプリケーション全体の管理docker stack
Dockerでのコンテナオーケストレーションに関わる名称のまとめ

複数のDockerホストを用意しSwarmクラスタを構築する

複数のDockerホストを用意するための仕組みとして、「Docker in Docker」があります。これは、Dockerホストとして機能するDockerコンテナを複数個立てることです。

Docker in Dockerを使うことで、VMによる起動や停止の時間が長い、マシンリソースを余計に消費するといったデメリットを解消することが出来ます。

dind(Docker in Docker)を使ってDocker Swarmクラスタを構築してみましょう。

作成するコンテナは以下のように3種類、5個です。

  • registry x 1
  • manager x 1
  • worker x 3

手順

version: "3"
services:
  registry:
    container_name: registry
    image: registry:2.6
    ports:
      - 5000:5000
    volumes:
      - "./registry-date:/var/lib/registry"
  
  manager:
    container_name: manager
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    ports:
      - 8000:80
      - 9000:9000
    depends_on:
      - registry
    expose:
      - 3375
    command: "--insecure-registry registry:5000"
    volumes:
      - "./stack:/stack"

  worker01:
    container_name: worker01
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"
  
  worker02:
    container_name: worker02
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"

  worker03:
    container_name: worker03
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"
> docker-compose up -d
registry is up-to-date
Starting manager ... done
Creating worker01 ... done
Creating worker03 ... done
Creating worker02 ... done

managerをDocker Swarmへ追加

> docker container exec -it manager docker swarm init
Swarm initialized: current node (ngj8hs1812m79gdcz9yi2flem) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2zugvze7qqbjvsd301r8pjy2rn3ny35bixn1dxir7f6aezpkk1-0c0qxiyon2s05a6dvmdp5qb5z 172.29.0.3:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

WorkerをDocker Swarmへ追加

> docker container exec -it worker01 docker swarm join --token SWMTKN-1-2zugvze7qqbjvsd301r8pjy2rn3ny35bixn1dxir7f6aezpkk1-0c0qxiyon2s05a6dvmdp5qb5z manager:2377
This node joined a swarm as a worker.

> docker container exec -it worker02 docker swarm join --token SWMTKN-1-2zugvze7qqbjvsd301r8pjy2rn3ny35bixn1dxir7f6aezpkk1-0c0qxiyon2s05a6dvmdp5qb5z manager:2377
This node joined a swarm as a worker.

> docker container exec -it worker03 docker swarm join --token SWMTKN-1-2zugvze7qqbjvsd301r8pjy2rn3ny35bixn1dxir7f6aezpkk1-0c0qxiyon2s05a6dvmdp5qb5z manager:2377
This node joined a swarm as a worker.

nodeの状態の確認

> docker container exec -it manager docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
h0mjai6pd673bokfsepiw6k6x     0efa0423e100        Ready               Active                                  18.05.0-ce
r3rwee9jzv2c73lg8qsvwmbjr     693fde09ce44        Ready               Active                                  18.05.0-ce
bkqnqzurop3prp3cdqyx6u2uu     b91ff3c9a469        Ready               Active                                  18.05.0-ce
ngj8hs1812m79gdcz9yi2flem *   c4e42e84f7a3        Ready               Active              Leader              18.05.0-ce
よかったらシェアしてね!
目次