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 徹底解説

12,401 views

Published on

オープンソースカンファレンス 2019 Tokyo/Spring 発表資料 #osc19tk
https://www.ospn.jp/osc2019-spring/
2019年2月22日(金)

Published in: Software
  • Be the first to comment

Docker Compose 徹底解説

  1. 1. Docker Compose 徹底解説 俺たちは雰囲気でコンテナを動かしている Sakura Internet, Inc. Masahito Zembutsu @zembutsu OSC 2019 Tokyo Spring #osc19tk Feb 22, 2019
  2. 2. このスライドは何? 2 Docker Composeの「入門」をコンセプトとして、 ⚫ 基本となる Docker コンテナとイメージの違い ⚫ Docker Compose の基本概念と操作 ⚫ 便利なコマンド を紹介しています。 ゴール: 「DockerコンテナとDockerイメージとの違いを理解した上で、 Composeで複数のコンテナを操作できるようにする」 ※スライドそのままでは分かりづらい部分があるため、 一部で公開時と異なる表現・補足説明を用いている場合があります。
  3. 3. 3 @zembutsu 前佛 雅人 zembutsu@zembutsuBlog: https://pocketstudio.net Factorio大好き! 2,500時間溶けた https://factorio.com/ さくらインターネット株式会社 技術本部ミドルウェアグループ Technology Evangelist / Developer Advocate 最近は「石狩市への小学校プログラミング教育支援プロジェクト」にも所属しています。 https://prog-edu.sakura.ad.jp/
  4. 4. 4 http://docs.docker.jp/ Dockerのドキュメント日本語化や、黄色いコンテナ本でDocker部分の章を担当させていただきました。
  5. 5. お品書き • Docker の本質的な存在意義とは • Docker Compose とは何か? • なぜ Docker Compose なのか? • Docker Compose のセットアップと基本操作 • WordPress を Docker Compose で管理する例 • Docker Compose 活用のヒント(Tips) 5今日ここで共有させていただく内容は、こちらです。皆さまのご想像通りでしょうか?
  6. 6. 6
  7. 7. Docker の本質的な存在意義 Why Docker? 7
  8. 8. Dockerとは? 8 What is the Docker? 1 Dockerコンテナは 実行に必要な全て をパッケージして、 簡単に動かせる 2 Dockerイメージは 複数のイメージ・ レイヤとメタ情報の 積み重なり 3 コンテナのプロセス はデフォルトで isolate(隔離・分離) された状態 ⚫ イメージ・レイヤ(image layer)は 読み込み専用 ⚫ 親子関係がある ⚫ イメージに対する変更はCopy on Write(CoW)処理が走る ⚫ コンテナ実行にはイメージが必要 で、Docker Hubから得られる ⚫ コンテナ実行時のみ、読み書きが 可能なレイヤを追加 ⚫ namespace(名前空間)でプロセ ス空間やファイルシステムやネッ トワーク等を分ける技術と、 cgroups(コントロール・グループ) でリソースの利用上限を指定 ⚫ コンテナはポートをデフォルトで開 かない ⚫ ネットワークはブリッジ、ホスト、 noneの3種類 ⚫ ボリュームはコンテナ間でファイル システムを共有できる。名前付き (named)とホスト・ボリューム ⚫ アプリケーションを簡単に開発し、 移動し、実行するためのプログラム とプラットフォームを提供するのが Docker ⚫ クライアント・サーバ型 https://docker.com プロセスを簡単にコンテナ化(isolate)し、 簡単かつ素早く開発・移動・実行できる「プラットフォーム」が Docker Containerization 「プロセス・ファイルシステム・ネットワーク・等々」に対して Namespace・Cgroup Build Ship Run
  9. 9. 9新しい概念が少しあるものの、Dockerやコンテナそのものは、実はシンプルです。
  10. 10. Docker 10 “Docker allows you to package an application with all of its dependencies into a standardized unit for software development.” www.docker.com 全ての依存関係をパッケージ化して、コンテナとして動かす まず、「Docker」そのものには、このような定義があります。
  11. 11. Docker 11 “Docker allows you to package an application with all of its dependencies into a standardized unit for software development.” www.docker.com 全ての依存関係をパッケージ化して、コンテナとして動かす Dockerイメージとして Linuxファイルシステムを ポイントはファイルシステム、「/」以下の「/bin/」や「/var」等を「Dockerイメージ」にパッケージ化。
  12. 12. Docker 12 “Docker allows you to package an application with all of its dependencies into a standardized unit for software development.” www.docker.com 全ての依存関係をパッケージ化して、コンテナとして動かす Dockerイメージとして Linuxファイルシステムを その「Dockerイメージ」を「Dockerコンテナ」として動かす(run、走らせる)ことができます。
  13. 13. コンテナを実行? コンテナを走らせる? 13ここで出てくる新しい概念が「コンテナ」として「動かす」です。コンテナとは一体何者なのだ・・・? (((
  14. 14. 15 (物理または仮想) コンピュータ CPU メモリ 記憶装置 コンテナの前に、「プロセスの実行」をお復習い。コンピュータないしサーバの基本要素はこちら。
  15. 15. 16 (物理または仮想) Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU メモリ 記憶装置 オペレーティングシステム (OS)の領域 「プロセスの実行」とは、記憶装置にあるOSファイル システム上のファイル(プログラム)に、CPUとメモリ を使えるようにします。
  16. 16. 17 (物理または仮想) ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU メモリ 記憶装置 オペレーティングシステム (OS)の領域 プロセス プログラム 設定ファイル ソースコード データ 一般的な プロセス実行 一般的なプロセス実行は、この図のような概念です。 プログラムでプロセスを動かし、プロセスはOS上の ファイルにアクセスできます。
  17. 17. 18 (物理または仮想) ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU メモリ 記憶装置 オペレーティングシステム (OS)の領域 プロセス プログラム 設定ファイル ソースコード データ プロセス 一般的な プロセス実行 サーバ用とのLinux上では、1つのマシン上で、 同時に沢山のプロセスが稼働できます。プロセス 間で通信する場合もあります。
  18. 18. 19 (物理または仮想) ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU メモリ 記憶装置 オペレーティングシステム (OS)の領域 プログラム 設定ファイル ソースコード データ コンテナは 特別な状態の プロセスのこと isolate(隔離) プロセス isolate(隔離) プロセス そして「コンテナ状態」のプロセスは、isolate(隔離) された特別な状態のプロセスです。名前空間機能で プロセス空間、ファイルシステム等を分けて実行。
  19. 19. 20 (物理または仮想) ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 コンピュータ CPU メモリ 記憶装置 オペレーティングシステム (OS)の領域 プログラム 設定ファイル ソースコード データ コンテナは 特別な状態の プロセスのこと isolate(隔離) プロセス isolate(隔離) プロセス 名前空間(namespace)はLinuxカーネルの機能。 これを、簡単に管理できるようにするツールかつ プラットフォームが、Docker(エンジン)なのです。
  20. 20. 21 isolate(分離)する insulatus→isolated→isolate isle island ア イ ソ レ ー ト “名前空間”技術を使って namespace Dockerはisolate状態のプロセスを管理するもの。islateの語源はラテン語で、islandとも関連
  21. 21. 22つまり、断崖絶壁の孤島に自分だけ一人しかいない。そのような状況のプロセスがコンテナなのです。
  22. 22. PID名前空間 23 httpd PID 1 プロセスhttpd 名前空間 プロセスruby 名前空間 ruby PID 1 chris.rb PID 2 名前空間は複数ありますが、分かりやすいのはPID。 ここでは httpd,rubyどちらもPIDが「1」 namespaces 自らのPID名 前空間内では
  23. 23. PID名前空間 24 httpd PID 1 プロセスhttpd 名前空間 プロセスruby 名前空間 ruby PID 1 chris.rb PID 2 /sbin/init PID 1 containerd PID 5 httpd PID 6 ruby PID 7 chris.rb PID 8 alice PID 2 bob PID 3 PPID 1 PPID 1 PPID 4 PPID 5 PPID 5 PPID 7 PPID 1 dockerd PID 4 ですが、ホスト上では別の(本来の)PIDを持ち、通常のプロセス・ツリーの下で動作。
  24. 24. PID名前空間 25 httpd PID 1 プロセスhttpd 名前空間 プロセスruby 名前空間 ruby PID 1 chris.rb PID 2 /sbin/init PID 1 containerd PID 5 httpd PID 6 ruby PID 7 chris.rb PID 8 alice PID 2 bob PID 3 PPID 1 PPID 1 PPID 4 PPID 5 PPID 5 PPID 7 PPID 1 dockerd PID 4 ホスト上には存在 つまり、ホスト上では普通にプロセスが走っていますが、名前空間内では自分達しか見えない状態。 外の世界が見えない 井の中の蛙 のような存在…
  25. 25. ファイルシステムを分ける (chroot) 26 ubuntuの ファイルシステム … … centosの ファイルシステム /etc /bin /etc /bin / / 次に分かりやすいのがファイルシステム。chrootの概念と同じ、特定のディレクトリをルートにします。 そのプロセス を実行時に
  26. 26. ファイルシステムを分ける (chroot) 27 ubuntuの ファイルシステム … … centosの ファイルシステム /etc /bin /etc /bin / / /data/ubuntu /data/centos / /etc /data/bin あくまでも、OS上にファイルシステムがあり、そこをプロセスがchroot状態でマウントします。
  27. 27. ファイルシステムを分ける (chroot) 28 ubuntuの ファイルシステム … … centosの ファイルシステム /etc /bin /etc /bin / / /data/ubuntu /data/centos / /etc /data/bin ホスト上には存在 そうすると、お互いのファイルシステム、つまりディレクトリやファイルを干渉できなくなるのです。
  28. 28. コンテナは特別なプロセスの状態 29 コンテナAの ファイルシステム … … コンテナBの ファイルシステム /etc (/data/ubuntu/etc) /bin (/data/ubuntu/bin) /etc (/data/centos/etc) /bin (/data/centos/bin) / / それでは、改めて、「コンテナの実行」とは名か。まず何らかのファイルシステムが存在していて、
  29. 29. コンテナは特別なプロセスの状態 30 コンテナAの ファイルシステム … … コンテナBの ファイルシステム /etc (/data/ubuntu/etc) /bin (/data/ubuntu/bin) /etc (/data/centos/etc) /bin (/data/centos/bin) / / httpd PID 1 プロセスA プロセスB ruby PID 1 chris.rb PID 2 コンテナB そこから「特別な状態」として複数の名前空間を分離し、chrootされた場所をマウント&プロセス起動
  30. 30. コンテナは特別なプロセスの状態 31 コンテナAの ファイルシステム … … コンテナBの ファイルシステム /etc (/data/ubuntu/etc) /bin (/data/ubuntu/bin) /etc (/data/centos/etc) /bin (/data/centos/bin) / / httpd PID 1 プロセスA プロセスB ruby PID 1 chris.rb PID 2 コンテナA コンテナB 名前空間の isolate ・プロセス ・ファイルシステム ・ネットワーク ・ホスト名 ・UID・GID ・プロセス間通信、等 cgroupでリソース制限 ・CPU ・メモリ ・I/O ・ディスク・クォータ、等 これがコンテナ状態として起動 するプロセスであり、名前空間 がisolate(隔離)された状態。 ネットワークやUID、GIDやホス ト名も分離さらにcgroup技術 で、CPUやメモリといったリソー スの制限もできる状態。
  31. 31. 32これが「コンテナ」です。コンテナを作るには、Docker以外にもLXCやOpenVZ等の実装があります。
  32. 32. 33 ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 オペレーティングシステム (OS)の領域 プログラム 設定ファイル ソースコード データ Docker イメージ Dockerイメージを使って Dockerコンテナ(隔離状態)のプロセスを起動 Dockerはコンテナ管理プラットフォーム。 設定ファイル、ソースコードなどを「Docker イメージ」にまとめて、実行します。このイメー ジを送受信する機能を持っています。
  33. 33. 34 ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 オペレーティングシステム (OS)の領域 プログラム 設定ファイル ソースコード データ Docker イメージ ビルド pull Dockerイメージ Dockerイメージ ※異なるシステム、バージョン、ソースコード Dockerイメージを使って Dockerコンテナ(隔離状態)のプロセスを起動 「docker pull」や「docker build」といった、 簡単なコマンドを実行するだけで、Docker Hub (公式イメージ・レジストリ)から、自動で Docker イメージをダウンロードします。
  34. 34. 35 ユーザ空間 システム空間 Linux カーネル + システム・ライブラリ(libc)等 オペレーティングシステム (OS)の領域 プログラム 設定ファイル ソースコード データ Dockerコンテナ プロセス Dockerコンテナ プロセス Docker イメージ ビルド pull Dockerイメージ Dockerイメージ ※異なるシステム、バージョン、ソースコード Dockerイメージを使って Dockerコンテナ(隔離状態)のプロセスを起動 あとは、Dockerイメージ内のファイルを使い プロセスを名前空間を分離した特別な状態で 起動できるようにする。これがDockerの役割 なのです。
  35. 35. Dockerはサーバ・クライアント型モデル 36 OS ( Linux ) 物理/仮想サーバ Docker エンジン ( dockerd デーモン ) Linux kernel コンテナ コンテナ コンテナ リモート API docker クライアント TCP あるいは Unix ソケットドメイン containerd Runtime: runC (OCI規格準拠) ・docker コマンド Linux, Mac OS X, Windows ・Kitematic (GUI) Mac OS X, Windows ・Docker Compose ・Docker Swarm ちなみに、DockerそのものはDockerエンジンと呼ぶサーバ側プログラムと、CLIで構成。
  36. 36. 参考:Docker Engineのアーキテクチャ 37※ Docker Engine v1.11 以降 ユーザ (docker CLI等) Docker Container Engine dockerd containerd (docker-containerd) shim (docker-containerd-shim) shim (docker-containerd-shim) shim (docker-containerd-shim) runC (runtime-runc) コンテナ Docker Image コンテナ Docker Image コンテナ Docker Image JSON/REST API CNCF/OCI業界標準規格に準拠 runC (runtime-runc) runC (runtime-runc) gRPC エンドポイント Docker Engine トップレベルのデーモン (Moby プロジェクトの成果物) Docker イメージに含むファイルを、 パラメータに従い、コンテナとして実行 コンテナを実際に作成・起動する ランタイムのバイナリ・プログラム コンテナやイメージをはじめとし、 ネットワーク、ストレージを管理する 必要最小限のデーモン ランタイムが実行したコンテナを管理 細かく見ますと、 このようなプログラムで構成
  37. 37. Dockerイメージはイメージ・レイヤの積み重ね 38 プログラムやライブラリと メタ情報(実行するプログラムやポートなど) さて、次は「Dockerイメージ」です。これは仮想マシン・イメージとは全く異なる概念です。
  38. 38. Dockerイメージはイメージ・レイヤの積み重ね 39 プログラムやライブラリと メタ情報(実行するプログラムやポートなど) Dockerイメージは、複数のイメージ・レイヤ(image layer)の組み合わせで、読み込み専用。 1つ1つのイメージ・レイヤの 実体は、ファイルシステム( / 以下の /bin や /etc などの ディレクトリやファイル)を tar アーカイブ化したものや、 メタ情報(どのプログラムを自 動実行するか、パラメータは 何か、どのポートを公開するか など)が記録。
  39. 39. Dockerイメージはイメージ・レイヤの積み重ね 40 利用者からは 1つに見える 親 子 関 係 プログラムやライブラリと メタ情報(実行するプログラムやポートなど) イメージ・レイヤは親子関係を持ち、複数のレイヤは利用時に1つのファイルシステムに見える。 ⚫ 一般的にDockerイメージ は複数のイメージ・レイヤ で構成 ⚫ 例えば、“nginx:latest” イメージを取得(pull)する と、親のレイヤ情報を持つ レイヤも自動的に取得 ⚫ 結果として、利用者からは 1つのDockerイメージを 取得・実行するつもりでも、 実際には複数のイメージ・ レイヤをまとめて操作
  40. 40. Dockerイメージはイメージ・レイヤの積み重ね 41 利用者からは 1つに見える 親 子 関 係 プログラムやライブラリと メタ情報(実行するプログラムやポートなど) そして、親レイヤが共通の、別のイメージを作るのも簡単。共有部分はディスク容量を消費しません。 派生も 共有 利用者からは 1つに見える
  41. 41. Dockerイメージはイメージ・レイヤの積み重ね 42 利用者からは 1つに見える プログラムやライブラリと メタ情報(実行するプログラムやポートなど) 仮想マシン・イメージであればコピーは数GBもあり、通常は時間もお金も掛かります。 派生も 共有 利用者からは 1つに見える だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質 親 子 関 係
  42. 42. 43ちなみに、イメージを作るにはコマンド「docker build」で、Dockerfileというファイルを用意します。 docker image build -t <IMAGE:TAG> . (docker build) これがDockerfileです。1行1行が イメージ・レイヤに相当します。 このイメージは、上から順に、 ⚫ 「FROM」命令で「scratch」、何も無い イメージ・レイヤを作成 ⚫ 「ADD」命令で、ファイルシステム をイメージ・システムの中に入れる ⚫ 「CMD」命令で、イメージ使った コンテナ実行時に、「/bin/sh」をデフォ ルトで実行する設定 を指定しています。
  43. 43. 44 利用者からは 1つに見える docker image build -t <IMAGE:TAG> . (docker build) 3つのイメージ・レイヤは、あくまで1つのDockerイメージが存在しているように見えます。
  44. 44. 45 利用者からは 1つに見える docker image build -t <IMAGE:TAG> . (docker build) 3つのイメージ・レイヤは、あくまで1つのDockerイメージが存在しているように見えます。
  45. 45. 46 利用者からは 1つに見える alpine docker image build -t <IMAGE:TAG> . (docker build) 3つのイメージ・レイヤは、あくまで1つのDockerイメージが存在しているように見えます。 これはAlpine Linuxの Dockerfile でした。
  46. 46. 47 利用者からは 1つに見える hello:v1 FROM alpine ENTRYPOINT ["/bin/echo"] CMD ["こんにちは!こんにちは!"] docker image build -t hello:v1 . (docker build) 今度は「alpine」という小さなLinuxディストリビューションを使う例です。「v1」とタグを付けます。
  47. 47. 48 hello:v1 FROM alpine ENTRYPOINT ["/bin/echo"] CMD [“おはよう!おはよう!"] hello:v2 docker image build -t hello:v2 . (docker build) 次に「v2」を作成。この時必要となるディスク領域は、「v1」との差分(画面青色のレイヤ)のみです。
  48. 48. Alpine Linux 49 https://www.alpinelinux.org
  49. 49. gliderlabs / docker-alpine 50 イメージ・レイヤ 3つのレイヤで容量たったの5MB。 Alpine Linux の Dockerfile は、GitHub上で公開されています。
  50. 50. docker image pull (docker pull) 51 $ docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world d1725b59e92d: Pull complete Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Status: Downloaded newer image for hello-world:latest Docker Hub 自分でイメージを作らなくても、DockerHubからイメージのダウンロードも可能。 DockerHub とは、GitHubがソース コードを共有・公開・共同作業するため の場所であるように、Dockerイメージ を共有・公開・共同作業する場所です。
  51. 51. docker image pull (docker pull) 52 $ docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world d1725b59e92d: Pull complete Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Status: Downloaded newer image for hello-world:latest Docker Hub 大事なのは「library」が公式イメージ専用の名前空間で、セキュリティ上、公式のみ使うべきです。
  52. 52. 53 ⚫それでは、Docker コンテナと Docker イメージの違いって何? ⚫どうして1つのマシン上でコンテナをたくさん起動できるの?
  53. 53. 54 ⚫それでは、Docker コンテナと Docker イメージの違いって何? ⚫どうして1つのマシン上でコンテナをたくさん起動できるの?
  54. 54. Dockerコンテナ実行とは、イメージ内のプログラムを実行 55イメージ・レイヤは読み込み専用なので、レイヤで構成されるDockerイメージ全体も読み込み専用。
  55. 55. Dockerコンテナ実行とは、イメージ内のプログラムを実行 56 元のレイヤに対する変更情報を記録 Copy on Write の性質 コンテナ実行時に、読み書き可能なコンテナ用のイメージ・レイヤを作成し、プログラムを実行します。 docker container run -it alpine (docker run) この例では、ベースとなるのが “alpine” Dockerイメージです (読み込み専用。一切変更できません。) 変更できるのは、 “alpine” を親イメージ・レイヤとして 情報を持っている、赤い部分の読み書き可能なレイヤ。 (docker ps -aで確認でき、docker rm で消すのは このコンテナ用レイヤです) ファイル変更時は、読み込み専用のイメージ・レイヤ から一度ファイルをコピーする挙動が発生します。 (これを、コピー・オン・ライトと呼びます)。
  56. 56. Dockerコンテナ実行とは、イメージ内のプログラムを実行 57 元のレイヤに対する変更情報を記録 Copy on Write の性質 利用者からは 1つに見える 利用者からは 1つに見える だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質 コンテナ用レイヤも親子関係を持つため、同じイメージなら直ぐに起動し、容量も圧迫しません。
  57. 57. 58 技術と仕様 Technology Specification コンテナ Docker つまり、Linuxカーネルのコンテナ技術を、Dockerというプラットフォームで簡単に扱えるのです。
  58. 58. Dockerは構築・移動・実行のためのプラットフォーム 59 サービスを 提供したい 開発 環境 テスト 環境 準備 環境 本番 環境 都度、環境構築課題 異なるOS環境課題 都度、プロビジョニング課題 動かない課題 時間がかかる課題 遅い課題 面倒課題 アプリを 動かしたい コンテナ 開発 テスト 準備 本番
  59. 59. docker クライアント docker エンジン $ docker container run hello-world run Docker Hub pull レジストリ latest イメージ タグ hello-world レポジトリ latest イメージ タグ latest コンテナ化した hello-worldの実行 Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/ Dockerイメージを取得したり、共有するための「公開レジストリ」が「Docker Hub」。
  60. 60. ちなみにDockerのキャラクターの名前は “Moby” 61https://en.wikipedia.org/wiki/Moby-Dick 白鯨 – Moby-Dick モビー わたしです
  61. 61. Docker ネットワーク概要 Docker network 62
  62. 62. 63 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX Dockerでコンテナを実行すると、 プロセスの「ネットワーク」や「ホスト名」 もisolate(分離)した状態で起動。
  63. 63. 64 3つの Docker 標準ネットワークモデル bridge (bridge) ブリッジ(bridge0 …) veth eth0 ethX none (null) host (host) 複数のブリッジ(ネットワーク)を定義できる デフォルトのbridge0ブリッジは、旧仕様の ネットワークで、挙動が異なる デフォルトは「ブリッジ」ドライバを使う ネットワーク。docker network lsで 3つのドライバが表示。
  64. 64. 65 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX ホスト側のネットワークに直接接続 ブリッジのオーバーヘッドがない一方で、 セキュリティに対する考慮が必要 ホスト側のインタフェースを直接 使いたい場合、docker run のオプショ ンで --network=host を指定
  65. 65. 66 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) ブリッジ(bridge0 …) veth eth0 ethX ネットワークを追加しない限り疎通できない none (null) ネットワーク・インターフェースを持た せない場合は、docker run のオプショ ンで --network=none を指定
  66. 66. 67 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX NAT (iptables) + docker-proxy ホストと ネットワーク 共通 疎通しない コンテナはパブリックなIPアドレスを持ない ホスト側のポート番号を重複して、コンテナ のポート利用(マッピング)はできない 動的なネットワークの追加・変更・削除 これらネットワークはコンテナを停止・ 再起動しなくても、動的に着けたり(ア タッチ)外したり(デタッチ)可能。
  67. 67. 68 コンテナは複数のネットワーク(ブリッジ)に接続できる ブリッジ1(bridge) veth eth0 ethX 各ネットワーク内部では、動的なコンテナ名 (サービス)の名前解決機能(サービス・ディス カバリ)を標準提供 eth0 eth1 eth0 ブリッジ2(bridge) veth192.168.0.1 172.18.0.2 172.18.0.3 172.19.0.2 172.19.0.3 172.19.0.1 172.19.0.0/16172.18.0.0/16 サービス・ディスカバリ連携の負荷分散 また、複数のブリッジ・ネットワークを 定義できます。内部では、コンテナ名で IPアドレスを名前解決できる
  68. 68. Docker ボリューム概要 Docker volume 69
  69. 69. 70 データの扱い コンテナA専用 ファイル階層 File System … / /bin /etc /var コンテナB専用 ファイル階層 File System … / /bin /etc /var hello.txt × HOST Root File System /var/lib/docker/overlay/ hello.txt ディレクトリはストレージドライバによって異なる A BUFS( Union File System ) コンテナA・B(のプロセス)は、お互いの ファイルシステムを直接参照できません。
  70. 70. 71 データ・ボリューム コンテナA専用 ファイル階層 File System … / /bin /etc /var コンテナからはUFSを通してデータ領域が見える ストレージ・ドライバのオーバヘッドを受けない 複数のコンテナでボリュームを共有できる volume /data / ボリューム Volume /var/lib/docker/volumes/HOST Root File System コンテナは「ボリューム」と呼ぶ領域(ディレクトリまたはファイル)をマウントできる
  71. 71. 72 コンテナ ファイル階層 File System / UFS ( Union File System)… / /bin /var Docker イメージ Docker Image /var/lib/docker/image/ volume / ボリューム Volume /data コンテナ用 イメージ層 Container’s Image Layer / /var/lib/docker/volumes//var/lib/docker/containers/ ReadOnly
  72. 72. 73 ボリュームは3分類 ホストをマウント 名前付き ホスト上のディレクトリ /docker/data /data 名前無し volume ボリュームの実体は、ホスト上のディレクトリ /var/lib/docker/volumes ボリュームはコンテナ間でデータを共有できる volume /data /data /etc ボリュームとして、ホスト上のファイルを 直接マウントできるだけでなく( docker run -v ホスト側:コンテ ナ内)、ボリュームを複数のコンテナで共有可能。読み書きする データは、通常このボリュームを作成し、利用する。
  73. 73. Docker Compose が必要な理由 Why? There are some reasons to manage containers. 74
  74. 74. 75 ⚫たくさんのコンテナを同時に実行するには? サーバは通常、ウェブやデータベースなど、複数のプロセスが動作。
  75. 75. 76 ふくすう の コンテナ を きどう しよう システム コンテナ コンテナ システム コンテナ スケールしづらさ 管理のしづらさから Dockerやk8sには 向かないね プロセス A プロセス B プロセス C 1つのコンテナに多くのプロセスを集約する手法もありますが、スケールしづらくなります。
  76. 76. 77 ふくすう の コンテナ を きどう しよう コンテナ システム コンテナ ソフトウェアごとに コンテナが別だから スケールしやすいし 差し替えも簡単 プロセス A コンテナ プロセス B コンテナ プロセス C アプリケーション コンテナ プログラムごとにコンテナを分ける手法、これをアプリケーション・コンテナと呼ばれます。
  77. 77. 78 ふくすう の コンテナ を きどう しよう コンテナ システム コンテナ ソフトウェアごとに コンテナが別だから スケールしやすいし 差し替えも簡単 プロセス A コンテナ プロセス B コンテナ プロセス C アプリケーション コンテナ docker run … docker run … docker run … ただし、コンテナごとにコマンドを実行する必要があり、ます。この画面では3回の実行ですが、、、
  78. 78. 79 docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … docker run … もしも コンテナ が 20こ ひつよう なら ⚫ 環境構築が大変 ⚫ 環境の維持・再現が大変 ⚫ 本末転倒 20回実行する必要があり、これでは面倒。「簡単に扱うためのDocker」から乖離してしまいます。
  79. 79. 80 docker-compose up そこで コンポーズ の でばん ⚫ 環境はYAMLで管理 ⚫ docker コマンドと類似 利用者側のメリット: • compose ファイルがあれば、とにかく動く ので(環境の再現性が高い) 開発者側のメリット: • 1つのマシン上で、複数の環境を切り替え やすい そこで出てきたのがCompose。dockerと似たコマンドを実行するだけで、まとめてコンテナを実行。
  80. 80. 81 コマンド? の ごかんせい docker と docker-compose はコマンドの意味が近いため、docker に慣れていると楽 しかも、Dockerのネットワークやボリュームも一緒に管理できる利便性
  81. 81. 82 ちなみに http://www.fig.sh 元々は「Fig」というプロジェクトでしたが、2014年にDocker社に買収されて名称変更。
  82. 82. 83 これは ちがい ます ごめんなさい、ごめんなさい
  83. 83. 複数のコンテナを一括管理する Docker Compose Docker Compose 84
  84. 84. Docker Composeとは? 85 What is Docker Compose? 1 Composeは アプリケーションの サービスをファイル で定義する 2 Dockerコマンドと 高い親和性がある ため、学習コストが 比較的に低い 3 Swarm モードに サービスをデプロイ できるオーケストレー ション機能 ⚫ docker-compose CLI のコマン 体系は docker に準拠 ⚫ 例:「docker run -d」は 「docker-compose up -d」 ⚫ Docker swarm モードを使えば、 サービス状態を定義できるので 常に期待状態を維持できる ◼ docker stack deploy ⚫ Ingress ネットワークの活用 ⚫ Compose ファイル (YAML形式) で Docker コンテナのサービスを 定義できるため、 再利用性が高い ◼ コンテナの状態 ◼ イメージ ◼ ネットワーク ◼ ボリューム ◼ メタ情報 https://github.com/docker/compose 複数のコンテナで構成するアプリケーションを 定義と実行するためのツール multi-container applications define and run
  85. 85. 86 Mastodon Mastodonのように、複雑な構成のアプリケーションも、Docker Composeで利用できる
  86. 86. 87 redis :alpine postgres :alpine サービス サービス イメージ イメージ nginx :alpine サービス イメージ gargron/mastodon :v1.4.6 サービス イメージ gargron/mastodon :v1.4.6 サービス イメージ gargron/mastodon :v1.4.6 サービス イメージ namshi/smtp :latest サービス イメージ https://github.com/tootsuite/mastodon ネットワーク 192.168.0.0/16 mastdon (external) ホスト側ネットワーク eth0等 mastodon_postgresmastodon_redis certbot (external) assets packs system volumevolume volume volume volume volume 80 443 80 443 services: volumes: networks: 特にネットワークやボリュームが混在する場合には有用
  87. 87. Docker Compose 活用場面 • 利用者視点 • 「docker-compose.yml」があれば、すぐに何でも実行できる • YAML形式で記述 • Docker Hub 公式イメージ上でサンプルが公開されている • PWD (Play With Docker という、無料で短時間利用できるクラウド上のリソース)でお試し • 開発者視点 • 環境の再構築が簡単 • バージョン違いの環境を作りやすい • 1つのマシン上に、複数の環境を立ち上げられやすい 88適切に書いたYAMLファイルさえあれば、誰でも簡単に実行できるのが強み。しかも、環境まとめて。
  88. 88. Dockerのセットアップ 89 $ curl https://get.docker.com | head $ curl -fsSL get.docker.com -o get-docker.sh # sh ./get.docker.com # systemctl enable docker # systemctl start docker ※systemd系の場合 ※リポジトリの自動セットアップ ※コマンドの確認 Linuxで検証用途に手軽な方法 Dockerのセットアップはシンプルです。あるいはDocker for Mac/Winという選択肢も。
  89. 89. Docker Compose セットアップ方法 • Docker Desktop for Mac / Windows • docker-compose も同梱されているので、すぐに使える • Linux 版 • バイナリをリポジトリからローカルにダウンロードし、パーミッションを設定 • https://github.com/docker/compose/releases “Assets”からアーキテクチャごとにダウンロードできる Linuxは “docker-compose-Linux-x86-64” 90 curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64 ¥ -o /usr/local/bin/docker-compose chmod 755 /usr/local/bin/docker-compose Linuxは docker-compose のバイナリを、別途セットアップする必要があります。
  90. 90. Docker Composeを使うための基本ステップ 91 Compose ファイル docker-compose up YAML ある ない Docker イメージ ない Dockerfileを作成 Compose ファイル作成 ある 「サービス」「ネットワーク」「ボリューム」などをYAML形式で記述した、Composeファイルが必要。
  91. 91. docker-compose.yml • 「サービス」「ネットワーク」「ボリューム」を定義 • image … イメージ IDやイメージ名 • build … Dockerfile のパス(イメージを構築する場合) • command … デフォルトの(イメージ実行時)コマンドを上書き • restart … コンテナの再起動ポリシー(例: always) • ports … ポートのマッピング • environment: , env_file: 環境変数の指定 92 services: networks: volumes: Docker Composeは「プロジェクト」を操作。プロジェクトを定義するのが、このComposeファイル。
  92. 92. 93 version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb db: image: mysql:5.7 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' ◀ ネットワークやボリュームを使う場合、通常2以上 swarm modeにデプロイする場合は3を想定 WordPress公式の Docker Compose例 ◀ 使用するDockerイメージは「wordpress:latest」 ◀ サービスを定義 ◀ サービス「wordpress」 ◀ 停止時、常にプロセス再起動 ◀ ホスト側ポート8080を、コンテナ内ポート80に割り当て ◀ コンテナ内で使える環境変数を定義 ◀ 初回実行時rootパス自動生成 ◀ サービス「db」 ◀ サービス「db」で名前解決できる ◀ WordPress用のデータベース、 ユーザ、ユーザのパスワードを定義 ◀ 使用するDockerイメージは「mysql:5.7」 ◀ 停止時、常にプロセス再起動 ◀ コンテナ内で使える環境変数を定義 ※ネットワークを定義していないが docker-compose up時に自動的 に、このプロジェクト専用の bridge ネットワークが作成される。 ※wordpressとdbのコンテナ間は ポートの公開を明示しなくても、 同一 bridge ネットワークに所属 しているため、お互い内部通信可能
  93. 93. 94 version: '3' services: web: image: zembutsu/docker-sample-nginx deploy: replicas: 3 resources: limits: cpus: "0.1" restart_policy: condition: on-failure ports: - "80:80" networks: internal: aliases: - frontend volumes: - /etc/localtime:/etc/localtime:ro networks: internal: ◀ ネットワークやボリュームを使う場合、通常2以上 swarm modeにデプロイする場合は3を想定「web」という名称のサービスを 定義(内部ネットワークで名前 解決できる)▶ ◀ 使用するDockerイメージ ◀ コンテナのレプリカ(複製)を3つ起動 ◀ CPUリソース制限 ◀ 再起動ポリシーを指定:障害時に再起動 ◀ ホスト側のポート80を、コンテナ内のポート80にマッピング ◀ 「internal」という名称のブリッジネットワークに接続し、 frontend というエイリアス(別名)を指定 ◀ ボリューム定義 /etc/localhost を読み込み専用で ◀ ネットワーク定義 internalという名称のブリッジ・ネットワーク ◀ docker stack deploy時の挙動 別例:
  94. 94. 95 コンテナは複数のネットワーク(ブリッジ)に接続できる ブリッジ1(bridge) veth eth0 ethX 各ネットワーク内部では、動的なコンテナ名 (サービス)の名前解決機能(サービス・ディス カバリ)を標準提供 eth0 eth1 eth0 ブリッジ2(bridge) veth192.168.0.1 172.18.0.2 172.18.0.3 172.19.0.2 172.19.0.3 172.19.0.1 172.19.0.0/16172.180.0/16 サービス・ディスカバリ連携の負荷分散 Composeはプロジェクト単位で ブリッジ・ネットワークを自動的に 作成でき、ホスト側とのマッピングも 設定可能。
  95. 95. Composeプロジェクトの「ネットワーク」定義 96 networks: external_network: internal_network: internal: true services: web: ... networks: hostnet: {} networks: hostnet: external: true name: host 「networks」でネットワークを定義。”external:true” は、この Compose プロジェクト外で(手動・自動的 に存在しているネットワークと接続)。”driver: overlay”の場合、”internal:true”で、複数ホスト間をつな ぐローカルネットワークも定義できる。
  96. 96. 97 ボリュームは3分類 ホストをマウント 名前付き ホスト上のディレクトリ /docker/data /data 名前無し volume ボリュームの実体は、ホスト上のディレクトリ /var/lib/docker/volumes ボリュームはコンテナ間でデータを共有できる volume /data /data /etc コンテナ(のプロセス)でマウントするボリューム(領域)も、Composeで定義できる。
  97. 97. Composeプロジェクトの「ボリューム」定義 98 services: db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data volumes: - /var/lib/mysql - cache:/tmp/cache - ./configs:/etc/configs/:ro 「volumes:」に “- ディレクトリまたはファイル名”の場合は 名前無し(volume idが割り振られる)。主に使い捨て用途 “- 名前:パス” は名前付きボリューム。ホスト上での管理を 容易にするため(バックアップや参照で) “- パス:パス” はホスト上を直接マウント。 “:ro”は Read-Only オプション 個々のサービスの中で定義する場合は、 そのサービス(のコンテナ)だけが参照 プロジェクト全体または個々のサービスに定義。毎回 docker volume create等の管理が不要に。
  98. 98. 動かし方や便利なコツ Run & Tips 99
  99. 99. Docker Compose Run & Tips • docker-compose up -d --build • docker-compose down -v –rmi all / local • docker-compose exec <サービス名> コマンド • docker-compose -f <ファイル名.yml> • docker-compose -p <プロジェクト名> • docker-compose --config • docker system prune • docker volume rm $(docker volume ls -q) 100compose を普段使う上で、よく使うコマンドは、このあたり。 特に知らないうちにネットワークやボリュームが混在するときは prune(プルーン)コマンドで一斉掃除。 ◀ プロジェクト起動時、毎回Dockerfileをbuildする ◀ 停止時、イメージとボリューム全削除 ◀ デバッグ用途。コンテナ内で操作 ◀ 任意のYAMLファイルを指定可能 ◀ ディレクトリ名ではなく、任意のプロジェクト 名を指定可能 ◀ 稼働しているプロジェクトの情報を、YAML形式で表示 (間違って YAML を消した場合や、複数の YAML が混在し 操作対象が分からなくなった時に重宝・・・) ◀ 不要コンテナ、中間イメージ、ネットワークを削除(-vでボリュームも) ◀ ボリュームの全削除
  100. 100. Compose ファイル形式バージョン • networks: volumes: は v2 , v3 で利用可能 • v3 を使うには Docker v1.13 以上 • Swarm mode を使うには v3 (同じオプションでも v2 と挙動が異なる) • 細かな差違はリファレンス https://docs.docker.com/compose/compose-file/ 101細かな挙動の違いはあるものの、docker stack コマンドで swarm 使わなければ、ほぼ考慮不要。
  101. 101. コンテナ内の環境変数 env_file & environment: 102 services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb services: wordpress: image: wordpress restart: always ports: - 88:80 env_file: - wordpress.env WORDPRESS_DB_HOST=db WORDPRESS_DB_USER=exampleuser WORDPRESS_DB_PASSWORD=examplepass WORDPRESS_DB_NAME=exampledb 知っておくと便利なのが環境変数の定義方法。「enf_file:」で別ファイルにすると Compose ファイルと分離できる。セキュリティ上、考慮が必要な情報に対して有効。 (間違って GitHub に push してしまうのを .gitignore で回避できる、、) wordpress.env の内容
  102. 102. args: はイメージ構築時の環境変数を定義 $ docker-compose build --build-arg="text=hello" 103 version: '3' services: apache: build: context: ./service-httpd/ dockerfile: Dockerfile.httpd args: - text=plain image: localhttpd:1.0 ports: - "80:80" FROM httpd:2.4-alpine RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && apk del tzdata ARG text RUN echo $text > /usr/local/apache2/htdocs/index.html コンテナの実行時ではなく、コンテナの build 時にのみ使う環境変数が「args:」で指定可能。 docker-compoes build時に --build-argを指定する方法と、 Composeファイルの中で「args:」を指定する方法がある。
  103. 103. オーケストレーションと Swarm mode Orchestration 104
  104. 104. Cloud Native 参照アーキテクチャ Networking Provisioning Runtime Orchestration & Management Application Definition / Development Compute Storage マイクロサービス・パターン 分散オーケストレーションと管理 コンテナ化 インフラ ※ CNCFプロジェクトが定義する範囲外 【参考】 https://github.com/cncf/presentations/blob/master/2016-software-circus/what-is-cloud-native/what-is-cloud-native.pdf 105 reference architecture 巷で話題のKubernetesとDocker(containerd)の関係性がこちら。
  105. 105. 106 ( ( ) Scheduling Cluster Management • Marathon, chronos • Docker swarm • Deis • fleet • Apache Mesos • DCOS (Mesosphere) Orchestration 複数のホスト・システム上を横 断するアプリケーションをス ケール(拡大・縮小)できる機能 ※コンテナに依存しない • Kubernetes • Docker Engine (swarm mode) + Docker Compose • Rancher • Nomad 設定ファイルをベースに サービスを定義・維持 計算資源の抽象化 「オーケストレーション」の領域は、KubernetesとDocker Engineの「swarm mode」が該当。
  106. 106. 従来のオーケストレーション 107 クラスタ 一方通行 従来はクラスタを構成するノードに対して、一方的なリソース要求が一般的。 【参考】 https://www.slideshare.net/Docker/container-orchestration-from-theory-to-practice/7
  107. 107. 宣言型サービス・モデルのオーケストレーション 108 Declarative service model OD クラスタ Δ S D = 期待状態 O = オーケストレータ S = 状態 Δ = 状態から期待状態への収束 フィードバック ⚫ レプリカ作成 ⚫ グローバル・サービス 並列 遅延 変更可能 【参考】 https://www.slideshare.net/Docker/container-orchestration-from-theory-to-practice/7 KubernetesやDocker swarm modeでは、定義した「あるべき状態」を自動的に維持する仕組み。
  108. 108. standalone swarm Docker Swarm vs Docker Swarm mode 109 SwarmKit Docker Engine Docker Engine Swarm マネージャ Swarm エージェント Swarm エージェント KVS リソース・プール 管 理 Docker Host Docker Host Swarm(クラスタ) Docker Engine Docker Engine Docker Engine swarm モード Docker Host Docker Host Docker Host Docker 1.12からクラスタ管理機能を内蔵管理用マネージャ・エージェントや KVS が別途必要 「swarm mode」は、昔からある「Docker Swarm」(スタンドアロン)とは別モノ。
  109. 109. Swarm mode の構成要素 110 manager node worker node worker node swarm モード docker service や docker stack 等 クラスタとサービスの 管理コマンドを受け付け タスク (コンテナ) タスク (コンテナ) サービス docker service や docker stack 系コマンドの実行は、 kubectl と互換性を持つ ※ Docker for Mac で Experimental かつ Kubernetes 有効化の場合 Docker Engine Docker Engine Docker Engine swarm SwarmKit SwarmKit SwarmKit docker CLI - ネットワーク Ingress Network Routing Mesh Docker Compose YAML サービス定義 (option) docker コマンドを使い、 分散環境でも簡単に アプリをスケールできる 現在は、Dockerが入っていれば「docker swarm init」の実行で、直ちに有効化できる。
  110. 110. swarm mode のネットワーク機能 111 Multi Host Networking Worker node Worker node Worker node overlay network Ingress network コンテナ PublishPort Routing Mesh 80 443 80 443 80 443 負荷分散 swarmモードで便利なのは、複数のホスト間で共通ネットワーク(ingress)を自動生成。 どのノードにアクセスがあっても、コンテナが動作しているノードに自動ルーティング。 しかも、Docker Composeファイルがあれば、それを使ったデプロイも可能。 サービス・ディスカバリ (動的な名前解決)
  111. 111. クラスタ初期化と サービス実行 swarm mode 112
  112. 112. Dockerのセットアップ 113 $ curl https://get.docker.com | head $ curl -fsSL get.docker.com -o get-docker.sh # sh ./get.docker.com # systemctl enable docker # systemctl start docker ※systemd系の場合 ※リポジトリの自動セットアップ ※コマンドの確認 Linuxで検証用途に手軽な方法 swarm modeを使うには、まず Docker Engine のセットアップが必要。準備はこれだけ。
  113. 113. クラスタ初期化と join 手順 114 manager ノード $ docker swarm init Swarm initialized: current node (hhzcdnj2r43ywjcmjcwbgvwa7) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapub….. <IP_ADDR>:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. worker ノード $ docker swarm join ¥ --token SWMTKN-1-0w2m8k41xh1tbapub….. <IP_ADDR>:2377 managerのIPアドレスとポート This node joined a swarm as a worker. それから「docker swarm init」でクラスタを初期化。ノードの追加は「join」で。 マネージャに対してのみ docker stack コマンドで操作可能。 ここに出てくる文字列を ワーカノードで実行
  114. 114. クラスタ join 時のトークン確認 115 manager $ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapubwl7sd7j7x….. <IP_ADDR>:2377 manager $ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapubwl7sd0m0….. <IP_ADDR>:2377 ノード追加時のコマンドを忘れてしまった場合は、このコマンドで確認。
  115. 115. クラスタ状態確認 116 manager $ docker node ls $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS hhzcdnj2r43ywjcmjcwbgvwa7 * node-01 Ready Active Leader $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS hhzcdnj2r43ywjcmjcwbgvwa7 * node-01 Ready Active Leader znmguxtqwywhja9chkkaa6a7y node-02 Ready Active 2mgqqmgt0dlv9zc932nz9rkat node-03 Ready Active あとは、ノードの状態を確認したり、
  116. 116. Compose file でサービス作成・操作 117 manager $ vi docker-compose.yml version: '3' services: web: image: zembutsu/docker-sample-nginx deploy: replicas: 3 resources: limits: cpus: "0.1" restart_policy: condition: on-failure ports: - "80:80" networks: internal: aliases: - web volumes: - /etc/localtime:/etc/localtime:ro networks: internal: $ docker stack deploy -c ./docker-compose.yml demo Creating network demo_internal Creating service demo_web $ docker stack ls $ docker stack ps demo $ docker service scale demo_web=5 $ docker service stop demo $ docker stack rm demo サービスのデプロイも行えるようになる。
  117. 117. 詳しい手順は、チュートリアルやドキュメントを 118 ⚫ Swarm mode overview | Docker Documentation https://docs.docker.com/engine/swarm/ ⚫ Get Started, Part 3: Services | Docker Documentation https://docs.docker.com/get-started/part3/ Docker for Mac/Windows では、swarm modeがすぐにご利用できます。 また、今後の方向性としては Compose on Kubernetes [1]との連携により Kubernetes クラスタ上で Compose ファイルを使ってデプロイする方法もあり、 引き続き Compose 周辺プロジェクトの動きには注目です。 [1] https://github.com/docker/compose-on-kubernetes
  118. 118. まとめ 119
  119. 119. Dockerとは? 120 Why Docker? 1 Dockerコンテナは 実行に必要な全て をパッケージして、 簡単に動かせる 2 Dockerイメージは 複数のイメージ・レイ ヤとメタ情報の積み 重なり 3 コンテナのプロセス はデフォルトで isolate(隔離・分離) された状態 ⚫ イメージ・レイヤ(image layer)は 読み込み専用 ⚫ 親子関係がある ⚫ イメージに対する変更はCopy on Write(CoW)処理が走る ⚫ コンテナ実行にはイメージが必要 で、Docker Hubから得られる ⚫ コンテナ実行時のみ、読み書きが 可能なレイヤを追加 ⚫ namespace(名前空間)でプロセ ス空間やファイルシステムやネッ トワーク等を分ける技術と、 cgroups(コントロール・グループ) でリソースの利用上限を指定 ⚫ コンテナはポートをデフォルトで開 かない ⚫ ネットワークはブリッジ、ホスト、 noneの3種類 ⚫ ボリュームはコンテナ間でファイル システムを共有できる。名前付き (named)とホスト・ボリューム ⚫ アプリケーションを簡単に開発し、 移動し、実行するためのプログラム とプラットフォームを提供するのが Docker ⚫ クライアント・サーバ型 https://docker.com プロセスを簡単にコンテナ化(isolate)し、 簡単かつ素早く開発・移動・実行できるプラットフォームが Docker Containerization 「プロセス・ファイルシステム・ネットワーク・等々」に対して Namespace・Cgroup Build Ship Run
  120. 120. Docker Composeとは? 121 What is Docker Compose? 1 Composeは アプリケーションの サービスをファイル で定義する 2 Dockerコマンドと 高い親和性がある ため、学習コストが 比較的に低い 3 Swarm モードに サービスをデプロイ できるオーケストレー ション機能 ⚫ docker-compose CLI のコマン 体系は docker に準拠 ⚫ 例:「docker run -d」は 「docker-compose up -d」 ⚫ Docker swarm モードを使えば、 サービス状態を定義できるので 常に期待状態を維持できる ◼ docker stack deploy ⚫ Ingress ネットワークの活用 ⚫ Compose ファイル (YAML形式) で Docker コンテナのサービスを 定義できるため、 再利用性が高い ◼ コンテナの状態 ◼ イメージ ◼ ネットワーク ◼ ボリューム ◼ メタ情報 https://github.com/docker/compose 複数のコンテナで構成するアプリケーションを 定義と実行するためのツール multi-container applications define and run
  121. 121. 122
  122. 122. Q&A • 何か気になるところはありますか? • https://slideshare.net/zembutsu • Dockerドキュメント日本語訳 http://docs.docker.jp • Docker Composeドキュメント日本語訳 http://docs.docker.jp/compose/ • 公式ドキュメント https://docs.docker.com 123

×