Docker学習ノート-Swam Dockerクラスタの構築

10798 ワード

http://www.cnblogs.com/rio2607/p/4445968.html#undefined
Swarm紹介
SwamはDocker社が2014年12月初めに発表した比較的簡単なツールで、Dockerクラスタを管理し、Dockerホストの群れを単一の仮想ホストに変える.Swarmは、標準的なDocker APIインタフェースをフロントエンドアクセスインタフェースとして使用し、言い換えれば、様々な形式のDocker Client(docker client in Go,docker_py,dockerなど)が直接Swarmと通信することができる.SwarmはほとんどGo言語で開発を完了し、先週金曜日、4月17日、Swarm 0.2リリースでは、0.1リリースよりも0.2リリースでクラスタ内のコンテナをスケジューリングする新しいポリシーが追加され、使用可能なノードで伝播し、より多くのDockerコマンドおよびクラスタドライバをサポートします.
Swarm deamonはスケジューラプラスルータ(router)にすぎず、Swarmは自分でコンテナを実行せず、dockerクライアントからの要求を受け入れ、適切なノードをスケジューリングしてコンテナを実行するだけである.これは、Swarmが何らかの理由で停止してもクラスタ内のノードが通常通りに動作し、Swarmが再稼働した後、再構築クラスタ情報が収集されます.以下はSwarmの構造図です.
Docker学习笔记 — Swarm搭建Docker集群_第1张图片
Docker学习笔记 — Swarm搭建Docker集群_第2张图片
Swamの使い方
3台のマシン:sclu 083:10.13.181.83 sclu 084:10.13.181.84 atsg 124:0.32.105.124この3台のマシンを使用してDockerクラスタを作成し、sclu 083は同時にswarmmanager管理クラスタとして機能します.
Swamインストール
最も簡単なSwarmのインストール方法は、Dockerが公式に提供しているSwarmミラーを使用することです.
$ sudo docker pull swarm

Dockerクラスタ管理には、サービス発見(Discovery service backend)機能が必要です.Swamは以下のdiscovery service backend:Docker Hubに内蔵されたサービス発見機能、ローカルの静的ファイル記述クラスタ(static file describing the cluster)、etcd(ちなみにetcdは火がついているようで、時間の研究がある)、consul、zookeeper、いくつかの静的ipリスト(a static list of ips)をサポートしています.この文書では、前の2つの方法backendの使用について詳しく説明します.
Swarmを使用してクラスタ管理を行う前に、クラスタに参加するすべてのノードを準備するdocker deamonのリスニングポートを0.0.0.0:2375に変更する必要があります.sudo docker –H tcp://0.0.0.0:2375 &コマンドを直接使用したり、プロファイルで変更したりすることができます.
$ sudo vim /etc/default/docker

ファイルの一番後ろに次の文を追加します.
D0OCKER_OPTS="-H 0.0.0.0:2375 –H unix:///var/run/docker.sock"

Docker学习笔记 — Swarm搭建Docker集群_第3张图片
注意:必ずすべてのノードで変更し、変更後にdocker deamonを再起動します.
$ sudo service docker restart

1つ目の方法は、Docker Hubに内蔵されているサービス発見機能を使用することです.
最初のステップは、クラスタフラグを作成するために、任意のノード上でswarm createコマンドを実行します.このコマンドが実行されると、swarmはDocker Hubに組み込まれた発見サービスで、swarmが管理するDockerクラスタを一意に識別するために、世界で唯一のtokenを取得します.
$ sudo docker run --rm swarm create

私たちはsclu 084という機械で上記の命令を実行します.
Docker学习笔记 — Swarm搭建Docker集群_第4张图片
返されるtokenはd 947 b 55 aa 8 fb 9198 b 5 d 13 ad 81 f 61 ac 4 dです.このtokenは、次の操作でこのtokenが使用されるため、必ず覚えておいてください.
第2のステップは、クラスタに参加するすべてのマシンでswarm joinコマンドを実行し、マシンをクラスタに追加します.
今回の実験はすべての3台の機械で命令を実行することである.
$ sudo docker run –-rm swarm join –addr=ip_address:2375 token://d947b55aa8fb9198b5d13ad81f61ac4d

IPアドレスが10.13.181.84のマシンで実行
Docker学习笔记 — Swarm搭建Docker集群_第5张图片
このコマンドを実行するとすぐには戻りません.手動でCtrl+Cで戻ります.
3ステップ目はswarm managerを起動します.
私たちはsclu 083をSwam管理ノードとして機能させるため、このマシンでswarm manageコマンドを実行します.
$ sudo docker run –d –p 2376:2375 swarm manage token:// d947b55aa8fb9198b5d13ad81f61ac4d

このコマンドでは、まずdaemonの形式でswarmを実行します.第二に、ポートマッピング:2376は、いずれかのホストが占有していないポートに交換することができ、必ず2375ではありません.そうしないと問題が発生します.
実行結果は次のようになります.
Docker学习笔记 — Swarm搭建Docker集群_第6张图片
このコマンドを実行すると、クラスタ全体が起動します.
クラスタ上のすべてのノードを任意のノードで表示できるようになりました.
Docker学习笔记 — Swarm搭建Docker集群_第7张图片
その後、dockerがインストールされている任意のマシン上で、コマンド(コマンドでswarmmanegerマシンのIPアドレスとポートを示す)によって、このクラスタ上でDcokerコンテナ操作を実行できます.
10.13.181.85というマシンの上でクラスタのノードの情報を表示します.infoコマンドは、公式ドキュメントを表示できる任意のSwarmでサポートされているdockerコマンドに変更できます.
$ sudo docker –H 10.13.181.83:2376 info

