Docker事始めと最新動向
Haruka Iwao
Storage Solution Architect, Red Hat K.K.
June 5, 2015
自己紹介
•  岩尾 はるか (@Yuryu)
•  所属: レッドハット株式会社
– ストレージソリューションアーキテクト
– 大手家電メーカー、ソーシャルゲーム会社、
Web広告ベンチャーを経て現職
•  大学・大学院で高性能計算(HPC)、分散
ファイルシステムを研究
•  ゲーマーです(水鉄砲でペンキ飛ばしたい)
© Red Hat K.K. All Rights Reserved. 3
Dockerとは
•  コンテナ技術を利用したアプリケーショ
ンプラットフォーム
– “Operating System of the Cloud Era”
•  コンテナ+イメージ管理+α
•  Kubernetes などの周辺ツールも急速に進
化
© Red Hat K.K. All Rights Reserved. 4
Docker by Google Trends
© Red Hat K.K. All Rights Reserved. 5
コンテナとは
© Red Hat K.K. All Rights Reserved. 6
Linux KVM コンテナ
Linux コンテナの特徴
•  Linux標準のOSレベル仮想化機能
© Red Hat K.K. All Rights Reserved. 7
非仮想化環境 コンテナ環境
Linuxコンテナの特徴(2)
•  コンテナごとに独立したリソースを割り
当てることで、アプリケーションの実行
環境を分離
– 異なるプロセスID
– 異なるファイルシステム
– 異なるネットワーク設定(仮想NIC)
– CPU、メモリ割当量を制限
•  ソフトウェア仮想化と共存が可能
– クラウドの仮想マシン上でも動作
© Red Hat K.K. All Rights Reserved. 8
DockerとLinuxコンテナ
•  Dockerは、コンテナを実現する上でLinux
カーネルに既に存在する機能を活用
– Cgroup, namespace
– 基盤技術として実績がある
•  Dockerの考え方は、”Immutable
Infrastructure”と相性が良い
– Dockerfile によるコンテナ生成(再現性)
– OSファイルごとイメージ化(環境非依存性)
© Red Hat K.K. All Rights Reserved. 9
DockerとLinuxコンテナ(2)
© Red Hat K.K. All Rights Reserved. 10
eth0
eth0
App
ファイルシステム	
  
/	
  
├──	
  bin	
  
├──	
  etc	
  
├──	
  usr	
  
└──	
  ...	
  
コンテナ
イメージファイル
App
NATDevicemapper
Docker
Linuxコンテナ(プロセスグループ)
ホストOS
作成・管理
172.17.0.1
10.0.0.1
Dockerイメージ
© Red Hat K.K. All Rights Reserved. 11
Dockerイメージの構造
RHEL
nginx
Webサーバー
OSの基本
ファイル
OSの基本
ファイル
OSの基本
ファイル
nginx
nginx
HTML
ファイル
追加
追加
nginxイメージを元に作成
RHELイメージを元に作成
実体は共有
新規
起動、終了が非常に高速
•  新しくコンテナを起動、実行、終了させ
るのに約0.2秒(Core i7 4558U 2.8GHz)
© Red Hat K.K. All Rights Reserved. 13
#	
  time	
  docker	
  run	
  	
  
	
  -­‐t	
  registry.access.redhat.com/rhel	
  	
  
	
  /bin/true	
  
	
  
real	
  0m0.234s	
  
user	
  0m0.010s	
  
sys 	
  0m0.020s	
  
Dockerの開発状況
© Red Hat K.K. All Rights Reserved. 14
コンテナ向けLinuxの登場
•  コンテナに最適化されたdistroの登場
– CoreOS
– Project Atomic
– Red Hat Enterprise Linux Atomic Host
– Snappy Ubuntu Core
•  小さなフットプリント
•  分散システム向けの機能を持つものも
– 例: etcd, fleet
© Red Hat K.K. All Rights Reserved. 15
DockerCon
•  米サンフランシスコにて、Docker専門の
カンファレンスが開催(2年目)
© Red Hat K.K. All Rights Reserved. 16
© Red Hat K.K. All Rights Reserved. 17
http://blog.docker.com/2014/06/keynote-videos-from-dockercon14/
Dockerへの支持
•  クラウド環境でのサポート
– Red Hat OpenShift
– Amazon Web Services
– Google Cloud Platform
•  周辺ソフトウェア
– Kubernetes
– Chef for Containers
© Red Hat K.K. All Rights Reserved. 18
Red Hat の取り組み
•  RHELへの移植
•  Device mapper thin-
provisioning への対応
– ディスク性能の向上
•  Systemd(RHEL7のプ
ロセス管理機能)との
統合
•  SELinuxへの対応
© Red Hat K.K. All Rights Reserved. 19
http://blog.docker.com/2014/06/keynote-videos-from-
dockercon14/
Docker in RHEL 7
•  RHEL 7 の “Extras” チャンネルで利用可能
•  フルサポートですぐに利用可能
© Red Hat K.K. All Rights Reserved. 20
RHEL6からRHEL7上のコンテナへ
© Red Hat K.K. All Rights Reserved. 21
互換性を保ちつつ、OSレベルの新機能を活用
•  コンテナホストのための最低限のOS環境
– Dockerに対応
– Systemd, SELinux 対応
– 少ないディスク、メモリ消費
– rpm-ostreeの採用
•  既存の契約で利用可能
RHEL Atomic Host
© Red Hat K.K. All Rights Reserved. 22
[1]	
  https://access.redhat.com/products/red-­‐hat-­‐enterprise-­‐linux/atomic-­‐host-­‐beta
