Dockerを使ってみる Docker Machine, Docker Swarm
概要
マルチホスト環境での、Dockerの運用を勉強してみる。 マルチホストの定義が書いてないけど、複数台のホスト、クラウドの仮想サーバ環境のどっちなんだろう。 まあどっちでもいいか。
参考書籍
プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化
- 作者: 阿佐志保,山田祥寛
- 出版社/メーカー: 翔泳社
- 発売日: 2015/11/20
- メディア: 大型本
- この商品を含むブログ (3件) を見る
やってみたこと
マルチホスト環境でのコンテナ運用
マルチホスト環境とクラスタリング
クラスタリング -> 複数のサーバやハードウェアをまとめて1台とみなす技術。可用性、拡張性が上がる。 Dockerでは、複数のホストマシン上でDockerを動作させて、アプリの実行環境を構築できる。 マルチホスト環境でのコンテナのクラスタリングツールが、DockerMachineと、DockerSwarm。
Docker MachineとDcoker Swarm
Docker Machineは、Dockerの実行環境をコマンドで作成できるツール
Docker Swarmは、Dockerのクラスタリングをサポートする。
Docker Machineのコマンド
Docker Machine のinstall
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 など。
実行環境の一覧表示(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
無事作成が完了した!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でたちあがる。