はじめての
Docker
パーフェクトガイド
(2017年版)
自己紹介
早川 博(はやかわ ひろし)
@hhiroshell
• 日本オラクル 所属
• Pre-Sales Engineer / Tech Evangelist (new!)
• Java SE/EE, Microservices/DevOps
はじめての Docker パーフェクトガイド(2017年版)
1. Dockerのテクノロジーを知る
2. Dockerの使いどころを知る
3. Dockerの周辺事情を知る
1. Dockerのテクノロジーを知る
Dockerキーワード
• コンテナって仮想化技術の一種なんだよね
• すごく起動が速いんだよ。コンテナだから
• コンテナにしたものはどこでも動くんだよね
• れじすとり…?
Dockerのテクノロジー全体像
Docker Daemon
コンテナ イメージ
Dockerクライアント
Dockerホスト
Dockerレジストリ
Dockerのテクノロジー全体像
Docker Daemon
コンテナ イメージ
Dockerクライアント
Dockerホスト
Dockerレジストリ
docker コマンド
イメージ取得
コンテナ起動
Dockerのテクノロジー全体像
Docker Daemon
コンテナ イメージ
Dockerホスト
Dockerレジストリ
Dockerクライアント
Dockerクライアント
• Dockerホストを操作するためのコマンドライン・インター
フェース
• コマンドを実行すると、Docker DaemonのREST API(Docker
API)を呼び出す
hhayakaw@HHAYAKAW-JP MINGW64 ~
$ docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
psmcli gse00002265 c8d807ff0bf2 2 days ago
704MB
python 3.6 79e1dc9af1c1 4 days ago
691MB
hhayakaw@HHAYAKAW-JP MINGW64 ~
Dockerのテクノロジー全体像
Dockerクライアント
Dockerレジストリ
Dockerデーモン
コンテナ イメージ
Dockerホスト
Dockerホスト
• Dockerホスト
• Dockerデーモン(Dockerの管理プロセス)が動く場所
• コンテナの実行環境
• イメージのキャッシュの保持
• Dockerデーモン( dockerd )
• Dockerの管理プロセス
• Dockerクライアントからの指示を受けて、イメージの管理、コンテナの起動
などを行う
• Dockerコンテナ/Dockerイメージ
• (後述)
DockerイメージとDockerコンテナの関係
イメージを元にコンテナが作られる
ひとつのイメージから複数のコンテナを作ることができる
DockerコンテナDockerイメージ
= =
雛形
動作する
マシンの実態
焼型 たい焼き
• 例えば…
仮想化の実現方式の違い
ハイパーバイザー型 vs. コンテナ型
• ハイパーバイザー型 • コンテナ型
H/W
ホストOS
Docker
Bins/Libs
App A
Bins/Libs
App C
Bins/Libs
App B
ホストOS
ハイパーバイザー
Bins/Libs
App A
Bins/Libs
App C
Bins/Libs
App B
ゲストOS ゲストOSゲストOS
H/W
VM コンテナ
仮想化の実現方式の違い
ハイパーバイザー型 vs. コンテナ型
• ハイパーバイザー型
• ハイパーバイザーがHWをエ
ミュレート
• VMはOSの完全なコピーを保持
• コンテナ型
• ホストのHW、カーネルをコン
テナが利用
• コンテナはカーネルより上位層
のみ保持
H/W
ホストOS
Docker
Bins/Libs
App A
Bins/Libs
App C
Bins/Libs
App B
ホストOS
ハイパーバイザー
Bins/Libs
App A
Bins/Libs
App C
Bins/Libs
App B
ゲストOS ゲストOSゲストOS
H/W
仮想化の実現方式の違い
ハイパーバイザー型 vs. コンテナ型
• ハイパーバイザー型
• 起動にかかる時間が長い
• OSの起動を伴う上、HWエミュ
レートのオーバーヘッドがある
• VMの容量が大きい
• 数十GB~
• パフォーマンスが落ちがち
• HWエミュレートのオーバーヘッ
ドのため
• コンテナ型
• 起動にかかる時間が短い
• ほとんどアプリケーションのプロ
セスの起動のみ
• コンテナの容量が小さい
• 数十MB~
• パフォーマンスが落ちにくい
• HWエミュレートのオーバーヘッ
ドがない
Dockerイメージの実態
id: ow3hfw83
Dockerイメージ = カーネルを除いた、そのOSの一連のファイル群
/bin /boot /dev /etc /home /lib /lib64
/media /mnt /opt /proc /root /run
/sbin /srv /sys /tmp /usr /var
Dockerイメージの実態
id: ow3hfw83
id: ow3hfw83
id: ow3hfw83
id: ow3hfw83
Dockerイメージ = カーネルを除いた、そのOSの一連のファイル群
に、レイヤー構造が加わったもの
/bin /boot /dev /etc…
下レイヤーとの差分
下レイヤーとの差分
下レイヤーとの差分
最下層に全ての差分が適用された結果として、ファイルシステムが見える → Union File
System
Dockerイメージの実態
id: ow3hfw83
id: ow3hfw83
id: ow3hfw83
id: ow3hfw83
Ubuntu OSのインストール・イメージ
Python 3.xをインストール
必要なPIPパッケージをインストール
アプリケーションをインストール
最下層に全ての差分が適用された結果として、ファイルシステムが見える → Union File
System
Dockerイメージ = カーネルを除いた、そのOSの一連のファイル群
に、レイヤー構造が加わったもの
Dockerコンテナの実態(起動前)
id: ow3hfw83
id: ow3hfw83
id: ow3hfw83
id: ow3hfw83
書込み可能な最上位レイヤーを加えたUnion File System
/bin /boot /dev /etc…
下レイヤーとの差分
下レイヤーとの差分
下レイヤーとの差分
id: ow3hfw83
下レイヤーとの差分(書き込み可能)
起動前のコンテナ→操作可能なファイル群だけがある状態 (c.f. シャットダウンしたPC)
プロセス群が利用する
CPU、メモリ、ネットワーク
Dockerコンテナの実態(起動後)
id: ow3hfw83
id: ow3hfw83
id: ow3hfw83
id: ow3hfw83
UFSのマウント + 所望のプロセス + 必要なリソース
id: ow3hfw83
+
プロセス群
ただし、適切に隔離してあげる必要がある
起動後のコンテナ①
ファイルシステム
• コンテナのファイルシス
テムが、Dockerホストの
然るべきパスにマウント
される
• カーネルのchrootシステ
ムコールを利用
/
/etc /bin /data
/data/cont1 /data/cont2
/
/etc /bin
/
/etc /bin
起動後のコンテナ②
プロセス
• カーネルの名前空間の機能
を利用して、コンテナ毎に
PIDの体系を持てるように
する
• 名前空間が異なるプロセス
同士は、参照できないよう
に隔離される
/sbin/init
PID 1
hoo
PID 2
bar
PID 3
dockerd
PID 4
containerd
PID 5
httpd
PID 6
java
PID 7
Java
PID 8
httpd
PID 1
java
PID 1
java
PID 2
起動後のコンテナ③
ネットワーク
• Dockerデーモンが仮想ブ
リッジ docker0を構成
• 仮想NICのペア vethを仮想
ブリッジに接続
• コンテナからはeth0と言う
NICがあるようにみえる
• 仮想ブリッジはIPマスカ
レード利用してコンテナと
外部との通信を仲介
vethveth
eth0
(veth)
eth0
(veth)
コンテナ1 コンテナ2
eth0
仮想ブリッジ(docker0)
Dockerイメージの作り方 (1/2)
• 起動したコンテナ上で変更を加えたものをイメージ化
id: ow3hfw83
id: ow3hfw83
Ubuntu OSのインストール・イメージ
Python 3.xをインストール
←所望のPIPパッケージを追加
> docker commit
id:
ow3hf
w83
id:
ow3hf
w83
id:
ow3hf
w83
Dockerイメージの作り方 (2/2)
• Dockerfile
• Dockerイメージの内容をテキストファイルで定義するもの
• ベースのイメージを元に、その差分を一連のShellコマンドで記述
• Dockerfileを入力として、[docker build]コマンドを実行すると、
Dockerfileの内容を元にイメージが作られる
> docker build
id:
ow3hf
w83
id:
ow3hf
w83
id:
ow3hf
w83
Dockerfile
FROM python:3.6
ARG user
ARG password
WORKDIR /root
# Install PIP Package
RUN curl -X GET 
-u ${user}:${password} 
-H X-ID-TENANT-
NAME:sample_domain 
-o psmcli.zip
RUN pip3 install -U psmcli.zip
# Setup Installed Pacakge
RUN psm setup
Python 3.6のインストールイメージを取得
(後続のコマンドのための環境設定)
PIPパッケージのダウンロード
PIPパッケージのインストール
(コンテナのデフォルト起動プロセスを指定)
Dockerfileの例
Dockerのテクノロジー全体像
Dockerクライアント
Dockerデーモン
コンテナ イメージ
Dockerホスト
Dockerレジストリ
Dockerレジストリ
• Dockerイメージの保管・配送システム
• Docker公式の「Docker Hub」のほか、サードパーティが公開
しているレジストリや、自分で構築したレジストリを利用可能
Dockerクライアント
Dockerデーモン
コンテナ イメージ
Dockerホスト
Docker Hub
Oracle Container
Registry
Dockerキーワード
• コンテナって仮想化技術の一種なんだよね
• すごく起動が速いんだよ。コンテナだから
• コンテナにしたものはどこでも動くんだよね
• レジストリ!
2. Dockerの使い所を知る
Dockerの特徴を振り返る
• 高い可搬性
• どこでも動く
• 単体で必要な依存関係含めコンテナにパッケージ
• 軽量/高速
• イメージの容量
• 高速起動
• Hypervisorのオーバーヘッドなし
• エコシステム
• イメージの公開再利用
• コンテナレジストリを介した連携
アプリケーション開発①
• 継続的デリバリー
• 各テストフェーズでの環境構築の省力化/品質向上
• 開発→リリースまでのリードタイムを短縮
手作業での
テスト
コンテナ レジストリ
自動受け入れ
テスト
自動
キャパシティ
テスト
リリースコミットステージ
ソースコード
リポジトリ
コミット
コンテナとしてビルド。以降のフェーズで使い回し
アプリケーション開発②
• ローカル開発環境を快適に…
• コンテナで本番同等のMW環境をつくって常に動作確認
コンテナレジストリ開発用WLSイメージ
実装
UT
war 作成
IT
開発者用 PC
ここまで完全自動化 手動テストフェーズへ
アプリケーションの運用環境
• Kubernetesクラスター
• 大規模なアクセス数変動に耐える柔軟性を、オーケストレーションの
しくみと組み合わせることで実現
特殊なSWの隔離とパッケージ化
• インストールすると他のSWの動作に影響し易いSW(煩雑な依
存条件があるなど)をコンテナにパッケージングして隔離
• 動作環境の構築が難しいSWをコンテナ化して、公開再利用
→ニッチな用途の実行環境をゲットできる
• 例:
• キーボードのファームウェアの
ビルド(make)環境
• Python2.xに依存するコマンド
ラインツールの実行環境
3. Dockerの周辺事情を知る
抑えておくべきキーワード
• コンテナ・オーケストレーション
• Cloud Native Computing Foundation
コンテナ・オーケストレーション
• コンテナのデプロイとスケーリング自動化するプラットフォーム
• Kubernetes, MESOS, Docker Swarm
• Kubernetesがデファクトになりつつある状況
• CNCFによるバックアップ
• Google, MS等によるホスティングサービスの提供
• Docker EE でのKubernetesサポート開始 (2017~)
コンテナ・オーケストレーション
こういうことがしたい
大きなリソースのプール
こういうことがしたい
コンテナ
はい!
動け!
こういうことがしたい
はい!
がんばれ!
自動で複数のマシンに分散配置
こういうことがしたい
はい!
自律的にローリングアップデート
アップグレード!
こういうことがしたい
はい!
コンテナが落ちたら自動で新たに立ち上げる
Cloud Native Computing Foundation
• Linux Foundationの中のプロジェクト
• コンテナとその周辺技術に関するOSSのプロジェクトを、多数ホストして
いる
• Kubernetes
• fluentd
• Prometheus
• …
• 多数のメジャーSWベンダーがプラチナメンバーとして参画
• CNCFのバックアップ=これらの企業の人的/金銭的な投資が入る
Platinum Members
はじめての Docker パーフェクトガイド(2017年版)まとめ
1. Dockerのテクノロジー
• ハイパフォーマンス
• 高い可搬性
• レジストリを中心にしたエコシステム
2. Dockerの使い所
• 開発環境 (DevOps)
• 大規模本番環境
• 便利ツール
3. Dockerの周辺事情
• コンテナオーケストレーションがホット

はじめてのDockerパーフェクトガイド(2017年版)