Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Dockerを使ってみる Docker Machine, Docker Swarm

概要

マルチホスト環境での、Dockerの運用を勉強してみる。 マルチホストの定義が書いてないけど、複数台のホスト、クラウドの仮想サーバ環境のどっちなんだろう。 まあどっちでもいいか。

参考書籍

やってみたこと

マルチホスト環境でのコンテナ運用

マルチホスト環境とクラスタリング

クラスタリング -> 複数のサーバやハードウェアをまとめて1台とみなす技術。可用性、拡張性が上がる。 Dockerでは、複数のホストマシン上でDockerを動作させて、アプリの実行環境を構築できる。 マルチホスト環境でのコンテナのクラスタリングツールが、DockerMachineと、DockerSwarm。

Docker MachineとDcoker Swarm

Docker Machineは、Dockerの実行環境をコマンドで作成できるツール

Docker Swarmは、Dockerのクラスタリングをサポートする。

Docker Machineのコマンド

Docker Machine のinstall

docs.docker.com

curl -L https://github.com/docker/machine/releases/download/v0.8.2/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
chmod +x /usr/local/bin/docker-machine

実行環境の作成(create)

docker-machine create --driver [ドライバ名] 作成するDockerMachine名
  • --driverで指定できる名前は、決まっている。amazonec2, google など。

docker.github.io

実行環境の一覧表示(ls/status)

docker-machine ls [オプション]

実行環境へのSSH接続(ssh)

docker-machine ssh マシン名

環境変数の確認(env)

docker-machine env --shell cmd host1

 その他のコマンド

$ docker-machine start machine_name
$ docker-machine stop machine_name
$ docker-machine restart machine_name
$ docker-machine scp machine_name(実行環境からのファイルダウンロード)
$ docker-machine rm -f machine_name
$ docker-machine kill machine_name(実行環境の強制停止)
$ docker-machine ip machine_name (IPアドレスの確認)
$ docker-machine inspect machine_name (マシンの詳細確認)

DockerMachineで、Docker実行環境を構築してみる

host1 -> VirtualBox host2 -> AWS EC2

VirtualBox でDocker実行環境構築

$ docker-machine create --driver virtualbox host1
...
$ docker-machine ls

host1   -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.3 
...
$ docker-machine ssh host1
# 無事できていれば、鯨のAAが出てくる

これでとりあえず完了!

EC2 でのDocker実行環境手順

$ docker-machine create \
    --dreiver amazonec2 \
    --amazonec2-access-key ****** \
    --amazonec2-secret-key ****** \
    --amazonec2-region ap-northeast-1 \
    --amazonec2-vpc-id ****** \
    host2
  • access-key, secret-keyは、ec2にアクセスできるuserを作ってその情報を入れる。
  • vpc-idは、vpcのidを入力する。

無事作成が完了した!sshで接続してみる。

$ docker-machine ssh host2

これも無事完了!すげー!

Docker Swarmでクラスタ管理

master - container1 - container2 -node01 - container1 - container2 -node02 - container1

という感じで、masterが複数のコンテナを管理するように設定してみる。

Docker swarm imageで、ホストPC(localPC)にcontainerを生成・起動する

$ docker run swarm create
  • swarmがimageがdockerにない場合は、自動でimageをpullしてくれる。
  • この時出てくるtokenをメモっておく。

docker-machine でmaster machineを作る

docker-machine create \
-d virtualbox \
--swarm \
--swarm-master \
--swarm-discovery token://[トークン]\
master

docker-machineで、node01,node02のmachineを作成する。

docker-machine create \
-d virtualbox \
--swarm \
--swarm-discovery token://***** \
node01

docker-machine create \
-d virtualbox \
--swarm \
--swarm-discovery token://***** \
node02

無事完了!今の状況は、こういう感じ。

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL                         SWARM             DOCKER    ERRORS
master   -        virtualbox   Running   tcp://192.168.99.100:2376   master (master)   v1.12.3   
node01   -        virtualbox   Running   tcp://192.168.99.101:2376   master            v1.12.3   
node02   -        virtualbox   Running   tcp://192.168.99.102:2376   master            v1.12.3 

クラスタ環境でのコンテナ動作確認

ここちょっとわかりづらかった。。。

# これで、docker-machineにアクセス? eval -> 複数の変換処理を一度に行う
$ eval "$(docker-machine env --shell bash --swarm master)"

# set -> シェルのオプションを設定する, grep-> 正規表現でマッチするものを抽出する
$ set | grep DOCKER

クラスタの構成をdocker infoで確認する。

docker info

コンテナを生成・起動してみる

試しに5回くらいやってみる。

$ docker run hello-world
$ docker run hello-world
$ docker run hello-world
$ docker run hello-world
$ docker run hello-world

無事分散されてコンテナが立てられているのが確認できた!すごい!

クラスタの1台を止めてみる。

docker-machine stop node02

docker-machine で確認してみる。

docker-machine ls
NAME     ACTIVE      DRIVER       STATE     URL                         SWARM             DOCKER    ERRORS
master   * (swarm)   virtualbox   Running   tcp://192.168.99.100:2376   master (master)   v1.12.3   
node01   -           virtualbox   Running   tcp://192.168.99.101:2376   master            v1.12.3   
node02   -           virtualbox   Stopped                               master            Unknown

docker ps -a でコンテナを確認してみるとnode02のものは停止しているのがわかる。

docker logs [masterのmachine id]でswarm master(manage)のlogを確認できる。

node02を停止した状態で、docker run hello-worldを実行すると、node01 or masterのdocker-machineでたちあがる。