Más contenido relacionado La actualidad más candente (20) Similar a コンテナの作り方「Dockerは裏方で何をしているのか?」 (20) Más de Masahito Zembutsu (20) コンテナの作り方「Dockerは裏方で何をしているのか?」3. @zembutsu
前佛 雅人
zembutsu@zembutsu
さくらインターネット株式会社 技術本部
Technology Evangelist / Developer Advocate
⚫ 石狩市への小学校プログラミング教育支援プロジェクト → さくらの学校支援プロジェクト (2019~)
⚫ 仮想化基盤チーム(クラウドチーム・VPSチーム)
⚫ エバンジェリストチーム
⚫ 略歴
• 1986年 はじめてパソコンに触る
• BASIC挫折
• 1993年 富山高専(電気工学科)で学び始める
パソコン通信・インターネットとの遭遇
• 2000年 富山のIT企業に就職
• とあるホスティング&ISPで勤務
NOC対応・運用・サポート業務に携わる
• 2007年 東京へ
• システム運用とか監視をいろいろ、企画
• 自動化ツール
• 2019年 大阪在住
何をしたいの?:普通の人が当たり前に計算資源を活用して、
豊かな生活を実現できるように支援する
本発表は「コンテナとは何なのか?」「Dockerは何をしているのか?」の2点に絞り、初学者が混乱しがちな部分を整理します
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の「定義」からみていきましょう。
これは Docker のマスコットキャラクターで
名前は Moby です。
モビー
ドッカー
ドッカー
13. Dockerとは何であるかの定義
13
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
全ての依存関係をパッケージ化して、コンテナとして動かす
Dockerはプログラム実行に必要な「すべての依存関係」をパッケージにします。バイナリやライブラリ、設定ファイル等。
14. Dockerとは何であるかの定義
14
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
全ての依存関係をパッケージ化して、コンテナとして動かす
パッケージするのは、/ (ルート) ディレクトリ以下、 /bin や /etc や /var などの「Linuxファイルシステム」。
それと、「メタ情報」と呼ぶ、どのプロセスを自動実行するか、ポートを公開するなどの汎用情報も入ります。
Linuxファイルシステムを
15. Dockerとは何であるかの定義
15
“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イメージ」にパッケージ化。これは、仮想マシンの(ディスク)イメージとは全く異なる概念。
Dockerイメージとは、正確には「Dockerコンテナの実行に必要な、命令の入ったテンプレート」なのです。
16. Dockerとは何であるかの定義
16
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
全ての依存関係をパッケージ化して、コンテナとして動かす
Dockerイメージとして
Linuxファイルシステムを
そして、イメージの中にあるファイルを、「コンテナ」として「動かす」のが新しい概念です。コンテナとして動かすとは・・・?
20. 20
(物理または仮想)
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
OSの領域が記憶装置内のファイルシステム内にあり、
メモリ空間への読み込みや CPU で命令を実行します。
22. 22
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プロセス
バイナリ 設定ファイル ソースコード データ
プロセス
一般的な
プロセス実行
プログラムを実行します。この実行状態のプログラムを
プロセスと呼び、OS上の様々なリソースにアクセスします。
23. 23
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
バイナリ 設定ファイル ソースコード データ
コンテナは
特別な状態の
プロセスのこと
isolate(隔離)
プロセス
isolate(隔離)
プロセス
「コンテナ」としてのプロセスも、プログラムの実行という
意味では同じですが、Dockerの介在で、Linuxカーネル
など諸機能によって “isolate” (隔離)したプロセスです。
アイソレート
アイソレート アイソレート
25. 25
isolate(分離)する
ア イ ソ レ ー ト
“名前空間”技術を使って
namespace
大事なのは、Dockerで何かのプロセスを実行時、Linuxカーネルにある複数の名前空間技術を使い、
特別な状態のプロセス、つまり、様々な名前空間等をisolate(分離)して実行する点です。分離して実行。
日本語ではisolateを「隔離」と翻訳することもありますが、
意味としては「地理的に異なる場所に引き離す」のではなく、
壁や襖のように「分割」「区分けする」や「分離」するという
意味合いのほうが、適切と思います。
DockerはLinuxプロセスに対して、
様々な名前空間やリソース等、
「プロセスの実行環境」を
ネームスペース
アイソレート
38. コンテナは特別なプロセスの状態
38
httpd の専用ファイルシステム
(Dockerイメージ)
… …
ruby の専用ファイルシステム
(Dockerイメージ)
/etc
(/data/ubuntu/etc)
/bin
(/data/ubuntu/bin)
/etc
(/data/centos/etc)
/bin
(/data/centos/bin)
/ /
httpd
PID 1
httpdプロセス専用の
PID名前空間
ruby プロセス専用の
PID名前空間
ruby
PID 1
chris.rb
PID 2
httpd コンテナの名前空間 ruby コンテナの名前空間
名前空間の isolate
・プロセス
・ファイルシステム
・ネットワーク
・ホスト名
・UID・GID
・プロセス間通信、等
cgroupでリソース制限
・CPU
・メモリ
・I/O
・ディスク・クォータ、等
PID名前空間、マウント名前空間
以外にも、ネットワークなども分
離しています。さらに、それぞれの
コンテナにcgroupでリソースの
制限も可。ただし、コンテナは仮
想マシンではありません。ハード
ウェアの仮想化は行わず、あくま
でも、プロセスを特別な状態
にしているだけです。
mount
名前区間
mount
名前区間
41. 41
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Docker イメージ
ビルド
pull
Dockerイメージ Dockerイメージ
※異なるシステム、バージョン、ソースコード
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
Dockerは先ほどのコンテナ状態でプロセスを動
かす時、Linuxカーネルと通信したり、Dockerイ
メージをとってきたりする役割があり、Linux サー
バ上では dockerd という名前のデーモンが動き
ます。これを「Docker エンジンと」呼びます。
42. 42
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Dockerコンテナ
プロセス
Dockerコンテナ
プロセス
Docker イメージ
ビルド
pull
Dockerイメージ Dockerイメージ
※異なるシステム、バージョン、ソースコード
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
「実装としての」Dockerイメージを用い、Docker
コンテナとしてisolateされたプロセスを動かすの
が Docker(エンジン)。実はDocker以外にもコン
テナと呼ばれる実装は、LXCなり各種自作なりを
含めて複数のものがあります。
43. Dockerはサーバ・クライアント型モデル
43
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エンジン(dockerd)はAPIで制御でき、
通常は「docker」という名称のコマンドラインで、「docker run hello-world」のように実行します。
44. 【参考】 Docker Engine のアーキテクチャ
44※ 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 イメージに含むファイルを、
パラメータに従い、コンテナとして実行
コンテナを実際に作成・起動する
ランタイムのバイナリ・プログラム
コンテナやイメージをはじめとし、
ネットワーク、ストレージを管理する
必要最小限のデーモン
ランタイムが実行したコンテナを管理
厳密には、1つ1つのコンテナはrunCというランタイムが管理し、
これらを containerd というデーモンで管理し、docker コマンド
の受付や全体の処理を dockerd が行います。
ランシー
46. docker image pull (docker pull)
46
$ docker image 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
まず、Dockerイメージは、Docker Hubと呼ばれるイメージを共有・共同作業・自動構築するための
公開リポジトリ上を通して配布されており、ここからダウンロードしたり、アップロードしたりできます。
ドッカーハブ
ドッカー イメージ プル ドッカー プル
※Dockerイメージを、ローカルにダウンロードするコマンド
Dockerイメージを準備するには、
自分で構築(ビルド)する方法と
ダウンロードする方法があります。
47. 47
$ 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 pull イメージ名」コマンドの実行は、ユーザ名に相当する名前空間(スラッシュより前)が無ければ、
自動的に公式イメージ用の「library」というリポジトリからダウンロードします。
docker image pull (docker pull)
Docker Hub
ドッカー イメージ プル ドッカー プル
※Dockerイメージを、ローカルにダウンロードするコマンド
「pull」コマンドは「引っ張ってくる」
という意味です。Docker Hub から
イメージを引っ張ってきます。
ライブラリ
54. 54
利用者からは
1つに見える
docker image build -t <IMAGE:TAG> .
(docker build)
そして、Dockerflie の各行が、(抽象概念としての)イメージ・レイヤを構成しています。これは Alpine Linux です。
Dockerfile で Docker イメージを自動構築するコマンド:
ドッカー イメージ ビルド 疑似tty イメージ・コロン・タグ
最後のドットがコンテクスト(Dockerfileのある場所)を指定
ドッカーファイル
57. Dockerfileで中間コンテナ実行・イメージ作成を自動化
❶ まず Dockerfile を
書きます。あるいは、
GitHub等から取得
❷ “docker build” で
Docker はイメージを
自動構築開始
❸完成したイメージで
コンテナを起動したり
DockerHubに送信を
命令1
命令2
命令3
$ mkdir myproject
$ cd myproject
$ vim Dockerfile
$ docker build -t myproj .
読み込み
イメージレイヤ群を自動構築
Dockerfile
$ docker run -d myproj
$ docker push
DockerがDockerfileを読み込み
中間コンテナを起動して命令を実行
→docker commitでイメージ化
(((
commit
commit
commit
通常、Docker コンテナを作って
実行するまでは、このような流れ
62. Docker BuildKit を使う方法
• クライアントの環境変数
• Docker デーモン設定ファイル /etc/docker/daemon.json
62
{ "features": { "buildkit": true }}
export DOCKER_BUILDKIT=1
現在の Docker 18.03 以降では、 BuildKit を有効にすると、並列ビルドなどによって高速にイメージを構築できます。
79. 【参考】 swarm mode のネットワーク機能
79
Multi Host Networking
Worker
node
Worker
node
Worker
node
overlay
network
Ingress
network
コンテナ
PublishPort
Routing
Mesh
80 443 80 443 80 443
負荷分散
swarm mode でクラスタを組む場合、複数のサーバ間で共通の ingress ネットワークを利用できます。
クラスタのどのノードにアクセスしても、内部ネットワークを通して、コンテナが存在するノードにルーティングし、
複数台のコンテナがある場合は負荷分散も行います(コンテナのサービス名で名前解決します)。
サービス・ディスカバリ
(動的な名前解決)
スウォーム・モード
公開ポート
イングレス・ネットワーク
オーバレイ・ネットワーク
ワーカーノード
ルーティング・メッシュ
85. 85
コンテナ
ファイル階層
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
このように、コンテナ上で見えるファイルシステムは、複数のディレクトリを1つに統合して操作可能にしています。
94. Dockerとは?
94
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
コンテナ化 名前空間 シーグループ