rpm-ostree
•  Atomic Host における yum の代替
•  システム全体をスナップショットのよう
に管理
•  依存関係を追跡しないので高速
•  バージョンアップ、ダウンが容易
– rpm-ostree {upgrade|rollback|status|…}
© Red Hat K.K. All Rights Reserved. 23
コンテナのポータビリティ
© Red Hat K.K. All Rights Reserved. 24
Continuous Delivery with Docker
© Red Hat K.K. All Rights Reserved. 25
開発者
A
開発者
B
コードをpush
notify & build
notify & test
開発・テスト
開発者
C
デプロイ
コードからデプロイの高速化
•  コミットしてからユーザーに届くまで、
分単位で完了
•  価値を届けるのを高速化
•  Amazonは11.6秒に1度デプロイしている
•  Googleは1週間に20億のコンテナを起動
Dockerを使ってみる
Dockerイメージの作成手順
•  2ステップで作成できます
•  Dockerfile の作成
•  $ docker build -t <tag> Dockerfileの場所
– 例) $ docker build -t yuryu/test .
Dockerfileとは
•  イメージ作成の手順を書いたもの
•  例)
FROM	
  registry.access.redhat.com/rhel	
  
	
  
RUN	
  yum	
  -­‐y	
  install	
  httpd	
  
ADD	
  index.html	
  /var/www/html/index.html	
  
	
  
EXPOSE	
  80	
  
	
  
CMD	
  ["/usr/sbin/httpd",	
  "-­‐DFOREGROUND"]	
  
Dockerfile 文法
•  FROM - ベースとなるイメージ
•  RUN - イメージ構築で実行するコマンド
•  ADD - イメージ内にファイルを追加
•  EXPOSE - ポートを外に見せる
•  CMD - デフォルトで実行されるコマンド
FROM	
  registry.access.redhat.com/rhel	
  
	
  
RUN	
  yum	
  -­‐y	
  install	
  httpd	
  
ADD	
  index.html	
  /var/www/html/index.html	
  
	
  
EXPOSE	
  80	
  
	
  
CMD	
  ["/usr/sbin/httpd",	
  "-­‐DFOREGROUND"]	
  
Dockerfile 文法(2)
•  MAINTAINER - メンテナを書く
•  USER - コンテナ内で実行するユーザー
•  WORKDIR - 基準ディレクトリの変更
•  COPY - ホストからファイルのコピー
– ADD が大きすぎるので分割
•  その他リファレンスは下記
– https://docs.docker.com/reference/
builder/	
  
作って動かす
•  $ docker run で実行
– -d バックグラウンドで実行
– -P EXPOSE したポートを割り当て
$	
  mkdir	
  demo-­‐apache	
  
$	
  cd	
  demo-­‐apache	
  
$	
  curl	
  -­‐L	
  -­‐o	
  Dockerfile	
  bit.ly/1FA902p	
  
$	
  echo	
  “Hello,	
  Docker!”	
  >	
  index.html	
  
$	
  build	
  -­‐t	
  demo-­‐apache	
  .	
  
	
  
$	
  docker	
  run	
  -­‐dP	
  demo-­‐apache	
  
docker build 実行例
[yuryu@rhel7	
  docker-­‐apache]$	
  docker	
  build	
  -­‐t	
  demo-­‐apache	
  .	
  
Sending	
  build	
  context	
  to	
  Docker	
  daemon	
  3.584	
  kB	
  
Sending	
  build	
  context	
  to	
  Docker	
  daemon	
  	
  
Step	
  0	
  :	
  FROM	
  registry.access.redhat.com/rhel	
  
	
  -­‐-­‐-­‐>	
  e1f5733f050b	
  
Step	
  1	
  :	
  RUN	
  yum	
  -­‐y	
  install	
  httpd	
  
	
  -­‐-­‐-­‐>	
  Using	
  cache	
  
	
  -­‐-­‐-­‐>	
  3679b20fa9ba	
  
Step	
  2	
  :	
  ADD	
  index.html	
  /var/www/html/index.html	
  
	
  -­‐-­‐-­‐>	
  Using	
  cache	
  
	
  -­‐-­‐-­‐>	
  db91c285d5ad	
  
Step	
  3	
  :	
  EXPOSE	
  80	
  
	
  -­‐-­‐-­‐>	
  Using	
  cache	
  
	
  -­‐-­‐-­‐>	
  c9ceb17b169f	
  
