狠狠撸

狠狠撸Share a Scribd company logo
はじめての
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の周辺事情
? コンテナオーケストレーションがホット

More Related Content

はじめての顿辞肠办别谤パーフェクトガイド(2017年版)