Docker学习笔记 — Swarm搭建Docker集群_第8张图片
上図の結果から,この小クラスタには3つのノードがあるのにinfoコマンドは2つのノードしか表示されていないという問題を見いだした.ノード10.32.105.124がまだ見つかりません.なぜこのような状況になったのでしょうか.
10.32.1105.124このマシンには上のdocker daemonが0.0.0.0:2375というポートを監視していないので、Swamは仕方がないでしょう.このノードはクラスタに参加します.
Docker Hubに内蔵された検出サービスを使用すると、swarm createを使用すると問題が発生します.
time="2015-04-21T08:56:25Z" level=fatal msg="Get https://discovery-stage.hub.docker.com/v1/clusters/d947b55aa8fb9198b5d13ad81f61ac4d: dial tcp: i/o timeout"

このような誤りは、何が原因なのか、解決しなければならない.(ファイアウォールの問題かもしれません)
Docker Hubに組み込まれたサービス発見機能を使用して問題が発生した場合、次の2つ目の方法を使用できます.
2つ目の方法:ファイルの使用
第2の方法は、第1の方法よりも比較的簡単であり、timeoutの問題も起こりにくい.
第1歩はsclu 083この機械の上で1つのファイルを新築して、クラスタに参加する機械のIPアドレスを書きます
Docker学习笔记 — Swarm搭建Docker集群_第9张图片
第2ステップはsclu 083という機械の上でswarm manageコマンドを実行します.
$ sudo docker run –d –p 2376:2375 –v $(pwd)/cluster:/tmp/cluster swarm manage file:///tmp/cluster

这里写图片描述
注意:clusterファイルはネイティブ上にあり、起動したコンテナはデフォルトではアクセスできないため、-vコマンドで共有する必要があります.そして、file:////忘れてはいけません.
swarmがすでに稼働していることがわかります.クラスタノードの情報を表示できます.コマンドを使用します.
$ sudo docker run –rm –v $(pwd)/cluster:/tmp/cluster swarm list file:///tmp/cluster

这里写图片描述
(ファイルをサービスとして使用して発見した場合、manage listコマンドはswarm manageノードでしか使用できないようで、他のノードでは使えないようです)
はい、クラスタもすでに動作しています.最初の方法と同じように他のマシンでクラスタを使用することができます.同様にsclu 085マシンでテストを行います.
Docker学习笔记 — Swarm搭建Docker集群_第10张图片
正常にアクセスし、ノード情報が正しいことがわかります.次に、上記のinfoコマンドを他のdocker実行可能コマンドに置き換えて、Dockerクラスタを知ることができます.
Swamスケジューリングポリシー
Swarmはscheduleノードでコンテナを実行するとき、指定したポリシーに基づいてコンテナを実行するのに最適なノードを計算します.現在サポートされているポリシーはspread,binpack,randomです.
Randomはその名の通り、コンテナを実行するためにノードをランダムに選択し、一般的にはデバッグとして使用され、spreadおよびbinpackポリシーは、各ノードの使用可能なCPU、RAM、および実行中のコンテナの数に基づいてコンテナを実行すべきノードを計算します.
同じ条件の下で、Spreadポリシーはコンテナを実行する最も少ないノードを選択して新しいコンテナを実行し、binpackポリシーはコンテナが最も集中しているマシンを実行して新しいノードを実行することを選択します(The binpack strategy causes Swam to optimize for the Container which is most packed.).
Spreadポリシーを使用すると、コンテナはクラスタ内の各ノードに均等に分布して実行され、1つのノードが停止すると、わずかなコンテナしか損失しません.
Binpackポリシーは、コンテナの断片化を避けるために最大化されています.つまり、binpackポリシーは、まだ使用されていないノードをできるだけ大きな空間を必要とするコンテナに残して実行し、できるだけコンテナを1つのノードの上に実行します.
フィルタ
Constraint Filter
labelを使用して、指定したノードの上でコンテナを実行します.これらのlabelはdocker daemonを起動するときに指定され、/etc/default/dockerというプロファイルに書くこともできます.
$ sudo docker run –H 10.13.181.83:2376 –name redis_083 –d –e constraint:label==083 redis

Affinity Filter
使用-e affinity:container=container_name/container_id –-name container_1コンテナcontainer_1容器に隣接するcontainer_name/container_id実行、すなわち2つのコンテナが1つのnodeの上で実行される(You can schedule 2 containers and make the container 2 next to the container 1.)
まず1台の機械で容器を起動します
$ sudo docker -H 10.13.181.83:2376 run --name redis_085 -d -e constraint:label==085 redis

次にコンテナredis_を起動します.085_1,redis_085_1 redisのすぐ隣085コンテナ実行、すなわち1つのノードで実行
$ sudo docker –H 10.13.181.83:2376 run –d –name redis_085_1 –e affinity:container==redis_085 redis

-e affinity:image=image_nameコマンドはimageをダウンロードしただけを指定できます.nameのマシンはコンテナを動作させる(You can schedule a container only on nodes where the images are already pulled)
次のコマンドは、Redisミラーのみのノードでredisコンテナを起動します.
$ sudo docker –H 100.13.181.83:2376 run –name redis1 –d –e affinity:image==redis redis

次のコマンドは、redisミラーがあるノードの上にredisという名前のコンテナを起動し、各ノードの上にredisコンテナがない場合は、デフォルトのポリシーに従ってredisコンテナを起動します.
$ sudo docker -H 10.13.181.83:2376 run -d --name redis -e affinity:image==~redis redis

Port filter
Portは唯一のリソースと見なされます
$ sudo docker -H 10.13.181.83:2376 run -d -p 80:80 nginx

このコマンドを実行すると、80ポートを使用するコンテナは起動に失敗します.