Step	
  4	
  :	
  CMD	
  /usr/sbin/httpd	
  -­‐DFOREGROUND	
  
	
  -­‐-­‐-­‐>	
  Using	
  cache	
  
	
  -­‐-­‐-­‐>	
  4e99155706f6	
  
Successfully	
  built	
  4e99155706f6	
  
docker run 実行例
•  ランダムなポートと、コンテナID、コン
テナ名が割り当てられる
[yuryu@rhel7	
  docker-­‐apache]$	
  docker	
  run	
  -­‐dP	
  demo-­‐apache	
  
8d6b20a1e23427ad575bed1aee9cbea5406e5ed648a645e955cd6c6c6a
34ea0a	
  
[yuryu@rhel7	
  docker-­‐apache]$	
  docker	
  ps	
  
CONTAINER	
  ID	
  	
  	
  	
  	
  	
  	
  	
  IMAGE	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  COMMAND	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
CREATED	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  STATUS	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  PORTS	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
NAMES	
  
8d6b20a1e234	
  	
  	
  	
  	
  	
  	
  	
  demo-­‐apache:latest	
  	
  	
  "/usr/sbin/httpd	
  
-­‐DF	
  	
  	
  4	
  seconds	
  ago	
  	
  	
  	
  	
  	
  	
  Up	
  4	
  seconds	
  	
  	
  	
  	
  	
  	
  	
  
0.0.0.0:49247-­‐>80/tcp	
  	
  	
  	
  jovial_jones	
  	
  	
  	
  	
  	
  	
  	
  	
  
Docker周辺ツールの紹介
libnetwork
•  コンテナのためのネットワーク
•  Linux Bridge, vxlan などを使って、コンテ
ナごとにカスタムのネットワークを作成
•  Docker本体から利用可能(予定)
Docker Compose
•  複数コンテナからなるアプリを定義
•  YAMLで記述
•  この例はpython appとredis
Docker Machine
•  仮想マシン、クラウド上のインスタンス
を同等に扱うツール(ベータ)
Docker Swarm
•  複数のマシンを1台の仮想的なDockerホス
トとして管理するツール
•  クラスタが作れる
•  現在ベータ
cAdvisor
•  Dockerのための監視ツール
– https://github.com/google/cadvisor
cAdvisorの画面
cAdvisor起動方法
#	
  setenforce	
  Permissive	
  
$	
  docker	
  run	
  	
  
	
  	
  -­‐-­‐volume=/:/rootfs:ro	
  	
  
	
  	
  -­‐-­‐volume=/var/run:/var/run:rw	
  	
  
	
  	
  -­‐-­‐volume=/sys:/sys:ro	
  	
  
	
  	
  -­‐-­‐volume=/var/lib/docker/:/var/lib/docker:ro	
  	
  
	
  	
  -­‐-­‐publish=8080:8080	
  	
  
	
  	
  -­‐-­‐detach=true	
  	
  
	
  	
  -­‐-­‐name=cadvisor	
  	
  
	
  	
  -­‐-­‐volume=/cgroup:/cgroup	
  	
  
	
  	
  google/cadvisor:latest
Kubernetes
•  複数のDockerコンテナを管理するツール
•  Googleが中心となって開発
– Borg での経験がベース
•  AWSのELB, Auto Scaling, CloudFormation
に似た機能を持つイメージ
Kubernetes
Master
Pod
Container
Minion
MinionPod
Container
Minion
Kubelet Proxy
Internet
Kubernetesにないもの
•  コードからサービスへの一貫した管理
– テスト、デプロイとの統合など
•  ユーザー、認証、権限管理
•  ネットワークの分離
•  WebUI
OpenShift とは
•  オープンソースのPaaS
•  OpenShift Origin (upstream)
– https://github.com/openshift/origin
•  OpenShift by Red Hat
OpenShift v3
•  PaaSに必要な機能を追加
– ユーザ管理、認証
– ネットワークの分離
– ソースからデプロイまでの
一貫したシステム
•  Docker, Kubernetes と正
しく役割分担
– Simple, robust
STI (Source to Image)
•  Gitレポジトリを指定
•  自動的にコンテナイメージを作成・更新
•  差分ビルドによる高速化
•  アプリケーションのビルド、コンテナの
ビルドを一体化して管理
•  コード変更からデプロイを簡単・高速化
vxlanでネットワークを分離
Pod
Container
Minion
MinionPod
Container
Kubelet Proxy
Minion
vxlan
Web UI、ネットワーク管理、ユーザー管理
Jenkinsとの連携
ソースからサービス構築などのサービス
コンテナのファイルフォーマット
Linuxコンテナへのインタフェース
プロキシ、ロードバランサの提供
コンテナのライフサイクル管理
コンテナを組み合わせてサービスを作る
ご清聴ありがとうございました

Docker事始めと最新動向 2015年6月