Docker基礎概念と用語の理解
Docker Dojo Online #1
Sakura internet, Inc.
Masahito Zembutsu @zembutsu
#dockerdojo
Oct 10, 2020
Docker の基本キーワード
• BUILD、SHARE(SHIP)、RUN
• Docker (ソフトウェアとプラットフォーム)
• Docker Engine
• Docker コンテナ
• Docker イメージ → イメージ・レイヤ 、 Dockerfile
• Docker ネットワーク
• Docker ボリューム
• Docker Hub
• Docker Compose
• Docker Desktop
• Play with Docker https://labs.play-with-docker.com/
• ドキュメント https://docs.docker.jp
2
コンテナを作る
3
#とは
4
Nginxのコンテナを作っておいたよ
hello-world のコンテナを実行したよ
そもそも Docker とは?
Why Docker?
5
Dockerとは?
6
Why Docker?
1
Dockerコンテナは
実行に必要な全て
をパッケージして、
簡単に動かせる
2
Dockerイメージは
複数のイメージ・レイ
ヤとメタ情報の積み
重なり
3
コンテナのプロセス
はデフォルトで
isolate(隔離・分離)
された状態
プロセスを簡単にコンテナ化(isolate)し、
簡単かつ素早く開発・移動・実行できるプラットフォームが Docker
Containerization
「プロセス・ファイルシステム・ネットワーク・等々」に対して
Namespace・Cgroup
Build Ship Run
7
技術と仕様
Technology Specification
コンテナ Docker
Docker
8
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
全ての依存関係をパッケージ化して、コンテナとして動かす
Dockerイメージとして
Linuxファイルシステムを
9
(物理または仮想)
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
10
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プロセス
プログラム 設定ファイル ソースコード データ
プロセス
一般的な
プロセス実行
11
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プログラム 設定ファイル ソースコード データ
コンテナは
特別な状態の
プロセスのこと
isolate(隔離)
プロセス
isolate(隔離)
プロセス
12
isolate(分離)する
ア イ ソ レ ー ト
“名前空間”技術を使って
namespace
13
コンテナは特別なプロセスの状態
14
コンテナ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
・ディスク・クォータ、等
PID名前空間
15
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
ホスト上には存在
ファイルシステムを分ける (chrootのような概念)
16
ubuntuの
ファイルシステム
… …
centosの
ファイルシステム
/etc /bin /etc /bin
/ /
/data/ubuntu /data/centos
/
/etc /data/bin ホスト上には存在
コンテナは特別なプロセスの状態
17
コンテナ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
・ディスク・クォータ、等
「Dockerとコンテナ」のまとめ
⚫ Docker は、アプリケーションを実行するために必要な
依存関係(Linuxファイルシステム)を、Dokcer イメージにパッケージ化
⚫ アプリケーションを Docker コンテナとして実行するには、
Docker イメージが必要
⚫ コンテナは特別な状態のプロセスで
Linux カーネルの様々な名前空間
(namespace)を分離(isolate)し
起動するもの
18
ここまでの振り返り
Linux サーバ
Dockerが入っていない環境
同じ設定の Nginx を同時に起動できない
Nginx 1
ホスト側
ネットワーク
インターフェース
Port 80
Nginx 2
Listen: 80 Listen: 80待ち受けポート設定
Linux サーバ
Dockerが入っていない環境
同じ設定の Nginx を同時に起動できない
Dockerが入った環境
同じ設定の Nginx を同時に動かせる
Linux サーバ
Nginx 1
ホスト側
ネットワーク
インターフェース
Port 80
Nginx 2
Listen: 80 Listen: 80待ち受けポート設定
Port 80
Nginx 1 Nginx 2
Listen: 80 Listen: 80
Port 8080
コンテナ1 コンテナ2
21
では、Dockerは?
Dockerはサーバ・クライアント型モデル
22
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
23
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Dockerコンテナ
プロセス
Dockerコンテナ
プロセス
Docker イメージ
ビルド
pull
Dockerイメージ Dockerイメージ
※異なるシステム、バージョン、ソースコード
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
24
Dockerの登場背景
Build, Ship(Share), Run
25
The future of Linux Containers - YouTube
https://www.youtube.com/watch?v=wW9CAH9nSLs
26
Dockerイメージとは
docker image pull (docker pull)
27
$ 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
Dockerイメージはイメージ・レイヤの積み重ね
28
プログラムやライブラリと
メタ情報(実行するプログラムやポートなど)
Dockerイメージはイメージ・レイヤの積み重ね
29
利用者からは
1つに見える
親
子
関
係
派生も
共有
利用者からは
1つに見える
プログラムやライブラリと
メタ情報(実行するプログラムやポートなど)
だから高速に移動できる・開発を高速化できる
リソースを有効に使える “lightweight” な性質
30
利用者からは
1つに見える
docker image build -t <IMAGE:TAG> .
(docker build)
31
利用者からは
1つに見える
hello:v1
FROM alpine
ENTRYPOINT ["/bin/echo"]
CMD ["こんにちは!こんにちは!"]
docker image build -t hello:v1 .
(docker build)
32
hello:v1
FROM alpine
ENTRYPOINT ["/bin/echo"]
CMD [“おはよう!おはよう!"]
docker image build -t hello:v2 .
(docker build)
hello:v2
33
Dockerイメージは「1つのファイル」ではなく「概念」。抽象的なイメージ・レイヤの積み重ね
docker~.img
×
ではなく
「Dockerイメージ」のまとめ
⚫ Docker イメージは、イメージ・レイヤの積み重ねで構成
⚫ 各イメージ・レイヤの中に「ファイルシステム」と「メタ情報」を含む
⚫ イメージ・レイヤは親子関係
⚫ 複数のレイヤ上のファイルや
ディレクトリが1つに見える
34
ここまでの振り返り
35
Dockerイメージを
どうやって作る?
36
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
38
Dockerコンテナとは
39
技術と仕様
Technology Specification
コンテナ Docker
Dockerコンテナ実行とは、イメージ内のプログラムを実行
40
元のレイヤに対する変更情報を記録
Copy on Write の性質
コンテナ実行時に、読み書き可能なコンテナ用のイメージ・レイヤを作成し、プログラムを実行します。
docker container run -it alpine
(docker run)
この例では、ベースとなるのが
“alpine” Dockerイメージです
(読み込み専用。一切変更できません。)
変更できるのは、 “alpine” を親イメージ・レイヤとして
情報を持っている、赤い部分の読み書き可能なレイヤ。
(docker ps -aで確認でき、docker rm で消すのは
このコンテナ用レイヤです)
ファイル変更時は、読み込み専用のイメージ・レイヤ
から一度ファイルをコピーする挙動が発生します。
(これを、コピー・オン・ライトと呼びます)。
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
名前区間
Docker コンテナの実行とは、特別な状態でのプロセス実行
Dockerコンテナもイメージ・レイヤを持つ
42
元のレイヤに対する変更情報を記録
Copy on Write の性質
利用者からは
1つに見える
利用者からは
1つに見える
だから高速に移動できる・開発を高速化できる
リソースを有効に使える “lightweight” な性質
「Dockerコンテナ」のまとめ
⚫ Docker は、アプリケーションを実行するために必要な
依存関係(Linuxファイルシステム)を、Dokcer イメージにパッケージ化
⚫ コンテナは特別な状態のプロセスで
Linux カーネルの様々な名前空間
(namespace)を分離(isolate)し
起動するもの
⚫ Docker コンテナは、読み書き可能な
イメージ・レイヤを持つ
⚫ Docker イメージに対する変更は、このコンテナ用レイヤで行われる 43
ここまでの振り返り
“hello-world” イメージとコンテナ
docker run hello-world
44
docker run hello-world
45
library/hello-world
公式イメージの名前空間
他のイメージ
リポジトリ
他のイメージ
リポジトリ
Docker Hub
(公開レジストリ)
0e03bdcc26d7
tag:latesthello-world の のイメージ
このイメージは1つのレイヤで、Docker Hub 上では
docker pull hello-world:latest
latest タグを持つ、
実体としてのイメージ(レイヤ) ID は
bf756fb1ae65...
Docker イメージのダウンロード
/hello
Dockerイメージのファイルシステムに「/hello」が存在
「/hello」を自動実行する情報を持つDockerイメージ
/var/lib/docker/overlay2/...../hello
ホスト上に実体として「hello」があるイメージ・レイヤ
「/hello」を自動実行するメタ情報を持つイメージ・レイヤ
+
この2つのイメージ・レイヤの情報が統合されて...
コンテナ実行時、Dockerイメージ(レイヤ)のファイルシステムも「/ 」にマウント
「/hello」 を
専用の PID 名前空間内で
PID 1 として実行する
プロセスはホスト上で実行するが、
この PID 名前空間内では自身の
「hello」しか認識しない。
また、ホスト上では正しい PID を持つ
【 PID 1 】
hello
demo
「hello-world コンテナ実行」のまとめ
⚫ “hello-world” イメージは複数のイメージ・レイヤの積み重ね
⚫ “hello”というバイナリを
コンテナ状態で実行する
52
ここまでの振り返り
Dockerfile
Docker Composeとは?
53
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
図:Docker Comose で WordPressを動かす
Linux サーバ
Port 8080
wordpress
サービス
(コンテナ)
Listen: 80
WordPressのComposeプロジェク
ト
mysql
サービス
(コンテナ)
Listen: 3306
プロジェクト用ボリューム
プロジェクト用
ブリッジ・ネットワーク1
ホスト側インターフェース
図:Docker Comose は複数のプロジェクトが共存
Linux サーバ
Port 8080
wordpress
サービス
(コンテナ)
Listen: 80
Port 80
WordPressプロジェクト1
mysql
サービス
(コンテナ)
Listen: 3306
プロジェクト用ボリューム
プロジェクト用
ブリッジ・ネットワーク1
wordpress
Listen: 80
WordPressプロジェクト2
mysql
Listen: 3306
プロジェクト用ボリューム
プロジェクト用
ブリッジ・ネットワーク2
ホスト側インターフェース
Play with Docker
56
https://labs.play-with-docker.com/
57
振り返り
58
Docker の基本キーワード
• BUILD、SHARE(SHIP)、RUN
• Docker (ソフトウェアとプラットフォーム)
• Docker Engine
• Docker コンテナ
• Docker イメージ → イメージ・レイヤ 、 Dockerfile
• Docker ネットワーク
• Docker ボリューム
• Docker Hub
• Docker Compose
• Docker Desktop
• Play with Docker https://labs.play-with-docker.com/
• ドキュメント https://docs.docker.jp
59
Dockerとは?
60
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
ありがとうございました。
• https://slideshare.net/zembutsu
• Dockerドキュメント日本語訳
http://docs.docker.jp
• Docker Composeドキュメント日本語訳
http://docs.docker.jp/compose/
• 公式ドキュメント
https://docs.docker.com
61

Docker道場オンライン#1 Docker基礎概念と用語の理解