More Related Content Similar to Docker Compose 徹底解説 (20) More from Masahito Zembutsu (20) Docker Compose 徹底解説5. お品書き
• Docker の本質的な存在意義とは
• Docker Compose とは何か?
• なぜ Docker Compose なのか?
• Docker Compose のセットアップと基本操作
• WordPress を Docker Compose で管理する例
• Docker Compose 活用のヒント(Tips)
5今日ここで共有させていただく内容は、こちらです。皆さまのご想像通りでしょうか?
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
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. 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. 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、走らせる)ことができます。
16. 16
(物理または仮想)
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
「プロセスの実行」とは、記憶装置にあるOSファイル
システム上のファイル(プログラム)に、CPUとメモリ
を使えるようにします。
17. 17
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プロセス
プログラム 設定ファイル ソースコード データ
一般的な
プロセス実行
一般的なプロセス実行は、この図のような概念です。
プログラムでプロセスを動かし、プロセスはOS上の
ファイルにアクセスできます。
18. 18
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プロセス
プログラム 設定ファイル ソースコード データ
プロセス
一般的な
プロセス実行
サーバ用とのLinux上では、1つのマシン上で、
同時に沢山のプロセスが稼働できます。プロセス
間で通信する場合もあります。
19. 19
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プログラム 設定ファイル ソースコード データ
コンテナは
特別な状態の
プロセスのこと
isolate(隔離)
プロセス
isolate(隔離)
プロセス
そして「コンテナ状態」のプロセスは、isolate(隔離)
された特別な状態のプロセスです。名前空間機能で
プロセス空間、ファイルシステム等を分けて実行。
20. 20
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プログラム 設定ファイル ソースコード データ
コンテナは
特別な状態の
プロセスのこと
isolate(隔離)
プロセス
isolate(隔離)
プロセス
名前空間(namespace)はLinuxカーネルの機能。
これを、簡単に管理できるようにするツールかつ
プラットフォームが、Docker(エンジン)なのです。
33. 33
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Docker イメージ
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
Dockerはコンテナ管理プラットフォーム。
設定ファイル、ソースコードなどを「Docker
イメージ」にまとめて、実行します。このイメー
ジを送受信する機能を持っています。
34. 34
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Docker イメージ
ビルド
pull
Dockerイメージ Dockerイメージ
※異なるシステム、バージョン、ソースコード
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
「docker pull」や「docker build」といった、
簡単なコマンドを実行するだけで、Docker
Hub (公式イメージ・レジストリ)から、自動で
Docker イメージをダウンロードします。
35. 35
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Dockerコンテナ
プロセス
Dockerコンテナ
プロセス
Docker イメージ
ビルド
pull
Dockerイメージ Dockerイメージ
※異なるシステム、バージョン、ソースコード
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
あとは、Dockerイメージ内のファイルを使い
プロセスを名前空間を分離した特別な状態で
起動できるようにする。これがDockerの役割
なのです。
36. 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で構成。
37. 参考: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 イメージに含むファイルを、
パラメータに従い、コンテナとして実行
コンテナを実際に作成・起動する
ランタイムのバイナリ・プログラム
コンテナやイメージをはじめとし、
ネットワーク、ストレージを管理する
必要最小限のデーモン
ランタイムが実行したコンテナを管理
細かく見ますと、
このようなプログラムで構成
51. 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イメージ
を共有・公開・共同作業する場所です。
52. 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」が公式イメージ専用の名前空間で、セキュリティ上、公式のみ使うべきです。
56. Dockerコンテナ実行とは、イメージ内のプログラムを実行
56
元のレイヤに対する変更情報を記録
Copy on Write の性質
コンテナ実行時に、読み書き可能なコンテナ用のイメージ・レイヤを作成し、プログラムを実行します。
docker container run -it alpine
(docker run)
この例では、ベースとなるのが
“alpine” Dockerイメージです
(読み込み専用。一切変更できません。)
変更できるのは、 “alpine” を親イメージ・レイヤとして
情報を持っている、赤い部分の読み書き可能なレイヤ。
(docker ps -aで確認でき、docker rm で消すのは
このコンテナ用レイヤです)
ファイル変更時は、読み込み専用のイメージ・レイヤ
から一度ファイルをコピーする挙動が発生します。
(これを、コピー・オン・ライトと呼びます)。
60. 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」。
72. 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
76. 76
ふくすう の コンテナ を きどう しよう
システム
コンテナ
コンテナ
システム
コンテナ
スケールしづらさ
管理のしづらさから
Dockerやk8sには
向かないね プロセス
A
プロセス
B
プロセス
C
1つのコンテナに多くのプロセスを集約する手法もありますが、スケールしづらくなります。
77. 77
ふくすう の コンテナ を きどう しよう
コンテナ
システム
コンテナ
ソフトウェアごとに
コンテナが別だから
スケールしやすいし
差し替えも簡単 プロセス
A
コンテナ
プロセス
B
コンテナ
プロセス
C
アプリケーション
コンテナ
プログラムごとにコンテナを分ける手法、これをアプリケーション・コンテナと呼ばれます。
78. 78
ふくすう の コンテナ を きどう しよう
コンテナ
システム
コンテナ
ソフトウェアごとに
コンテナが別だから
スケールしやすいし
差し替えも簡単 プロセス
A
コンテナ
プロセス
B
コンテナ
プロセス
C
アプリケーション
コンテナ
docker run …
docker run …
docker run …
ただし、コンテナごとにコマンドを実行する必要があり、ます。この画面では3回の実行ですが、、、
79. 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」から乖離してしまいます。
80. 80
docker-compose up
そこで コンポーズ の でばん
⚫ 環境はYAMLで管理
⚫ docker コマンドと類似
利用者側のメリット:
• compose ファイルがあれば、とにかく動く
ので(環境の再現性が高い)
開発者側のメリット:
• 1つのマシン上で、複数の環境を切り替え
やすい
そこで出てきたのがCompose。dockerと似たコマンドを実行するだけで、まとめてコンテナを実行。
85. 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
88. Docker Compose 活用場面
• 利用者視点
• 「docker-compose.yml」があれば、すぐに何でも実行できる
• YAML形式で記述
• Docker Hub 公式イメージ上でサンプルが公開されている
• PWD (Play With Docker という、無料で短時間利用できるクラウド上のリソース)でお試し
• 開発者視点
• 環境の再構築が簡単
• バージョン違いの環境を作りやすい
• 1つのマシン上に、複数の環境を立ち上げられやすい
88適切に書いたYAMLファイルさえあれば、誰でも簡単に実行できるのが強み。しかも、環境まとめて。
89. 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という選択肢も。
90. 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 のバイナリを、別途セットアップする必要があります。
92. docker-compose.yml
• 「サービス」「ネットワーク」「ボリューム」を定義
• image … イメージ IDやイメージ名
• build … Dockerfile のパス(イメージを構築する場合)
• command … デフォルトの(イメージ実行時)コマンドを上書き
• restart … コンテナの再起動ポリシー(例: always)
• ports … ポートのマッピング
• environment: , env_file: 環境変数の指定
92
services: networks: volumes:
Docker Composeは「プロジェクト」を操作。プロジェクトを定義するのが、このComposeファイル。
93. 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 ネットワークに所属
しているため、お互い内部通信可能
94. 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時の挙動
別例:
100. 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でボリュームも)
◀ ボリュームの全削除
101. Compose ファイル形式バージョン
• networks: volumes: は v2 , v3 で利用可能
• v3 を使うには Docker v1.13 以上
• Swarm mode を使うには v3 (同じオプションでも v2 と挙動が異なる)
• 細かな差違はリファレンス
https://docs.docker.com/compose/compose-file/
101細かな挙動の違いはあるものの、docker stack コマンドで swarm 使わなければ、ほぼ考慮不要。
102. コンテナ内の環境変数 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 の内容
103. 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:」を指定する方法がある。
105. 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)の関係性がこちら。
106. 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」が該当。
108. 宣言型サービス・モデルのオーケストレーション
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では、定義した「あるべき状態」を自動的に維持する仕組み。
109. 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」(スタンドアロン)とは別モノ。
110. 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」の実行で、直ちに有効化できる。
111. 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ファイルがあれば、それを使ったデプロイも可能。
サービス・ディスカバリ
(動的な名前解決)
113. 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 のセットアップが必要。準備はこれだけ。
114. クラスタ初期化と 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 コマンドで操作可能。
ここに出てくる文字列を
ワーカノードで実行
115. クラスタ 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
ノード追加時のコマンドを忘れてしまった場合は、このコマンドで確認。
116. クラスタ状態確認
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
あとは、ノードの状態を確認したり、
117. 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
サービスのデプロイも行えるようになる。
118. 詳しい手順は、チュートリアルやドキュメントを
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
121. 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