Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Docker Swarm入門

32,089 views

Published on

第8回コンテナ型仮想化の情報交換会@東京 #lxcjp
2015年9月26日(土)

Published in: Technology
  • Be the first to comment

Docker Swarm入門

  1. 1. Docker Swarm 入門 Docker Swarm and Orchestration 第8回 コンテナ型仮想化の情報交換会@東京 #lxcjp 2015年9月26日(土) @zembutsu 背景画像CREDIT:スフィア / PIXTA(ピクスタ) https://pixta.jp/@sphere
  2. 2. 2 今日の内容 今日から始める Docker Swarm ‣ Docker オーケストレーション Docker を支えるオーケストレーションと各ツールの役割 ‣ Swarm を使ったコンテナ/クラスタ管理 Swarm クラスタの構築方法、主要なコマンド、コンテナの起動とストラテジの理解 ‣ Swarm クラスタの構築 Swarm manager と ノードの登録方法 当初Dockerプラグインの紹介を 考えていましたが、あまりまと まっていないSwarmまわりと、 オーケストレーションについて 皆さんと共有できればなと 思っています。
  3. 3. 私・個人としては、基本的に、 無理にコンテナを導入したり コンテナ環境に移行しようとし ても、導入目的や目標が定まら なければ・・・・
  4. 4. 無残なコンテナの残骸が残って しまうのかなと思っています。
  5. 5. ┌──────────────────────┐ │ドッカースウォームが あらわれた! │ │ドッカーコンポーズが あらわれた! │ │コマンド? │ │ ∨ │ └━━━━━━━━━━━━━━━━━━━━━━┘ ┌────┐ │いのち │ │だいじに │ └━━━━┘ ┌──────コマンド─────┐ │ たたかう じゅもん │ │ とんずら げんじつとうひ │ └━━━━━━━━━━━━━━━┘ > 一方、だからといってDockerや コンテナなり、周辺ツールを、 敵だとみなしたり距離を置くの ではなく…
  6. 6. 素材画像CREDIT:hanako / PIXTA(ピクスタ) https://pixta.jp/illustration/14575501 様々な選択肢の中の1つとして Dockerをどのような場面で、 どのように使っていくのか、 理解を深めるのが大切ではと 考えています。
  7. 7. 7 ‣ Docker Engine • Dockerの中核となるプログラム • コンテナの制御 ‣ クライアント・サーバ型 • “docker” デーモン • “docker” コマンドライン・ツール まずはじめに、いわゆるDocker と呼ばれるシステムの中心が、 このDockerエンジンです。
  8. 8. エンジンは、他のツールと連携 してオーケストレーション機能 (自動で環境構築やデプロイ・ プロビジョニング等の実施)を 実現しています。
  9. 9. Docker Dockerです。 ご指導ご鞭撻、よろしくです。 コンテナ管理 それではオーケストレーション について整理していきます。
  10. 10. Docker オーケストレーション 1■□□ Orchestration and Docker
  11. 11. 物理マシン 物理マシン 物理マシン OS OS 仮想化 システム 仮想化 システム HyperVisor VM VM VM VM VM VM Guest OS Guest OS Guest OS Guest OS Guest OS Guest OS 物理マシン 仮想マシン クラウド OS OS OS Docker Engine Docker Engine Docker Engine App App App App App App App App App App 仮想化・クラウド Dockerのコンテナ管理 オーケストレーション? そもそも、Dockerとコンテナの オーケストレーションとはなぜ 必要なのでしょうか。
  12. 12. VM VM VM VM VM VM Guest OS Guest OS Guest OS Guest OS Guest OS Guest OS 物理マシン 仮想マシン クラウド OS OS OS Docker Engine Docker Engine Docker Engine GUI CLI API Docker Cluster 管理レイヤ ( Docker Swarm, Amazon ECS, Kuberntes, rkt, Rancher …etc ) App App App App App App App App App App 仮想化・クラウド Dockerのコンテナ管理 物理マシン 物理マシン 物理マシン OS OS 仮想化 システム 仮想化 システム HyperVisor 仮想化やクラウド環境で複数の ホストを管理したように、コン テナでも同様に管理したい!
  13. 13. VM VM VM VM VM VM Guest OS Guest OS Guest OS Guest OS Guest OS Guest OS App App App App 物理マシン 仮想マシン クラウド OS OS OS Docker Engine Docker Engine Docker Engine App App App App App App GUI CLI API Docker Cluster 管理レイヤ ( Docker Swarm, Amazon ECS, Kuberntes, rkt, Rancher …etc ) オーケストレーション サービス検出・クラスタ管理 仮想化・クラウド Dockerのコンテナ管理 物理マシン 物理マシン 物理マシン OS OS 仮想化 システム 仮想化 システム HyperVisor 更に、両方の環境を纏めて管理 したいというのは、もう少し先 かもしれません。
  14. 14. 14Docker Swarm Guide ‣ 利点 開発者にとっての効率の良さ すぐに利用できる点と、バージョン・コントロール、CI/CDの自動化。 アプリケーションのポータビリティ 開発をはじめ、テストやリリースに至るまで、 コンテナを通して一環したインフラ環境を利用できる。 ‣ ポイント Dockerそのものが何かするのではない(仮想化・クラウドと同じ) – Dockerは、あくまでも、利用者の利便性を向上する道具(プラットフォームの役割) Dockerはインフラを抽象化--developer’s efficiency and application portability ただし、Dockerエンジンの管理 できる範囲は、あくまで1つの OS環境のみです。
  15. 15. 15Docker Swarm Guide ‣ Docker 動作ホスト環境の自動作成 仮想サーバの起動と Docker デーモンのプロビジョニングを自動的に行う 自動的に TLS を有効にした Docker 動作環境を構築 ‣ コマンドラインで使うツール docker-machine –d <ドライバ> [option] マシン名 …のように、コマンドで操作 ‣ 対応環境 • Linux, Windows, Mac OS X に対応 • VirtualBox だけでなく、多くのクラウドに対応 Amazon Web Services, DigitalOcean, exoscale, Google Compute Engine, SoftLayer, Azure, Hyper-V, OpenStack, RackSpace, VMwareFusion, VMwarea vCloud Air, VMware vSphere, SSH 可能なリモートホスト Docker Machine 複数のDocker環境を簡単に使う ためのツールがMachineです。
  16. 16. かつてはboot2dockerという、 VirtualBoxと連携するツールが ありました。
  17. 17. Docker Toolbox 複数の環境を一括管理できます。 ・Machine ・Compose ・VirtualBox ・Kitematic
  18. 18. 18Docker Swarm Guide Docker Machine の入手と実行 ‣ 方法1:バイナリのダウンロード • https://github.com/docker/machine/releases/ $ curl -L https://github.com/docker/machine/releases/download/v0.4.1/docker-machine_linux-amd64 > ¥ /usr/local/bin/docker-machine $ sudo chmod +x /usr/local/bin/docker-machine ‣ 方法2:Docker Toolbox
  19. 19. $ docker-machine create --driver=amazonec2 ¥ --amazonec2-access-key=<アクセス・キー> ¥ --amazonec2-secret-key=<シークレット・キー> ¥ --amazonec2-vpc-id=<VPC ID> ¥ ec2docker $ docker-machine env ec2docker export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://54.152.12.116:2376" export DOCKER_CERT_PATH="/root/.docker/machine/machines/ec2docker" export DOCKER_MACHINE_NAME="ec2docker" # Run this command to configure your shell: # eval "$(docker-machine env ec2docker)“ $ docker-machine ssh ec2docker こちらはAmazon EC2環境上に Docker動作環境を作るコマンド です。VPC IDの指定は必須です。 あとは、環境変数を指定して リモート操作したり、SSHで 簡単にログイン出来ます。
  20. 20. GUIを操作しなくても、自動で インスタンスの起動と、Docker 実行環境を構築してくれます。
  21. 21. $ docker-machine create --driver= digitalocean ¥ --digitalocean-access-token <token> ¥ ec2docker $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM b2d virtualbox Stopped default virtualbox Stopped dev virtualbox Stopped do03 digitalocean Error tcp://104.131.113.166:2376 rancheros virtualbox Stopped rancheros2 virtualbox Stopped sl3 * softlayer softlayer-docker01 * softlayer softlayer-docker02 * softlayer test2 virtualbox Stopped testhost1 virtualbox Stopped testhost21 virtualbox Stopped testhost22 virtualbox Stopped DigitalOceanの環境でも同様に 環境を構築することができます。 違いは「--driver」の指定です。 環境一覧を「ls」オプションで 見られます。
  22. 22. 22Docker Swarm Guide Docker Machine 主要オプション • create … 作成 • rm … 削除 • ls … 一覧表示 • ssh … SSH 接続 • scp … ファイル転送 • start … 起動 • stop … 停止 • restart … 再起動 • ip … パブリック IP アドレスの確認 • inspect … 詳細表示
  23. 23. 23Docker Swarm Guide Docker Swarm ‣ Docker クラスタ管理ツール Docker ホストの集まりを作成したり、アクセスできるようにするツールで、API を持つ ‣ コマンドラインで操作 docker-machine で環境を作り、docker run swarm create ‣ クラスタ形成 ディスカバリ(マネージャへの登録に、consul や etcd にも対応) ストラテジ(どこのノードにコンテナを自動配置するか方針設定) フィルタ(コンテナを配置する条件の設定は、Docker を抽象化) 次にSwarm(スウォーム)です。 複数OS上のDocker環境を1つの リソースプールとして扱えます。 詳しくは次章で紹介します。
  24. 24. VM Docker Swarm Manager Dokku, Docker Compose, Krane, Jenkins, Apache Mesos … VM Docker VM Docker VM Docker … コンテナ コンテナ コンテナ コンテナ 重要なのは、マネージャと言う プログラムがDockerデーモンに 代わって、dockerコマンドを受 け付けます。詳しくは後述。
  25. 25. 25Docker Swarm Guide Docker Compose ‣ 複数コンテナのアプリケーション自動設定 Dockerfile を複数のコンテナに拡張したようなイメージ ‣ コマンドラインで操作 docker-compose docker-compose.yml ‣ Linux, Windows, Mac OS X に対応 ‣ 構成情報を YAML 形式のファイルで定義 そしてもう1つ、コードで Dockerの環境を管理するもの。
  26. 26. docker-compose.yml web: build: . command: php -S 0.0.0.0:8000 -t /wordpress ports: - "8000:8000" links: - db volumes: - .:/wordpress db: image: orchardup/mysql environment: MYSQL_DATABASE: wordpress Dockerfile FROM orchardup/php5 ADD . /wordpress Dockerfileは単一のコンテナを 定義するのに対し、Composeは 複数のコンテナを定義します。
  27. 27. 27Docker Swarm Guide Docker Engine 1.8 (2015/08) ‣ ボリューム・プラグインが安定版(stable) • docker run –v xxx --volume-driver=flocker • https://docs.clusterhq.com/en/1.2.0/labs/docker-plugin.html ‣ ロギング・ドライバの提供開始 • Fluent http://blog.treasuredata.com/blog/2015/08/03/5-use-cases-docker- fluentd/ • DELF https://www.graylog.org/centralize-your-docker-container-logging-with- graylog-native-integration/ ‣ 細かな改善 • 'docker daemon' , 'docker cp', 'docker ps --format', '--config' それ以外でも、Docker本体でも プラグイン機能の実装が進んで います。
  28. 28. (画像引用)Flocker Docker plugin by ClusterHQ https://docs.clusterhq.com/en/1.3.1/labs/docker-plugin.html docker run --volume-driver=flocker … ・OpenStack Block Device ・Amazon AWS/EBS Block Device ・EMC Block Device ・ZFS Peer-to-Peer ・Loopback Block Device ・Flocker Docker plugin ・Flocker with Swarm ・Flocker with Compose ・Flocker with Weave ・Flocker with Mesosphere ・Flocker with Kubernetes たとえばFlockerはボリューム の可搬性やバックエンドとして 使うストレージを拡張します。
  29. 29. 29Docker Swarm Guide Docker Plugin https://github.com/docker/docker/blob/master/docs/extend/plugins.md ボリューム管理 • Blockbridge plugin … 一貫性を持つストレージ、暗号化、QoS等 • Convoy plugin … デバイスマッパーと NFS • Flocker Plugin … データベースやステートフルなコンテナ • GlusterFS plugin … GlusterFS を使用 • Pachyderm PFS plugin … Pachyderm file system 向け • REX-Ray plugin … EC2, OpenStack, XtermIO, ScaleIO 鍵管理 • Keywhiz plugin 様々なプラグインが提供されて います。一覧からネットワーク プラグイン(weave)が見えな くなりましたが、Docker 1.9の 本体にマージされるのでは(?)
  30. 30. 30Docker Swarm Guide Docker オーケストレーションのまとめ ‣ 複数のDockerおよびコンテナ基盤管理 • Machine … Docker 実行環境の自動構築や管理 • Swarm … コンテナ • Compose … コードによるコンテナ・クラスタの一括管理 ‣ プラグインによる機能拡張 • ボリューム ( Flocker ) stable • ネットワーク ( Weave ) • などなど
  31. 31. 31Docker Swarm Guide ‣ Docker Machine + Docker Compose – docker / docker-compose run – docker / docker-compose build – Dockerfile, docker-compose.yml ‣ Vagrant – vagrant up – Vagrantfile omake:似てる? このあたり、とても似ているよ うな気がしますが、たぶん設計 時の死思想が似通っているから ではないかと思います。 (Keep It Simple, Stupid) それに、微妙に役割も違います。 仮想ネットワーク管理なら Vagrantのほうが今は有利 ですし、今後の展開に期待。
  32. 32. Docker Swam の基本概念 2■■□ Introduciton to Docker Swarm どのようにDocker Swarmを使い コンテナのスケジューリング (設置)を実現しているかをみて いきましょう。
  33. 33. 33Docker Swarm Guide Docker Swarm ‣ 役割 "Dockerホスト群をクラスタ化し、 どのホストでコンテナを起動するのか コンテナをスケジュールするためのツール" クラスタ全体を1つのリソース・プールとして扱う Docker の API と互換性を持つ • docker ps や run 等のコマンドを Swarm 全体に対して適用できる • どコンテナを置く(スケジュール)方針がアフィニティとフィルタ もう一度簡単に整理します。 他のコンテナ・クラスタ管理 ツールとの一番大きな違いは Docker APIの互換性です。 クライアントのdockerコマンド がクラスタに対しても使えます。
  34. 34. docker engine (docker daemon) machine docker client $ docker run コンテナ コンテナ $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" TCP:2375 TCP:2376 DOCKER_OPTS="-H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem” DOCKER_OPTS=“-H tcp://0.0.0.0:2375 –H unix:///var/run/docker.sock” 1台のDocker環境の操作なら まだしも…
  35. 35. docker engine (docker daemon) machine docker client $ docker run コンテナ コンテナ docker engine (docker daemon) machine コンテナ コンテナ docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine コンテナ コンテナ コンテナ $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" TCP:2375 TCP:2376 DOCKER_OPTS="-H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem” DOCKER_OPTS=“-H tcp://0.0.0.0:2375 –H unix:///var/run/docker.sock” 通常、複数Docker環境の操作は 環境変数の切り替えが都度行う 必要があります。面倒です。
  36. 36. Swarm Manager machine docker client $ docker run $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" $ docker run –d –P swarm manage ¥ token://<token> docker engine (docker daemon) Docker互換 API コンテナの配置を スケジューリング 対してSwarmは、まずmanager (マネージャ)を準備します。 Dockerデーモンに代わり、同じ インターフェースで操作します。
  37. 37. Swarm Manager machine docker client $ docker run docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" $ docker run –d –P swarm manage ¥ token://<token> docker engine (docker daemon) Docker互換 API コンテナの配置を スケジューリング docker machine でデプロイ/プロビジョニング ディスカバリ・バックエンド 例;DockerHub 次にDocker Machineを使うか、 あるいは手動でDocker動作環境 を構築します。
  38. 38. Swarm Manager machine docker client $ docker run docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" $ docker run –d –P swarm manage ¥ token://<token> docker engine (docker daemon) Docker互換 API コンテナの配置を スケジューリング docker machine でデプロイ/プロビジョニング ディスカバリ・バックエンド 例;DockerHub ディスカバリ・バックエンドに 自分のノード情報の登録(join) します。正確にはSwarmという エージェントを起動します。 join join join join
  39. 39. Swarm Manager machine docker client $ docker run docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" $ docker run –d –P swarm manage ¥ token://<token> docker engine (docker daemon) Docker互換 API コンテナの配置を スケジューリング docker machine でデプロイ/プロビジョニング ディスカバリ・バックエンド 例;DockerHub 登録された情報は、マネージャ に送信され、マネージャが各 ノードを管理できるようになり、 Swarmはバックエンド監視対象 となります。
  40. 40. Swarm Manager machine docker client $ docker run docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" $ docker run –d –P swarm manage ¥ token://<token> docker engine (docker daemon) Docker互換 API リソース・プール コンテナの配置を スケジューリング docker machine でデプロイ/プロビジョニング ディスカバリ・バックエンド 複数のノードが、1つの環境 (リソース・プール)として 見えるようになります。
  41. 41. Swarm Manager machine docker client $ docker run docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine コンテナ $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" $ docker run –d –P swarm manage ¥ token://<token> docker engine (docker daemon) コンテナ コンテナ コンテナ コンテナ Docker互換 API リソース・プール ストラテジ フィルタ • spread • binpack • randam • constraint • affinity • port • dependency • health コンテナの配置を スケジューリング docker machine でデプロイ/プロビジョニング ディスカバリ・バックエンド あとはストラテジとフィルタで コンテナをスケジュールします。
  42. 42. 42Docker Swarm Guide Discovery Backends ‣ ディスカバリ・バックエンドとは? Docker Swarm 向けのサービス・ディスカバリ • ホステッド・ディスカバリ ( Docker Hub 経由;Docker社提供 ) • etcd • consul • Zookeeper • リスト $ swarm manage token://<token> $ swarm manage etcd://<ip>/<prefix> $ swarm manage consul://<ip>/<prefix> $ swarm manage zk://<ip>/<prefix> $ swarm manage file:///etc/swarm.list Docker Swarm discovery https://docs.docker.com/swarm/discovery/ それでは1つ1つのSwarm独自 概念についてみていきます。 まずはバックエンドです。 Swarmマネージャはノード情報 を基本的に管理しません。 それらはバックエンドの仕事。
  43. 43. Swarm Manager machine docker engine (docker daemon) machine docker engine (docker daemon) ディスカバリ・バックエンド hosted ( Docker Hub ) docker run swarm create docker run –d –P ¥ swarm manage token://<token> token自動発行 docker run -d swam join ¥ --addr=<node ip>:<node port> ¥ token://<token> 1 2 3 4 5 ノード認識・manager認識 Swarmクラスタ構成の流れです。
  44. 44. 44Docker Swarm Guide 3つのスケジューリング・ストラテジ ‣ Spread • コンテナの稼働数に応じてノードをランク付けし、スケジュールする • コンテナ数が同じ場合は、ランダムにノードを選択 • デフォルト ‣ Binpack • コンテナを少ないノードに集約する • リソースが足りなくなるまで使用(リソースの指定が必須) ‣ Random • ランダムにスケジュール先のノードを選択 次に、どのようにコンテナ配置 (スケジュール)するかの種類 と設定方法をみていきます。
  45. 45. 45Docker Swarm Guide ‣ manager起動時のオプションで指定 スケジュールの設定方法 $ docker run -d -P swarm manage token://<token> --strategy spread $ docker run -d -P swarm manage token://<token> --strategy binpack $ docker run -d -P swarm manage token://<token> --strategy random マネージャ起動時に設定します。 省略時は"spread"です。
  46. 46. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ Spread Strategy 幅広く処理を分散することができる 多くのノードがある場合に有用 Spreadは、まず始めにランダム で1つのスケジュール先を決め ます。
  47. 47. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ Spread Strategy 幅広く処理を分散することができる 多くのノードがある場合に有用 あとは、各ノードのコンテナ数 が一緒になるまで展開します。 コンテナ
  48. 48. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ Spread Strategy 幅広く処理を分散することができる 多くのノードがある場合に有用 3台のDocker環境であれば、 それぞれコンテナ数が一致する まで広がり(spread)ます。 コンテナ machine docker engine (docker daemon) コンテナ
  49. 49. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ Spread Strategy 幅広く処理を分散することができる 多くのノードがある場合に有用 あとは・・・ コンテナ machine docker engine (docker daemon) コンテナ コンテナ
  50. 50. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ Spread Strategy 幅広く処理を分散することができる 多くのノードがある場合に有用 これの・・・ コンテナ machine docker engine (docker daemon) コンテナコンテナ コンテナ コンテナ
  51. 51. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ Spread Strategy 幅広く処理を分散することができる 多くのノードがある場合に有用 繰り返し。 コンテナ machine docker engine (docker daemon) コンテナコンテナ コンテナ コンテナコンテナ
  52. 52. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ Spread Strategy 幅広く処理を分散することができる 多くのノードがある場合に有用 繰り返し。 コンテナ machine docker engine (docker daemon) コンテナコンテナ コンテナ コンテナコンテナコンテナ コンテナ
  53. 53. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ binpack Strategy リソースを有効活用することができる 使われないマシンは増えないが、ダウンすると影響が大きい docker run –m 512MB 一方のbinpackは必ずコンテナ リソースを明示しなくては適用 されないので注意が必要です。
  54. 54. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ コンテナ コンテナ コンテナ binpack Strategy リソースを有効活用することができる 使われないマシンは増えないが、ダウンすると影響が大きい docker run –m 512MB 1つのノードのリソース上限に 達してから、
  55. 55. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ コンテナコンテナ コンテナ コンテナ binpack Strategy リソースを有効活用することができる 使われないマシンは増えないが、ダウンすると影響が大きい docker run –m 512MB ようやく次のノードの利用を 開始します。
  56. 56. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ コンテナコンテナ コンテナコンテナ コンテナコンテナ コンテナ binpack Strategy リソースを有効活用することができる 使われないマシンは増えないが、ダウンすると影響が大きい docker run –m 512MB あとは、こちらもやはり同じ 繰り返しです。 あとの、ランダムストラテジは、 ランダムに決定されます。 以上がストラテジでした。
  57. 57. 57Docker Swarm Guide 5つのフィルタ ‣ フィルタの役割 どこのDockerホスト上でコンテナを起動するのかを指定 コンテナのスケジューリング時に、ストラテジよりも優先する条件 ‣ フィルタの種類 • Constraint(制約)…任意のラベルまたは標準Constraint • Affinity…コンテナの稼働やイメージの有無 • Port…ポートの使用有無 • Dependency…リンクやボリュームの依存関係 • Health…障害(通信できない)ノードの除外 もう1つ、ストラテジの他に、 コンテナのスケジュールに影響 あるのがフィルタです。
  58. 58. 58Docker Swarm Guide ‣ ノードのラベル(任意で設定可) • docker –d --label region=tokyo --storage=ssd • docker run –d –e constraint:region==tokyo nginx ‣ standard constraint(固定) • docker info で表示される情報 • Storage Driver, Execution Driver, Kernel Version, Operating System ‣ node constraint • docker run –d –e constraint:node==node1 nginx • docker run –d –e constraint:node!=node1 nginx Constraint フィルタ 1つめは、Dockerのノード固有 情報でスケジュールするフィル タです。Constraintは、日本語 で「制約」や「拘束」という意 味があります。
  59. 59. 59Docker Swarm Guide ‣ コンテナやイメージの有無でフィルタ node2という名前のコンテナが稼働している • docker run –d –e affinity:container==node2 mysql tomcat:6または7のイメージを持っている • docker run –d –e affinity:image==tomcat:[67] tomcat Affinity フィルタ 既に稼働しているコンテナや、 イメージがダウンロード済みの 環境を指定できます。 名前は正規表現も指定できます。
  60. 60. 60Docker Swarm Guide ‣ ポートが利用可能なノードを自動的に割り当て • docker run –d –p 80:80 nginx Port フィルタ ポートが使用されていない環境 で自動的に起動します。
  61. 61. 61Docker Swarm Guide ‣ 依存関係がある場合、自動的に同じノードで起動 • ボリューム ( --volumes-from ) • リンク ( --link ) ‣ 注意点 • 複数の依存関係がある場合、条件に一致しない場合は (例:既に異なったノード上で動いている) コンテナはスケジュール不可=起動できません 依存関係フィルタ 依存関係というよりは、事実上 の制約であり、仕様です。。。 これを知らないとハマります。 あと「health」は正常性であり、 Swamとの通信ができない環境は、 スケジュール先から自動的に 除外されます。
  62. 62. Docker Swam の操作 3■■■ Operations with Docker Swarm それでは、実際の操作をみて いきます。
  63. 63. Swarm Manager machine docker engine (docker daemon) machine docker engine (docker daemon) ディスカバリ・バックエンド hosted ( Docker Hub ) docker run swarm create docker run –d –P ¥ swarm manage token://<token> token自動発行 docker run -d swam join ¥ --addr=<node ip>:<node port> ¥ token://<token> 1 2 3 4 5 ノード認識・manager認識
  64. 64. 64Docker Swarm Guide 方法1:手動でのManager起動 Swarm Manager manager docker engine (docker daemon) Swarm node node1 docker engine (docker daemon) Swarm node node2 docker engine (docker daemon) 128.199.85.219 188.166.252.158 103.253.146.176
  65. 65. Swarm Manager manager docker engine (docker daemon) 128.199.85.219 root@manager:~# docker run --rm swarm create Unable to find image 'swarm:latest' locally latest: Pulling from library/swarm 28d9e4361d1b: Pull complete d6d187f38730: Pull complete 009ef5e8bff4: Pull complete 2c15723f36b9: Pull complete 207689e26fb2: Pull complete efff5eea5f34: Pull complete 7823bc4f62a4: Pull complete 207e8b983242: Pull complete library/swarm:latest: The image you are pulling has… Digest: sha256:1502dd0c1d778d4f5e75d47820dd858ac1f6… Status: Downloaded newer image for swarm:latest 7546a86262b847f7f34785ab2e0d6118
  66. 66. Swarm Manager manager docker engine (docker daemon) 128.199.85.219 root@manager:~# docker run -d -P swarm manage ¥ token://7546a86262b847f7f34785ab2e0d6118 0477faab5932855d672411e69d9d97f48a852339cd4429be9ac25242db81a4e3 root@manager:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0477faab5932 swarm "/swarm manage token:" 4 seconds ago Up 3 seconds 0.0.0.0:32768->2375/tcp trusting_mcclintock
  67. 67. root@manager:~# docker info Containers: 1 Images: 8 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 10 Dirperm1 Supported: false Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 3.13.0-57-generic Operating System: Ubuntu 14.04.3 LTS CPUs: 1 Total Memory: 490 MiB Name: manager ID: Y53K:LHHC:7THY:5FJF:I5HW:AJR3:EHKH:23BG:J5H3:JERR:2OKS:D4F7 WARNING: No swap limit support Labels: provider=digitalocean root@manager:~# docker -H tcp://127.0.0.1:32768 info Containers: 0 Images: 0 Role: primary Strategy: spread Filters: affinity, health, constraint, port, dependency Nodes: 0 CPUs: 0 Total Memory: 0 B Name: 0477faab5932 export DOCKER_HOST=127.0.0.1:<port> 同じdockerコマンドでも、左は Dockerデーモン、右はSwarmに 対して問い合わせた結果です。 表示内容が異なっています。 また、-H オプションは毎回 指定が大変なので、環境変数で 置き換えられます。
  68. 68. Swarm node node1 docker engine (docker daemon) 188.166.252.158 root@node1:~# docker run -d swarm join ¥ --addr=188.166.252.158:2375 ¥ token://7546a86262b847f7f34785ab2e0d6118 root@manager:~# docker run swarm list token://7546a86262b847f7f34785ab2e0d6118 188.166.252.158:2375 root@manager:~# docker -H tcp://127.0.0.1:32768 info Containers: 4 Images: 1 Role: primary Strategy: spread Filters: affinity, health, constraint, port, dependency Nodes: 1 node1: 188.166.252.158:2375 m Containers: 4 m Reserved CPUs: 0 / 1 m Reserved Memory: 0 B / 514.5 MiB m Labels: executiondriver=native-0.2, kernelversion=3.13.0-57-generic, operatingsystem=Ubuntu 14.04.3 LTS, provider=digitalocean, storagedriver=aufs CPUs: 1 Total Memory: 514.5 MiB Name: 0477faab5932 join時のポートとアドレスは、 マネージャではなく、この ノード自身の追加が必要です。
  69. 69. Swarm node node2 docker engine (docker daemon) 103.253.146.176 root@node2:~# docker run -d swarm join ¥ --addr=103.253.146.176:2375 ¥ token://7546a86262b847f7f34785ab2e0d6118 $ docker run swarm list .. 103.253.146.176:2375 188.166.252.158:2375 Containers: 9 Images: 2 Role: primary Strategy: spread Filters: affinity, health, constraint, port, dependency Nodes: 2 node1: 188.166.252.158:2375 m Containers: 4 m Reserved CPUs: 0 / 1 m Reserved Memory: 0 B / 514.5 MiB m Labels: executiondriver=native-0.2, kernelversion=3.13.0-57-generic, operatingsystem= Ubuntu 14.04.3 LTS, provider=digitalocean, storagedriver=aufs node2: 103.253.146.176:2375 m Containers: 5 m Reserved CPUs: 0 / 1 m Reserved Memory: 0 B / 514.5 MiB m Labels: executiondriver=native-0.2, kernelversion=3.13.0-57-generic, operatingsystem= Ubuntu 14.04.3 LTS, provider=digitalocean, storagedriver=aufs CPUs: 2 Total Memory: 1.005 GiB Name: 0477faab5932 こちらは2台目です。 なお、addrはノード監視のため、
  70. 70. 70Docker Swarm Guide 方法2:docker-machineを使う – VirtualBox https://docs.docker.com/machine/get-started-cloud/ zem@dev:~$ docker run swarm create 3efff548bf670a29f3edfaf50cb89b02 $ docker-machine create ¥ --driver digitalocean ¥ --digitalocean-access-token 1b710a107aa0c78eac51f7baacc7d87 ¥ --digitalocean-region sgp1 ¥ --swarm ¥ --swarm-master ¥ --swarm-discovery token://3efff548bf670a29f3edfaf50cb89b02 ¥ swarm-master 最近では、こちらの方法で非常 に簡単に構築できます。例とし てDigialOceanを紹介していま すが、他のクラウド環境でも同 様に利用可能です。
  71. 71. 71Docker Swarm Guide Docker Machineで Swarm ノード追加 $ docker-machine create ¥ --driver digitalocean ¥ --digitalocean-access-token 1b710a107aa0c78eac51f7baacc7d87 ¥ --digitalocean-region sgp1 ¥ --swarm ¥ --swarm-discovery token://3efff548bf670a29f3edfaf50cb89b02 ¥ swarm-node-01 先ほどとの違いは、マスタ作成 フラグがないだけです。
  72. 72. $ docker-machine env --swarm swarm-master $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM swarm-master digitalocean Running tcp://128.199.179.153:2376 swarm-master (master) swarm-node-01 digitalocean Running tcp://128.199.157.183:2376 swarm-master $ docker info Swarm Manager node swarm-master docker engine (docker daemon) Swarm node node-01 docker engine (docker daemon) VM docker machine hosted discovery (token)
  73. 73. Docker Machineを使えばコント ロール・パネルにログインしな くても、自動的に環境が構築さ れますし、削除もできます。
  74. 74. zem@dev:~$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM manager digitalocean Running tcp://128.199.85.219:2376 node1 digitalocean Running tcp://188.166.252.158:2376 node2 digitalocean Running tcp://103.253.146.176:2376 swarm-master digitalocean Running tcp://128.199.179.153:2376 swarm-master (master) swarm-node-01 digitalocean Timeout swarm-node-02 digitalocean Running tcp://188.166.252.45:2376 swarm-master zem@dev:~$ docker run -d nginx 34d71ac79d1b6e9b7f2c136c52dcbd4b9f886b61e376bf72f1e893197e85c556 zem@dev:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 34d71ac79d1b nginx "nginx -g 'daemon off" 4 seconds ago Up 3 seconds 80/tcp, 443/tcp swarm-node-01/romantic_pike "SWARM"列でDocker Machineの 管理対象かどうか確認出来ます。 あとは「docker run」で起動す ると、コンテナ名には自動的に 「Swarmノード名称/」も表示さ れて見えます(clientがSwarm に問い合わせたときのみ)。
  75. 75. zem@dev:~$ docker-machine ssh swarm-node-01 Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-57-generic x86_64) * Documentation: https://help.ubuntu.com/ System information as of Fri Sep 25 23:53:04 EDT 2015 System load: 0.76 Processes: 70 Usage of /: 8.0% of 19.56GB Users logged in: 0 Memory usage: 15% IP address for eth0: 128.199.157.183 Swap usage: 0% IP address for docker0: 172.17.42.1 Graph this data and manage this system at: https://landscape.canonical.com/ root@swarm-node-01:~# root@swarm-node-01:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 34d71ac79d1b nginx "nginx -g 'daemon off" 59 seconds ago Up 58 seconds 80/tcp, 443/tcp romantic_pike 2d1a62fbc9e1 swarm:latest "/swarm join --advert" 2 hours ago Up 2 hours 2375/tcp swarm-agent docker-machneと連携していれ ば、各Swarmノードへの状況把 握も「ssh」コマンドを使って 簡単になります。
  76. 76. 77Docker Swarm Guide 環境構築まとめ ‣ docker swarm コンテナ • hosted discovery • マネージャの起動 • クライアントをtokenでjoinする ‣ Docker Machine で Swarm クラスタ作成 • 環境構築が簡単 スケジューリングのための言葉 (ディスカバリ・バックエンド、 ストラテジ、フィルタ)があり ますが、その他は基本的に通常 のDockerクライアントと同様の 操作になります。
  77. 77. 今日のまとめ Wrap up
  78. 78. 79 今日のまとめ 今日から始める Docker Swarm ‣ Docker オーケストレーション Docker を支えるオーケストレーションと各ツールの役割 ‣ Swarm を使ったコンテナ/クラスタ管理 Swarm クラスタの構築方法 … Manager とノード 主要なコマンドは docker と同じ ストラテジの理解 … spread と binpack と Random フィルタ … コンテナをどこに配置するか • Constraint, Affinity, Port, Dependency, Health
  79. 79. Swarm Manager machine docker client $ docker run docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine コンテナ $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" $ docker run –d –P swarm manage ¥ token://<token> docker engine (docker daemon) コンテナ コンテナ コンテナ コンテナ Docker互換 API リソース・プール ストラテジ フィルタ • spread • binpack • randam • constraint • affinity • port • dependency • health コンテナの配置を スケジューリング docker machine でデプロイ/プロビジョニング ディスカバリ・バックエンド
  80. 80. 81 現在の Swarm 課題 今日から始める Docker Swarm ‣ 目下開発中 • Version 0.4 まだベータ版の扱い ‣ Swarmそのものが何かをする訳ではない • あくまでクラスタ管理を手助けするもの、でも今後は…? ‣ 別のアプローチ • Kubernetes, OpenShift, Tectonic, Rancher まだまだ課題はあります。目的 によっては、別のアプローチを お試しいただくのも良いかと思 います。あくまでSwarmとは、 コンテナ管理の選択肢の1つ です。
  81. 81. Swarm Swarm(スウォーム)よ! スワームじゃないわ! そこのところも宜しく頼むわねっ! クラスタ管理 まだ登場したばかりのSwarm。 今後の成長(改造)に期待です。
  82. 82. 83 何か気になることはありますか? ■会場からの質問と回答(個人的見解) • Docker Plugins はどうなるのでしょうか? • 流動的ですが、Weaveは1.9にマージかも • Docker Swarm の利点は、dockerコマンドと同様に リソース全体を操作できる点ですか? • その通りだと思います。 • フェイルオーバー等は対応しないのか? • おそらく、そこはSwarmが管理しないレイヤ。 ただし、将来的にMachine,Compose,Swarmが 連携するのであれば、機能的に実現できるかも しれません。今は個別のツール開発の段階です。 • どうやってスライドの画像を作っていますか? • エンジニアのためのプレゼン勉強会、 次回 10/10(土) 14:00 からあります! • http://infrapre.connpass.com/
  83. 83. 84 ‣ Docker ドキュメント http://docs.docker.com/ ‣ Docker Machine https://docs.docker.com/machine/ ‣ docker-machine - Docker Machine ドキュメント参考日本語訳 - Qiita http://qiita.com/zembutsu/items/9d189da5d2c7708717a3 ‣ Docker Swarm https://docs.docker.com/swarm/ ‣ DockerSwarm - Docker Swarm ドキュメント参考日本語訳 目次 - Qiita http://qiita.com/zembutsu/items/a1f0a89581d1d5832e2e ‣ Docker Compose https://docs.docker.com/compose/ ‣ docker-compose - Docker Compose ドキュメント参考日本語訳 概要・目次 - Qiita http://qiita.com/zembutsu/items/c277830c469d7a25ba15 参考情報 References
  84. 84. 背景画像CREDIT:rvika/ PIXTA(ピクスタ) https://pixta.jp/@prof261092 予告? 時間切れだったので、いつかまた、どってかで!

×