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、走らせる)ことができます。
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で構成。
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」。
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」から乖離してしまいます。
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では、定義した「あるべき状態」を自動的に維持する仕組み。
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
あとは、ノードの状態を確認したり、