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する
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