uni memo

docker swarmクラスタを複数ホストで作成、docker imageをbuildしてデプロイ

docker swarmクラスタを複数ホストで作成、docker imageをbuildしてデプロイ

docker swarmはコンテナのクラスタを作成することができる。また複数ホストにまたがってクラスタを構築することもできる

複数ホストに立ち上げる手順とその時詰まったことを書いておく。構築は全てAWS EC2上で試している

環境

  • docker: 17.06.0-ce

docker swarmクラスタ作成

docker swarm init

Swarm initialized: current node (zqrxvk9f6zpo0a2djgx0dbxi1) is now a manager.

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

    docker swarm join --token "token" 172.35.23.111:2377

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

ホストの追加

docker swarm join-token manager

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

    docker swarm join --token "token" 172.35.23.111:2377

で出てくるコマンドを別なホストにて実行すると、クラスタに登録される

登録済ホストの確認

docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
0ctr2m4tl331anxlckk6lojgk     ip-172-35-19-100    Ready               Active              Reachable
zqrxvk9f6zpo0a2djgx0dbxi1 *   ip-172-35-23-111    Ready               Active              Leader

docker imageのbuild

2つのコンテナを異なるDockerfileを用いてbuildする

docker-compose.yml
version: '3.3'
services:
  container1:
    image: container1 # buildされるimage名
    build:
      context: ./container1
      dockerfile: Dockerfile
    ports:
      - 8080:8080
    deploy:
      replicas: 2
  container2:
    image: container2 # buildされるimage名
    build:
      context: ./container2
      dockerfile: Dockerfile
    depends_on:
      - container1
    deploy:
      replicas: 2
docker-compose build

...
Successfully tagged container1:latest

などと出たら成功 作成できているか確認する

docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
container1               latest              d36ec54c002b        3 minutes ago       275MB
container2               latest              9822ce61b418        3 minutes ago       277MB

各ホストにdocker imageをbuildする

ここで詰まった。おそらく

docker-compose build
などを用いて 手元でdocker imageをビルドしている場合のみ必要になる作業と思われる (docker pullしたimageをそのまま使う場合は問題なさそう)

docker swarmはimageがbuildされていないホストにはデプロイをしない らしいので、各ホストで

docker-compose build
を実行して、docker imageをbuildしておく

デプロイ

使用するdocker-composeファイル名と作成するネットワーク名(下例ではnet)を指定して

docker stack deploy -c docker-compose.yml net

Ignoring unsupported options: build

Creating network net_default
Creating service net_container1
Creating service net_container2

各々作成されれば成功

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
8b041ae6b58c        container1:latest                                2 hours ago         Up 2 hours                              net_client.2.s56ibqk70xktawsibco0l1eky
e37ca44e8c1b        container2:latest                                2 hours ago         Up 2 hours                              net_server.2.83l7iwdjyl5vzcwhg9y98lqqw
...

その他便利コマンド

  • いくつデプロイされているかみる
docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
6t1l4e7u6tjk        net_container1      replicated          2/2                 container1:latest       *:8080->8080/tcp
8i22nh5bcisv        net_container2      replicated          2/2                 container2:latest   
  • どこにデプロイされているかみる
docker stack ps net

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE         ERROR               PORTS
wucj5ka6iqyr        net_container1.1        container1:latest       ip-172-35-19-100    Running             Running 2 hours ago                       
lf2f2hx5j4i3        net_container2.1        container2:latest       ip-172-35-19-100    Running             Running 2 hours ago                       
hxd1iuo6ishn        net_container1.2        container1:latest       ip-172-35-23-111    Running             Running 2 hours ago    
83l7iwdjyl5v        net_container2.2        container2:latest       ip-172-35-23-111    Running             Running 2 hours ago 

参考

2024, Built with Gatsby. This site uses Google Analytics.