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 Compose/Swarm 入門

15,078 views

Published on

「Docker Machine/Compose/Swarm」を使ってみよう 発表資料
https://sakura-kanto.doorkeeper.jp/events/36134
日時:2016年1月22日(金)19:00~21:00
会場:さくらインターネット 西新宿セミナールーム@東京・西新宿

対象:Dockerに関心がありDocker Machine/Compose/Swarmを触った事がない人

Published in: Software

今だからこそ知りたい Docker Compose/Swarm 入門

  1. 1. 今 だ か ら こ そ 知 り た い Docker Compose/Swarm入門 2016年1月21日(金) @zembutsu Technology Evangelist; Creationline, Inc. Introduction to Docker Compose and Swarm 背景画像CREDIT:スフィア / PIXTA(ピクスタ)
  2. 2. 2 スライドで得られる知識 今だから知りたい Docker Compose/Swarm 入門 ‣ Docker Engine と Docker Compose の違い • 管理対象のコンテナが1つか複数なのか • ローカルの開発環境なのか、それともデプロイ先なのか ‣ Docker Swarm がスケジューリングを管理 • スケジューリングとは、コンテナをどこに配置するのかを管理 ‣ Engine/Swarm/Composeは三位一体
  3. 3. 「Docker Machine 環境構築(わかる)」 「Docker Swarm? Compose??」 という疑問を解決していきます。
  4. 4. 2015年2月 v1.5.0 v0.1.0 v1.1.0v0.1.0 experimental experimental Machine・Compose・Swarmは オープンになってから、ようやく 1年を迎えようとしています。 役割が曖昧な印象でしたが… Docker Engine Docker Machine Docker Swarm Docker Compose
  5. 5. 2016年1月 v1.9.1 v0.5.6 v1.5.2v1.0.1 Docker Engine Docker Machine Docker Swarm Docker Compose βバージョンも外れ、ようやく各 ツールの繋がりが見えてきました。
  6. 6. そもそも、なぜ Docker なのか? どうして Compose が必要なのか? Swarm? Machine? 今だからこそ各ツールの役割を あらためて整理してみましょう。
  7. 7. ツールは分かれています。でも 考えのヒントになるのが…
  8. 8. こんな関係性なのかな?とも。 答え合わせは、後ほど。
  9. 9. Dockerコンテナとイメージ入門 1■□□□ What is Docker? その前に、Dockerコンテナって そもそも何でしたっけ?を復習。
  10. 10. サーバ OS のカーネル空間 Docker サーバ ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス ユーザ空間 ユ ー ザ プ ロ セ ス ユーザ空間 • Cgroups • Namespaces  mount  UTS  IPC  PID  Network  User コンテナ https://hub.docker.com/ Docker Hub (レジストリ) Docker クライアント "docker" デーモン TCP:2375,TCP:2376(TSL),UnixSocket Ubuntu レポジトリ MySQL レポジトリ tag:latest tag:14.04 … tag:latest tag:5.7 …docker run … Docker コンテナ
  11. 11. サーバ OS のカーネル空間 Docker サーバ ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス ユーザ空間 コンテナ Docker クライアント "docker" デーモン TCP:2375,TCP:2376(TSL),UnixSocket docker run … Dockerコンテナとはプロセスの 1つ1つを隔離して起動すること。 正確には「隔離」または「分離」 する(英語のisolate)のは、単に プロセスだけではありません。 ファイルシステムを(chroot風に) マウントし、ネットワークを持ち、 メモリやCPUリソースの上限を 設定できます。Linuxカーネルの 機能を使います。 あくまでもDockerのホスト側から は単純にプロセスが起動してい るだけですし、ファイルシステム が見えるにすぎません。 もう1つ重要な概念が、Docker イメージです。Dockerコンテナ の実行とは、Dockerイメージ上 のプロセスを実行することでもあ るのです。もしイメージが手許 になければ…?
  12. 12. サーバ OS のカーネル空間 Docker サーバ ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス ユーザ空間 ユーザ空間 • Cgroups • Namespaces  mount  UTS  IPC  PID  Network  User コンテナ https://hub.docker.com/ Docker Hub (レジストリ) Docker クライアント "docker" デーモン TCP:2375,TCP:2376(TSL),UnixSocket Ubuntu レポジトリ MySQL レポジトリ tag:latest tag:14.04 … tag:latest tag:5.7 …docker run … レジストリ(DockerHub等)から イメージをダウンロードします。 そして、その中に含まれるプロ セスを、Dockerコンテナとして 実行するものでした。
  13. 13. • Cgroups • Namespaces  mount  UTS  IPC  PID  Network  User そして、そのプロセスの実行を コンテナを実行していると表現し、 プロセスが停止するとコンテナ も停止しているものと扱います。
  14. 14. zem@dev:~$ docker run -ti ubuntu /bin/bash root@bdf6207621c7:/# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 01:11 ? 00:00:00 /bin/bash root 16 1 0 01:11 ? 00:00:00 ps -ef root@bdf6207621c7:/# コ ン テ ナ 内 の プ ロ セ ス Dockerコンテナ内のプロセスは PIDが「1」です。各々のコンテ ナは、全てPID「1」として動作 します。
  15. 15. Dockerコンテナ内のプロセスは PIDが「1」です。しかし、ホス ト側からは、通常のPIDを持って います。これはマジックミラーの ようなものです。ホスト側から は見えますが、コンテナABは 互いのことが見えません。 /sbin/init PID 1 alice PID 2 bob PID 3 docker PID 4 httpd PID 1 コンテナA コンテナB ruby PID 1 chris.rb PID 2 httpd PID 5 chris.rb PID 7 ruby PID 6
  16. 16. (汗 どこで、どうやって Docker を使うのか? 次に使いどころ。開発環境コード を社内共有サーバやクラウド環境 上で動かすには、コードをscpや FTPで送るだけではありません。 ミドルウェアやライブラリを構築 するため、ChefやPuppetなどの 構成管理ツールを組みあわせる のが効果的です。しかし、構築 には時間がかかりがちですし、 正確にデプロイされたかどうか、 確認する必要があります。
  17. 17. (汗 どこで、どうやって Docker を使うのか? Dockerなら、Dockerイメージを コピーするだけで簡単に動作。
  18. 18. Z氏の場合 Munin 3.0.0b1 l o c a l P C sudo apt-get update sudo apt-get install git git clone git://github.com/munin-monitoring/munin cd munin perl Build.PL sudo apt-get install gcc pkg-config libssl-dev build-essential sudo apt-get install expat libexpat1 libexpat1-dev libexpat1-dev sudo apt-get install libxml2-dev libxml-libxml-perl libcairo-gobject-perl libglib2.0-dev libglib-perl sudo apt-get install libcairo-perl libcairo-gobject-perl libgraphics-primitive-driver-cairo-perl sudo apt-get install libcairo2-dev libpango1.0-dev sudo cpan -i XML::Parser XML::Dumper sudo cpan -i Alien::RRDtool sudo cpan -i Test::Class Test::MockModule Test::MockObject Test::LongString Test::Differences sudo cpan -i File::Slurp sudo ./Build installdeps ./Build test sudo ./Build installe cd /usr/local/etc/munin/ sudo mkdir /usr/local/etc/munin/plugins sudo cp munin.conf.sample munin.conf sudo cp munin-node.conf.sample munin-node.conf sudo munin-node-configure --shell --families=contrib,auto | sh -x リ モ ー ト の サ ー バ もしもDockerがなければ…たと えば、ある監視ツールの開発版 は環境構築に手間が掛かります。 リモート環境でも使う場合は、 手順を繰り返す必要があります が…これが Docker化できれば
  19. 19. Z氏の場合 Munin 3.0.0b1 l o c a l P C sudo apt-get update sudo apt-get install git git clone git://github.com/munin-monitoring/munin cd munin perl Build.PL sudo apt-get install gcc pkg-config libssl-dev build-essential sudo apt-get install expat libexpat1 libexpat1-dev libexpat1-dev sudo apt-get install libxml2-dev libxml-libxml-perl libcairo-gobject-perl libglib2.0-dev libglib-perl sudo apt-get install libcairo-perl libcairo-gobject-perl libgraphics-primitive-driver-cairo-perl sudo apt-get install libcairo2-dev libpango1.0-dev sudo cpan -i XML::Parser XML::Dumper sudo cpan -i Alien::RRDtool sudo cpan -i Test::Class Test::MockModule Test::MockObject Test::LongString Test::Differences sudo cpan -i File::Slurp sudo ./Build installdeps ./Build test sudo ./Build installe cd /usr/local/etc/munin/ sudo mkdir /usr/local/etc/munin/plugins sudo cp munin.conf.sample munin.conf sudo cp munin-node.conf.sample munin-node.conf sudo munin-node-configure --shell --families=contrib,auto | sh -x リ モ ー ト の サ ー バ zembutsu/muinin3 Dockerfile D o c k e r H u b docker push zembutsu/muinin3 docker pull zembutsu/muinin3 docker run docker commit docker bulid 環境の再現が簡単。 イメージを複製するだけ。
  20. 20. l o c a l P C l o c a l P C l o c a l P C G i t H u b D o c k e r H u b B i t B u c k e t git add … git push origin master autobuild webhook さらに、GitHubと連携できるだ けでなく、イメージを補完する DockerHubのWebhookと連携し 様々な自動処理の応用も。
  21. 21. サーバ OS のカーネル空間 Docker サーバ ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス ユーザ空間 ユ ー ザ プ ロ セ ス ユーザ空間 • Cgroups • Namespaces  mount  UTS  IPC  PID  Network  User コンテナ https://hub.docker.com/ Docker Hub (レジストリ) Docker クライアント "docker" デーモン TCP:2375,TCP:2376(TSL),UnixSocket Ubuntu レポジトリ MySQL レポジトリ tag:latest tag:14.04 … tag:latest tag:5.7 …docker run … Docker イメージ あともう1つ。重要なイメージの 概念についてお復習いします。
  22. 22. ベース・イメージ (公式) Ubuntu, CentOS等 イメージ層 コマンドごとに記録 Docker イメージの構造 読み込み専用 (Read Only) Dockerイメージの実体は、単純 にファイルやメタデータの集合。
  23. 23. ベース・イメージ (公式) Ubuntu, CentOS等 イメージ層 コマンドごとに記録 Docker イメージの構造 読み込み専用 (Read Only) その中身は、イメージ・レイヤが 重なっています。
  24. 24. Nginx イメージの構造 902b87aaaec9 3 months ago /bin/sh -c #(nop) ADD file:e1dd18493a216ecd0c 125.2 MB 9a61b6b1315e 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B aface2a79f55 3 months ago /bin/sh -c #(nop) MAINTAINER NGINX Docker Mai 0 B 5dd2638d10a1 3 months ago /bin/sh -c apt-key adv --keyserver hkp://pgp. 1.997 kB 97df1ddba09e 3 months ago /bin/sh -c echo "deb http://nginx.org/package 221 B e7e7a55e9264 10 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.9.4-1~j 0 B 72b67c8ad0ca 10 weeks ago /bin/sh -c apt-get update && apt-get inst 7.695 MB 9108e25be489 10 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx/ 11 B 6dda3f3a8c05 10 weeks ago /bin/sh -c ln -sf /dev/stderr /var/log/nginx/ 11 B 42d2189f6cbe 10 weeks ago /bin/sh -c #(nop) VOLUME [/var/cache/nginx] 0 B 3cb7f49c6bc4 10 weeks ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0 B a486da044a3f 10 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon o 0 B $ docker history nginx IMAGE CREATED CREATED BY SIZE COMMENT docker history <image id/name> たとえばNginxの場合は…
  25. 25. ベース・イメージ (公式) イメージ層 Docker コンテナを起動するとは 読み込み専用 (Read Only) ・新しいイメージ・レイヤの 自動的な割り当て ・隔離されたプロセスの起動 (コンテナ化された状態) docker run <opts> <image:tag> コンテナの起動は、イメージの 上に、新しくレイヤを追加します。
  26. 26. サーバ OS のカーネル空間 Docker サーバ ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス ユーザ空間 ユ ー ザ プ ロ セ ス ユーザ空間 • Cgroups • Namespaces  mount  UTS  IPC  PID  Network  User Dockerコンテナ https://hub.docker.com/ Docker Hub (レジストリ) Docker クライアント "docker" デーモン TCP:2375,TCP:2376(TSL),UnixSocket Ubuntu レポジトリ MySQL レポジトリ tag:latest tag:14.04 … tag:latest tag:5.7 …docker run … Dockerイメージ
  27. 27. OS ( Linux ) 物理/仮想サーバ Docker エンジン ( docker デーモン ) Linux kernel コンテナ コンテナ コンテナ リモート API docker クライアント ・docker コマンド ・Kitematic (GUI)
  28. 28. Docker動作環境の構築 ローカルで構築 リモートで構築 クラウドサービスの利用 Docker Machine (旧boot2docker) Docker社による バイナリ・パッケージ Amazon EC2 Container Service (ECS) IBM Bluemix Microsoft Azure Google Container Engine VirtualBox Windows or Mac OSX Virtual or Physical Linux Machine コミュニティによる バイナリ・パッケージ 商用サポート版 ソースコードからビルド + Docker Toolbox
  29. 29. 30 ここまでのキーワード ‣ Docker Engine • docker デーモン(サーバ) ‣ Docker コンテナ ‣ Docker イメージ • Dockerfile ‣ Docker Machine ‣ Docker Toolbox Docker(エンジン)とは、 環境をコンテナ化し、 移動・実行する仕組み を提供。しかも簡単な コマンドで操作できる。
  30. 30. Composeは複数環境を束ねる 2■■□□ Why we need to use Docker Engine and Docker Compose?
  31. 31. DockerHubから取得する コンテナをコミットする Dockerfileで構築する Dockerイメージを構築するには、 3つの方法があります。
  32. 32. 構築(build)とコミット(commit) との違いは、イメージの作成を 手動で行うか自動で行うかです。
  33. 33. 34 ‣ Dockerfile の役割 どのようなイメージにするか指示 • どのベース・イメージを使うのか? • 何のプログラムをインストールするのか? • どのようなコマンドを実行するのか ‣ docker build コマンドで構築 docker build –t <レポジトリ:タグ> <Dockerfileのパス> Dockerfile docker build イメージの自動構築 手動だと毎回大変ですし、ミス も発生しがち。でもDockerfile を使う自動構築であれば、だれ でも同じ環境を再現できます。
  34. 34. FROM ubuntu:14.04 RUN apt-get install -y wget CMD /usr/bin/wget FROM nginx ADD ./contents /usr/share/nginx/html FROM centos:7 MAINTAINER <自分の名前> RUN yum update -y RUN yum install -y epel-release RUN yum install -y nginx ADD index.html /usr/share/nginx/html/ EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ex1 ex2 ex3 Dockerfileのサンプルです。 書き方は簡単なものです。
  35. 35. 楽々構築できるよね^^
  36. 36. でも、WebとDBが別々の コンテナの場合は?^^; きっと、こんな疑問が思い浮かぶ のではないでしょうか。
  37. 37. Engine $ docker run … Dockerクライアントがエンジン (dockerデーモン)に対して、コン テナの実行を命令します。
  38. 38. Engine $ docker run … $ docker run …
  39. 39. Engine $ docker run … $ docker run … $ docker run …
  40. 40. Engine $ docker run … $ docker run … $ docker run … $ docker run … 毎回 docker run を実行するのは 面倒ですし、間違えそう…
  41. 41. そこで、先ほどの写真を思い出 してください。こちらは楽譜です。 Composeは「作曲」という意味が あります。楽譜は楽器のパート が並んでいて、あたかもコンテ ナの起動タイミングを指定してい るような印象。
  42. 42. Engine $ docker-compose up そこで「Compose」の出番です。 Dockerエンジンと通信して、複 数のコンテナの一斉起動や管理 を行えます。コマンドライン上の ツールであり、ある種のDocker クライアントとも言えるでしょう。
  43. 43. Engine $ docker-compose up そこで「Compose」の出番です。 Dockerエンジンと通信して、複 数のコンテナの一斉起動や管理 を行えます。コマンドライン上の ツールであり、ある種のDocker クライアントとも言えるでしょう。
  44. 44. 複数のコンテナをコードで管理 コンテナの同時起動・停止 コンテナのスケール ネットワーク機能に対応(1.6~)
  45. 45. Engine • docker run … • docker run –d • docker ps • docker logs … • docker stop … • docker restart • docker-compose up • docker-compose up –d • docker-compose ps • docker-compose logs • docker-compose stop • docker-compose restart どちらも docker をクライアントとして操作 dockerクライアントとCompose のコマンドは、非常に似ています。
  46. 46. ライブデモ @サクラクラウド
  47. 47. wordpress: image: wordpress links: - db:mysql ports: - 8080:80 db: image: mariadb environment: MYSQL_ROOT_PASSWORD: example WordPress 用の docker-compose.yml 例 参照:https://hub.docker.com/_/wordpress/ Dockerイメージの自動構築には 「Dockerfile」を使いました。 Composeの場合は YAML 形式の 設定ファイルを使います。こちら は WordPress の「wordpress」 「db」という2つのコンテナを起 動しようとしています。
  48. 48. ubuntu@docker:~/compose/wordpress$ docker-compose up -d Creating wordpress_db_1 Creating wordpress_wordpress_1 コンテナの起動 ubuntu@docker:~/compose/wordpress$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------- wordpress_db_1 /docker-entrypoint.sh mysqld Up 3306/tcp wordpress_wordpress_1 /entrypoint.sh apache2-for ... Up 0.0.0.0:8080->80/tcp ubuntu@docker:~/compose/wordpress$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5434bd0d803b wordpress "/entrypoint.sh apach" 28 seconds ago Up 27 seconds 0.0.0.0:8080->80/tcp wordpress_wordpress_1 9eb92d43fb64 mariadb "/docker-entrypoint.s" 28 seconds ago Up 27 seconds 3306/tcp wordpress_db_1 コンテナの状況を確認
  49. 49. mongo: image: mongo command: mongod --smallfiles --oplogSize 128 rocketchat: image: rocketchat/rocket.chat:latest environment: - PORT=3000 - ROOT_URL=http://localhost:3000 - MONGO_URL=mongodb://mongo:27017/rocketchat links: - mongo:mongo ports: - 3000:3000 Rocket.Chat 用の docker-compose.yml 例 参照:https://github.com/RocketChat/Rocket.Chat/blob/master/docker-compose.yml こちらはSlackのような環境を、 コマンド1つで実行できます。 チャット用のアプリと、MongoDB を簡単に実行できます。
  50. 50. ubuntu@docker:~/compose/rocketchat$ docker-compose up -d Creating rocketchat_mongo_1 Creating rocketchat_rocketchat_1 コンテナの起動 ubuntu@docker:~/compose/rocketchat$ docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------- rocketchat_mongo_1 /entrypoint.sh mongod --sm ... Up 27017/tcp rocketchat_rocketchat_1 node main.js Up 0.0.0.0:3000->3000/tcp ubuntu@docker:~/compose/rocketchat$ docker-compose logs Attaching to rocketchat_rocketchat_1, rocketchat_mongo_1 rocketchat_1 | Updating process.env.MAIL_URL rocketchat_1 | stop rendering 1625 rocketchat_1 | undefined rocketchat_1 | undefined (略) コンテナの状況を確認
  51. 51. あとはブラウザからポート3000 を開くと、このようにチャット画 面が表示されます。アプリケー ションの実行環境や、MongoDB の自動構築だけでなく、Hubot のセットアップも自動的に行えま す。Docker Composeがあれば、 複数のコンテナの環境も、簡単 に準備できるのが分かるでしょう。
  52. 52. 続きはウェブで…! http://docs.docker.jp/compose
  53. 53. 54 ‣ Docker Composeは 複数のサービスを管理 • docker コマンドと互換性 ‣ Compose ファイルで設定 • YAML形式 • docker-compose.yml 等 ここまでのまとめ まだ環境構築で 消耗してるの?
  54. 54. Engine • docker run … • docker run –d • docker ps • docker logs … • docker stop … • docker restart • docker-compose up • docker-compose up –d • docker-compose ps • docker-compose logs • docker-compose stop • docker-compose restart どちらも docker クライアントで操作可能
  55. 55. 複数のコンテナも 楽に管理できるね^^
  56. 56. あれ? 複数のサーバの場合は?^^; ですよねー。。
  57. 57. $ docker run … $ docker run … $ docker run … docker run をマシンごとに切り 替えて実行する必要があります。
  58. 58. $ docker run … $ docker run … $ docker run … でも、Docker Swarmは複数の Dockerとの通信を仲介できます。
  59. 59. Swarmはスケジューラ 3■■■□ Swarm is service scheduler.
  60. 60. $ docker run … $ docker run … $ docker run … Swarmを通して、どのサーバで どのコンテナを実行するか検討 し、Dockerにコンテナ起動を命 令します。これをコンテナのスケ ジューリング、と呼び、Swarmを スケジューラと呼びます。
  61. 61. サーバ ・Docker クライアント (Swarm操作) ・Docker Machine (環境構築) Swarm Manager サーバ swarm-master Dockerデーモン サーバ Swarm Agent サーバ swarm-node-01 Dockerデーモン サーバ Swarm Agent サーバ swarm-node-02 Dockerデーモン リモート 操作 コンテナの スケジュール SwarmはDockerエンジンとAPIの互換性があります。 つまり、dockerやdocker-composeコマンドから操作 可能です。通信先がDockerデーモンではなく、 Swarmマネージャに変わります。そして、配下の Dockerエンジンとコンテナの情報を一括管理します。
  62. 62. 例えると、指揮者(Swarm)が適 切な奏者(エンジン)に特定の曲 (コンテナ)を処理させているよう なものでしょうか。
  63. 63. コンテナのスケジューリング Docker API と互換性 ディスカバリ・バックエンドと連携 ネットワーク機能に対応
  64. 64. 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: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” なので、複数台あったとしても 都度クライアントで設定を切り替 える必要はありません。
  65. 65. 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 でデプロイ/プロビジョニング ディスカバリ・バックエンド
  66. 66. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ コンテナコンテナ コンテナコンテナ コンテナコンテナ コンテナ Spread Strategy 幅広く処理を分散することができる 多くのノードがある場合に有用 ストラテジはコンテナを起動する ための基本方針です。デフォル トは、この「スプレッド」です。 1 3 5 7 2 4 6 8コンテナ 起動順番
  67. 67. machine docker engine (docker daemon) machine docker engine (docker daemon) コンテナ コンテナコンテナ コンテナコンテナ コンテナコンテナ コンテナ binpack Strategy リソースを有効活用することができる 使われないマシンは増えないが、ダウンすると影響が大きい docker run –m 512MB 1 2 3 4 5 6 7 8コンテナ 起動順番 もう1つ「ビンパック」という概 念があります。日本語で言うと 箱詰めの意味です。
  68. 68. 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で独特の概念は、Docker クラスタのIPアドレスとポート番 号を管理する仕組みのことを 「ディスカバリ・バックエンド」と 呼びます。複数あります。
  69. 69. 70 ここまでのまとめ ‣ Docker Swarmとは • コンテナの配置(スケジューリング)を行う ‣ dockerクライアントで操作可能 • docker 互換 API を持つ • 環境変数で切り替え ‣ Docker Machineと連携が便利
  70. 70. 続きはウェブで…! http://docs.docker.jp/swarm
  71. 71. 続きはウェブで…! http://www.slideshare.net/zembutsu/introduction-to-docker-swarm
  72. 72. 三位一体Docker環境 4■■■■ TRINITY
  73. 73. Docker Swarm 分散サーバ上の コンテナ(サービス)を スケジューリング Docker Machine Docker Engine動作環境や 仮想マシン環境・Swarmクラスタを 自動的に構築・一元管理 Docker Compose 複数のサービスを 一括して管理 Docker Engine
  74. 74. 技術的な捕捉
  75. 75. Dockerの動作ホスト コンテナ コンテナ docker0 bridge eth0 eth0 IP: 172.17.0.2 IP: 172.17.0.2 IP: 172.17.0.1 Docker 1.8 以前のネットワーク ネットワーク機能強化はDocker エンジンだけでなく、Swarmや Composeにも影響を与えます。
  76. 76. Dockerの動作ホスト コンテナ コンテナ docker0 bridge eth0 eth0 IP: 172.17.0.2 IP: 172.18.0.10 IP: 172.17.0.2 IP: 172.18.0.11 IP: 172.17.0.1 任意 bridge IP: 172.18.0.1 デフォルトのブリッジ・ホスト ネットワーク ユーザ定義 ネットワーク Docker 1.9 からのブリッジ・ネットワーク eth1eth1 … 複数のブリッジを扱えるように なりました。
  77. 77. Dockerの動作ホスト コンテナ コンテナ docker0 bridge eth0 eth0 IP: 172.17.0.2 IP: 172.18.0.10 IP: 172.17.0.2 IP: 172.18.0.11 IP: 172.17.0.1 任意 bridge IP: 172.18.0.1 デフォルトのブリッジ・ホスト ネットワーク ユーザ定義 ネットワーク Docker 1.9 からのブリッジ・ネットワーク eth1eth1 … 「--link」機能は docker 0 ブリッジ のみ対応 「コンテナ名.net名」で 動的な名前解決可能に (リンク機能の代替) コンテナ間を接続する「リンク機 能」がレガシー扱いになりました。
  78. 78. オーバレイ・ネットワーク $ docker network create --driver overlay internal 172.17.0.2 172.17.0.3 172.18.0.5 192.168.0.3192.168.0.1 192.168.0.2 そして複数のサーバ間で同一の ネットワークを扱えるVXLANにも 対応しました。
  79. 79. swarm-kvs swarm-node0 (master) swarm-node1 $ docker … $ docker-compose … tcp://<ip>:2376 tcp://<ip>:2376tcp://<ip>:2376 $ docker-machine … docker docker docker KVS ( consul ) bridge overlaybridge(docker0) bridgeoverlay swam master コンテナ コンテナ コンテナ tcp:8500 eth0: 172.17.0.2 eth0: 172.17.0.2 eth0: 172.17.0.2 eth0: 172.17.0.5 eth0:172.17.0.4 eth1:172.18.0.2 eth1:172.18.0.3 Machine・Swarm・Composeを 組みあわせる環境の下地がよう やく整ってきました。Compose も 1.6 からネットワーク機能に 正式対応します。使い始めるな ら今ではないでしょうか。
  80. 80. Docker API Swarm Manager ディスカバリ・バックエンド リソース・プール スケジューラ fleet 他のスケジューラとの 連携も容易にします。
  81. 81. etcd: image: gcr.io/google_containers/etcd:2.0.13 container_name: etcd command: ['/usr/local/bin/etcd', '--bind-addr=0.0.0.0:4001', '--data-dir=/var/etcd/data'] apiserver: image: gcr.io/google_containers/hyperkube:v1.0.7 container_name: apiserver ports: - "8080" command: ["/hyperkube", "apiserver", "--service-cluster-ip-range=172.17.17.1/24", "--address=0.0.0.0", "--etcd_servers=http://etcd:4001", "--cluster_name=kubernetes", "--v=2"] controller: image: gcr.io/google_containers/hyperkube:v1.0.7 command: ["/hyperkube", "controller-manager", "--address=0.0.0.0", "--master=http://apiserver:8080", "--v=2"] environment: - "affinity:container==*apiserver*" scheduler: image: gcr.io/google_containers/hyperkube:v1.0.7 command: ["/hyperkube", "scheduler", "--address=0.0.0.0", "--master=http://apiserver:8080", "--v=2"] environment: - "affinity:container==*apiserver*" kubelet: image: gcr.io/google_containers/hyperkube:v1.0.7 command: ['/hyperkube', 'kubelet', '--containerized' , '--api_servers=http://apiserver:8080', '--v=2', '--address=0.0.0.0', '--enable_server'] volumes: - /:/rootfs:ro - /sys:/sys:ro - /dev:/dev - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/:/var/lib/docker:ro - /var/lib/kubelet/:/var/lib/kubelet:rw - /var/run:/var/run:rw privileged: true # A kubelet shouldn't run alongside another kubelet - One privileged kubelet per node environment: - "affinity:container!=*kubelet*" proxy: image: gcr.io/google_containers/hyperkube:v1.0.7 command: ['/hyperkube', 'proxy', '--master=http://apiserver:8080', '--v=2'] privileged: true # A proxy should run alongside another kubelet environment: - "affinity:container==*kubelet*" たとえば、これはKubernetes用 のDocker Composeファイルです。 これさえあれば…
  82. 82. 引用:Deploy and Manage Any Cluster Manager with Docker Swarm | Docker Blog http://blog.docker.com/2015/11/deploy-manage-cluster-docker-swarm/ こんなクラスタ環境も簡単に構築 管理できるようになるでしょう。 環境構築に時間をとられません。
  83. 83. 85 まとめ 今だから知りたい Docker Compose/Swarm 入門 ‣ Docker Engine と Docker Compose の違い • 管理対象のコンテナが1つか複数なのか • ローカルの開発環境なのか、それともデプロイ先なのか ‣ Docker Swarm がスケジューリングを管理 • スケジューリングとは、コンテナをどこに配置するのかを管理 ‣ Engine/Swarm/Composeは三位一体
  84. 84. 86 Docker Swarm 分散サーバ上の コンテナ(サービス)を スケジューリング Docker Machine Docker Engine動作環境や 仮想マシン環境・Swarm クラスタを自動的に構築・一元管理 Docker Compose 複数のサービスを 一括して管理 Docker Engine
  85. 85. 87 何か気になる所はありますか? 今だから知りたい Docker Compose/Swarm 入門 ‣ 日本語ドキュメントはこちら http://docs.docker.jp
  86. 86. 88 ‣ http://blog.docker.com • DockerCon 2015 Videos: Day 1 and Day 2 of Keynotes – http://blog.docker.com/2015/06/dockercon-2015-keynote-videos/ • Announcing Docker 1.7: Multi-host networking, plugins and orchestration updates – https://blog.docker.com/2015/06/announcing-docker-1-7-multi-host-networking-plugins-and- orchestration-updates/ • Extending Docker With Plugins – http://blog.docker.com/2015/06/extending-docker-with-plugins/ • Docker and Broad Industry Coalition Unite to Create Open Container Project – http://blog.docker.com/2015/06/open-container-project-foundation/ ‣ http://docs.docker.jp (日本語ドキュメント) 参考情報 References
  87. 87. 背景画像CREDIT:rvika/ PIXTA(ピクスタ) https://pixta.jp/@prof261092 @zembutsu Revision 2016.01 Dockerの誤解と疑問に答える 一問一答と技術Tips 最後にオマケ。 話の種にでも…
  88. 88. とし-でんせつ【都市伝説】 • 『友達の友達』など身近なようで実際には顔も名前も分からない人々に起きた出来事として 語られる奇妙な噂話(松山ひろし氏) • 本当にあったとして語られる『実際には起きていない話』(宇佐話通氏) • 都市を中心に伝播していく都市伝説には、いくつかの特徴が挙げられる。 1. 過去の事件、事故に由来する 2. 場所に由来する 3. 発祥が不確定、或いは特定しづらい • 都市伝説の内容はいかにもありそうな話が殆どであり、 教訓めいた要素が盛り込まれている事も多い。 【参考】都市伝説 - Wikipedia https://ja.wikipedia.org/wiki/都市伝説
  89. 89. "楽して地雷を避けたい" "都市伝説化" • 個人的な情報の伝達は「噂」 • 事実が確認されないままに情報が人々の間を伝達 【参考】「噂」も消費するパワーゾーン 渋谷「都市伝説」はこうして生まれる? - シブヤ経済新聞 http://www.shibukei.com/special/69/
  90. 90. 1. 導入前の疑問  Dockerは全てを解決しない(大前提) 2. 利用直後の困りどころ  ドキュメントを読もう 3. 運用面の課題  Docker以外の知見も必要
  91. 91. 1. Dockerは難しい 2. 今すぐ始めなくてはいけない 3. すべての環境をコンテナにしなくてはいけない 4. 仮想化システムは不要になる 5. 構成管理ツール(Chef,Puppet,Ansible等)は不要になる 6. VagrantがあればDockerは不要だ 7. Dockerは構成管理ツールを使っていれば不要だ 8. クラウド環境は不要になる 9. クラウド上でなければDockerの価値は無い 10. Windows上でLinuxのコンテナが動く 11. Dockerやコンテナが全てを解決してくれる 12. Docker であれば業務効率化できる 13. Docker があればコスト削減できる 14. Docker やコンテナを使うとベンダーロックインされる 15. いまあるシステムを、Dockerで作り直さなくてはいけない 16. システム・インテグレータにはコンテナは向かない 17. 閉じた環境では使えない・使う意味が無い 導入前の疑問
  92. 92. 18. 定番のOSが無い。どれを選ぶべきか分からない 19. よく落ちる 20. ネットワークが貧弱だ 21. データの可用性が貧弱 22. データベースが重い、使えない 23. データベースやキャッシュサーバの用途にDockerは向かない 24. Dockerはディスク容量を無駄に消費する 25. コンテナが止まるとログが記録されない 26. Dockerfileのビルドに毎回かなり時間がかかる 27. 複数のコンテナを立ち上げるのは大変だ 28. マシンを再起動すると、コンテナで動かしていたサービスをまた起動する必要があるので面倒 29. Docker Registryは不安定だ。使い物にならない。可用性が無い 30. 英語のドキュメントを読むのが大変だ。日本語の情報が古い 利用直後の困りどころ
  93. 93. 31. 本番環境では使えない 32. DockerにはSLAが無いから使えない 33. Dockerは冗長化できない 34. Dockerは(運用チームにとって)学習コストが高い 35. 商用サポートを受けられない 36. 1サーバ1コンテナで運用すべきだ 37. Docker は kubernetes がないと意味が無い 38. kubernetesがあればDockerやDocker Swarmは不要だ 39. Kernelのチューニングができない 40. Dockerはオワコン、これからはrkt 41. Docker ではなく CoreOS を使うべきだ 42. Docker環境は監視ができない 43. Dockerの導入事例がない 44. セキュリティや信頼性に問題がある 45. そもそも、Docker を使う意味が無い 46. Dockerは生産性や効率性に寄与しない 47. 5年後10年後もDockerで大丈夫なのか? 48. Dockerには恨み辛みがある 運用面での疑問や課題 正否の解説は、またどっかで!

×