SlideShare a Scribd company logo
1 of 37
Download to read offline
Dockerの仕組みとIIJ社内での利用例 
maebashi @ IIJ 
© 2014 Internet Initiative Japan Inc.
© 2014 Internet Initiative Japan Inc. 
2 
本日の話 
• Dockerのコンテナ起動の仕組みについて 
(概略のみ) 
• IIJ社内での利用例 
特に断りがない限り、本資料の説明は 
CentOS 6.6 + docker 1.3.2を前提としている 
この資料のURL: http://www.slideshare.net/maebashi/dockeriij
© 2014 Internet Initiative Japan Inc. 
3 
Docker とは? 
• Docker Engine + Docker Hub のプラッ 
トフォーム 
– Docker Engine – コンテナ管理ソフトウェア 
– Docker Hub – Dockerのイメージを共有するため 
のクラウドサービス
© 2014 Internet Initiative Japan Inc. 
4 
コンテナとは何か? 
• Linux標準機能を複数組み合わせて実 
現する隔離されたプロセス 
Namespaces 
ネットワーク環境やファイルシステ 
ム等の分離 
Cgroups 
メモリやCPUなどのリソース制限 
Capabilities 
権限降格 
iptables 
ネットワークパケットフィルタ and 
NAT
© 2014 Internet Initiative Japan Inc. 
5 
docker run 
• 指定イメージを元に新しいコンテナを 
作ってコマンドを実行する 
# docker run centos:centos6 echo Hello, world 
Hello, world 
# 
イメージ名 
(リポジトリ名:タグ名) 
コマンドと引数
container 
© 2014 Internet Initiative Japan Inc. 
6 
Docker client と daemon 
Host 
Docker daemon 
docker pull 
docker run 
docker ... 
container 
container 
Docker client 
HTTP 
Unix domain 
socket 
または 
TCP 
Docker Hub 
pull 
push
© 2014 Internet Initiative Japan Inc. 
7 
Dockerの実装 
• Go言語で記述 
– ごく一部 C言語で記述 (libcontainerの一部) 
• client と daemon は同一バイナリ 
– 起動時オプションで動作を切り替える 
– 実行バイナリとしては docker 本体と、もうひとつ 
dockerinit がある 
• execdriver, graphdriverを選べる
© 2014 Internet Initiative Japan Inc. 
8 
execdriver, graphdriver 
• execdriver 
– コンテナを実行するドライバ 
• lxc – lxc-* コマンド群を利用 
• native – libcontainer を利用 
• graphdriver 
– ディスクイメージ管理 
• aufs 
• btrfs 
• devmapper 
• vfs 
この資料では execdriver = native、graphdriver = devmapper を前提とする
# docker run centos:centos6 echo Hello, world 
Docker Hub run 
© 2014 Internet Initiative Japan Inc. 
9 
コンテナ起動の流れ 
image 
snapshot 
process 
snapshot 
create 
start 
動いている 
コンテナ 
止まっている 
コンテナ 
pull 
(ひな形)
Docker Hub run 
© 2014 Internet Initiative Japan Inc. 
10 
コンテナ起動の流れ 
image 
snapshot 
process 
snapshot 
create 
start 
動いている 
コンテナ 
止まっている 
コンテナ 
pull 
(ひな形)
CentOS 6 の場合 /var/lib/docker/devicemapper/devicemapper/ 
# cd /var/lib/docker/devicemapper/devicemapper/ 
# ls -lh 
total 550M 
-rw-------. 1 root root 100G Nov 4 14:59 data 
-rw-------. 1 root root 2.0G Nov 4 14:59 metadata 
# 
© 2014 Internet Initiative Japan Inc. 
11 
イメージの格納場所 
• 上記dataファイルがブロックプール 
– data(とmetadata)の中に複数のイメージを格納 
– devicemapper(dm)により論理デバイスとして使え 
る 
– dmで論理デバイスのスナップショットを作れる
© 2014 Internet Initiative Japan Inc. 
12 
dockerのイメージ管理 
• 階層化され、子は親との差分を管理 
• 各イメージはそれをbuildしたコンテナの 
情報を持つ 
docker images --viz! 
でGraphviz用dotファイルを 
出力
/var/lib/docker/devicemapper/metadata/<ID> 
© 2014 Internet Initiative Japan Inc. 
13 
管理情報 
• dockerのイメージIDとdevicemapperの 
論理デバイスとの対応 
• 各イメージの親子関係、作成時刻、build 
コンテナの情報等 
/var/lib/docker/graph/<ID>/json
Docker Hub run 
© 2014 Internet Initiative Japan Inc. 
14 
コンテナ起動の流れ 
image 
snapshot 
process 
snapshot 
create 
start 
動いている 
コンテナ 
止まっている 
コンテナ 
pull 
(ひな形)
# docker create centos:centos6 echo Hello, world 
13fd39df5f742cd90ce703852af274c98c00c7c559d236..... 
/var/lib/docker/containers/<ID>/config.json 
© 2014 Internet Initiative Japan Inc. 
15 
docker create 
• config生成 
hostconfig.json 
• 指定イメージからコンテナ用ファイルシス 
テム作成 
– イメージから<ID>-initというsnapshotを作成 
– SetupInitLayer 
– <ID>-initから<ID>というsnapshotを作成
Docker Hub run 
© 2014 Internet Initiative Japan Inc. 
16 
コンテナ起動の流れ 
image 
snapshot 
process 
snapshot 
create 
start 
動いている 
コンテナ 
止まっている 
コンテナ 
pull 
(ひな形)
# docker start –a 13fd39df5f74 
13fd39df5f74 
Hello, World 
© 2014 Internet Initiative Japan Inc. 
17 
docker start 
• 設定ファイル生成 
– resolv.conf, hosts など 
• コンテナ用ファイルシステムを一旦ホスト側の 
以下のディレクトリにマウント 
– /var/lib/docker/devicemapper/mnt/<ID> 
• 新規 Namespace で、外部コマンド 
dockerinit プロセスを起動 
(つづく)
© 2014 Internet Initiative Japan Inc. 
18 
Namespace 
• コンテナ実現のための中核となる機能 
• プロセスが動作する空間を分離する 
– いくつかの種類がある 
• Network Namespace – ネットワーク環境の分離 
• Mount Namespace – ファイルシステムの分離 
• PID Namespace – プロセステーブルの分離 
• UTS Namespace – hostnameの分離 
• IPC Namespace – IPCの分離 
• User Namespace – UID/GIDの分離(docker 1.3 
では未使用)
/var/lib/docker/init/dockerinit-1.3.2 
native –console ”” –pipe 3 –root /var/lib/docker/ 
execdriver/native/<ID> -- echo Hello, world 
© 2014 Internet Initiative Japan Inc. 
19 
dockerinit プロセス起動 
• 起動コマンド 
– コマンドライン引数例 
– 親プロセス: docker daemon、子: dockerinit 
• 外部コマンド(dockerinit)を起動する → 
cloneシステムコールの呼び出し
daemon/execdriver/native/driver.go 
c.ProcessConfig.SysProcAttr = &syscall.SysProcAttr{ 
namespaces.GetNamespaceFlags(container.Namespaces)), 
© 2014 Internet Initiative Japan Inc. 
20 
clone で新規Namespace 
• docker daemonがdockerinitコマンドを 
起動する時のcloneのフラグを指定 
Cloneflags: uintptr( 
CLONE_NEWNS! 
CLONE_NEWUTS! 
CLONE_NEWIPC! 
CLONE_NEWPID! 
CLONE_NEWNET! 
} 
これらの OR をとったものをフラグとして指定 
(詳細は man 2 clone 参照)
© 2014 Internet Initiative Japan Inc. 
21 
dockerinit 起動後 
• 親(docker daemon) 
– 子プロセスのPIDを元にcgroup設定 
– ネットワーク設定 
• 子(dockerinit) 
– 子のPID Namespaceの中で PID=1で起動 
– ネットワーク設定 
– ファイルシステム関連設定(rootfsをマウント) 
– 本来コンテナ内で実行するコマンドを execv
コンテナ2 
Network 
Namespace 
コンテナ3 
Network 
Namespace 
© 2014 Internet Initiative Japan Inc. 
22 
コンテナのネットワーク 
• コンテナ毎にNetwork Namespaceを分離 
– 分離しないこともできる(ホストと共有) 
コンテナ1 
Network 
Namespace 
eth0 
eth0 
eth0 
vethXX 
vethYY 
vethZZ 
docker0(仮想ブリッジ) 
NIC 
IPマスカレード 
ホスト 
ネットワーク 
Network 
Namespace 
veth 
(仮想NICのペア)
© 2014 Internet Initiative Japan Inc. 
23 
コンテナのファイルシステム 
• Mount Namespaceでコンテナ毎に分離 
docker 
create 
/.../mnt/<ID>/! 
lost+found/! 
rootfs/! 
bin/! 
etc/! 
home/! 
...! 
ホスト 
Mount 
Namespace 
ホスト 
コンテナ 
Mount 
Namespace 
コンテナ起動毎に 
スナップショットを作成 
ホストLinuxの 
/var/lib/docker/devicemapper/mnt/<ID>/! 
にマウント 
コンテナの新規Mount Namespace内 
で、その root に rootfs/ 以下をマウント 
/! 
bin/! 
etc/! 
home/! 
...! 
mount 
mount 
image snapshot 
docker 
start 
コンテナ
© 2014 Internet Initiative Japan Inc. 
24 
cgroups 
• プロセスグループのリソース(CPU、メモ 
リ、ディスクI/Oなど)の利用を制限 
– dockerではcpu(set), memoryについて制 
限可 
– デバイスへのアクセスも制限 
• リソース使用状況の統計値がとれる
© 2014 Internet Initiative Japan Inc. 
25 
おまけ: docker exec 
• 指定コンテナの中でコマンドを実行 
– つまり、指定コンテナ(プロセス)と同じ 
Namespaceでコマンドを実行 
• 既存Namespaceに切り替えるには 
setnsシステムコールを使う 
– Goのプロセスモデルとあまり相性が良くな 
い 
– main()に到達する前にCで書かれたinit()で 
なんとかしているっぽい
© 2014 Internet Initiative Japan Inc. 
26 
ここまでのまとめ 
• dockerのコンテナはLinux標準機能の 
Namespaces, cgroups等を使用して実 
現
IIJ社内での利用例 
継続的インテグレーション 
クラスタリング 
モニタリング 
© 2014 Internet Initiative Japan Inc.
© 2014 Internet Initiative Japan Inc. 
28 
継続的インテグレーション(CI) 
• drone 
– オープンソースの CI サーバ 
– dockerコンテナ内のクリーンな環境でビルド、テスト 
を実行する 
– GitHub/GitHub Enterprise/GitLab等と連携
結果 
© 2014 Internet Initiative Japan Inc. 
29 
継続的インテグレーション: 流れ 
push 
drone 
開発者 
build" 
test" 
notify" 
deploy 
clone 
rpm 
serf 
event 
社内IRC 
社内yumリポジトリ 
docker" 
container
© 2014 Internet Initiative Japan Inc. 
30 
コンテナのクラスタリング 
• 多数のDockerホスト上の多数のコンテ 
ナを管理したい 
Docker Daemon 
Docker Daemon 
Docker Daemon 
空き 
Container 
Container 
Container 
Container 
Container 
Container 
Container 
Container 
クラスタ1 
クラスタ2 
クラスタ3 
Host
© 2014 Internet Initiative Japan Inc. 
31 
クラスタ管理ツール 
• fig 
– 開発環境用、ホスト1台のみ対象 
• Apache Mesos 
– 複数ホストのリソース管理 
• Kubernetes 
– Google Container Engineで使われている 
• flynn, dokku 
– PaaS用
request/response 
master 
© 2014 Internet Initiative Japan Inc. 
32 
IIJ内製 docker manager 構成図 
slave 
Docker Daemon 
Container 
Container 
Container 
構成情報DB 
CLI, Web UI 
など 
Docker Remote API 
API 
dockerホスト群 
使用可能ホスト 
リソース空き情報 
IPアドレス空き情報 
etc
© 2014 Internet Initiative Japan Inc. 
33 
dockerコンテナのモニタリング 
• 個々のコンテナのメトリクスを収集したいがコ 
ンテナ毎にsnmpdやその他エージェントを 
入れたくない 
• dockerコンテナのメトリクス収集 
– http://blog.docker.com/2013/10/gathering-lxc-docker-containers-metrics/ 
– cgroupsの統計情報を使うことにより、ホスト 
上で(コンテナの外から)メトリクスを収集可能 
– コンテナのNetwork Namespaceに切り替え 
て /proc/net/devを参照することでネットワーク 
の統計情報を得られる
© 2014 Internet Initiative Japan Inc. 
34 
docker-metricsd 
• 各dockerホストに常駐、dockerコンテナの情 
報(cgroupsの統計情報等)を収集して返す 
– 似たようなもの: Google cAdvisor等 
• githubで公開中 
– https://github.com/maebashi/docker-metricsd 
• Docker Hubでも公開中 
– インストール & 実行 
# docker run -v /usr/local/bin:/target maebashi/docker-metricsd 
# /usr/local/bin/docker-metricsd &
© 2014 Internet Initiative Japan Inc. 
35 
docker-metricsdはメトリクスをJSON形式で返す 
"memory": { 
"failcnt": 0, 
"stats": { 
"unevictable": 0, 
"total_unevictable": 0, 
"total_swap": 0, 
"total_rss": 380928, 
"total_pgpgout": 681084, 
"total_pgpgin": 697086, 
"total_mapped_file": 1433600, 
"total_inactive_file": 38936576, 
"mapped_file": 1433600, 
"inactive_file": 38936576, 
"inactive_anon": 0, 
"hierarchical_memsw_limit": 
9223372036854776000, 
"hierarchical_memory_limit": 
9223372036854776000, 
"cache": 102838272, 
"active_file": 63901696, 
"active_anon": 380928, 
"pgpgin": 697086, 
"pgpgout": 681084, 
"rss": 380928, 
"swap": 0, 
"total_active_anon": 380928, 
"total_active_file": 63901696, 
"total_cache": 102838272, 
"total_inactive_anon": 0 
}, 
"max_usage": 139268096, 
"usage": 104189952 
}, 
"interfaces": { 
"outpackets.0": 3021223, 
"inbytes.0": 8228044607, 
"indrop.0": 0, 
"inerrs.0": 0, 
"inpackets.0": 6429687, 
"name.0": "eth0", 
"outbytes.0": 199687042, 
"outdrop.0": 0, 
"outerrs.0": 0 
}, 
"cpuacct": { 
"throlling_data": {}, 
"cpu_usage": { 
"usage_in_usermode": 2.668e+10, 
"usage_in_kernelmode": 8.181e+10, 
"percpu_usage": [ 
22599918565, 
987624379, 
65146098, 
36705600, 
18221767943, 
5890326, 
22768005795, 
4033968, 
218211598, 
4302652, 
5437296326, 
23781278563, 
18992360915, 
18712487134, 
55742891, 
18522722054 
] 
} 
}
© 2014 Internet Initiative Japan Inc. 
36 
定期的にメトリクスを収集して 
Grafanaでグラフ化 
dockerホスト群 
docker-metricsd 
ccoonntatainineer 
r 
container 
メトリクス収集 
ツール(内製) 
InfluxDB 
Docker Daemon
© 2014 Internet Initiative Japan Inc. 
37 
結果 
↓CPU Accounting 
Memory→ 
↓Network traffic

More Related Content

What's hot

今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月VirtualTech Japan Inc.
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Yuichi Ito
 
Dockerの利用事例
Dockerの利用事例Dockerの利用事例
Dockerの利用事例maebashi
 
Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Masahito Zembutsu
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪Kunihiro TANAKA
 
Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号Masahito Zembutsu
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見zaru sakuraba
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンRyo Nakamaru
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Masahito Zembutsu
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Masahito Zembutsu
 
Docker 17.06 Updates 最近何が変わったの?
Docker 17.06 Updates 最近何が変わったの?Docker 17.06 Updates 最近何が変わったの?
Docker 17.06 Updates 最近何が変わったの?Masahito Zembutsu
 
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーションDocker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーションMasahito Zembutsu
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Etsuji Nakai
 
Dockerの基本と応用~快適コンテナライフを実現するArukas~
Dockerの基本と応用~快適コンテナライフを実現するArukas~Dockerの基本と応用~快適コンテナライフを実現するArukas~
Dockerの基本と応用~快適コンテナライフを実現するArukas~Masahito Zembutsu
 
分散環境におけるDocker とオーケストレーション
分散環境におけるDocker とオーケストレーション分散環境におけるDocker とオーケストレーション
分散環境におけるDocker とオーケストレーションMasahito Zembutsu
 
CAMPHOR- day 2020 - Docker 超入門
CAMPHOR- day 2020 - Docker 超入門CAMPHOR- day 2020 - Docker 超入門
CAMPHOR- day 2020 - Docker 超入門KokiMakita1
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までMasahito Zembutsu
 

What's hot (20)

今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
Dockerの利用事例
Dockerの利用事例Dockerの利用事例
Dockerの利用事例
 
Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
 
Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオン
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
 
Docker 17.06 Updates 最近何が変わったの?
Docker 17.06 Updates 最近何が変わったの?Docker 17.06 Updates 最近何が変わったの?
Docker 17.06 Updates 最近何が変わったの?
 
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーションDocker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
Dockerの基本と応用~快適コンテナライフを実現するArukas~
Dockerの基本と応用~快適コンテナライフを実現するArukas~Dockerの基本と応用~快適コンテナライフを実現するArukas~
Dockerの基本と応用~快適コンテナライフを実現するArukas~
 
分散環境におけるDocker とオーケストレーション
分散環境におけるDocker とオーケストレーション分散環境におけるDocker とオーケストレーション
分散環境におけるDocker とオーケストレーション
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
CAMPHOR- day 2020 - Docker 超入門
CAMPHOR- day 2020 - Docker 超入門CAMPHOR- day 2020 - Docker 超入門
CAMPHOR- day 2020 - Docker 超入門
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
 

Similar to Dockerの仕組みとIIJ社内での利用例

Dockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しようDockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しようTakashi Makino
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門hiro nemu
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念Masahito Zembutsu
 
Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jAkira Yoshiyama
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Emma Haruka Iwao
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術Etsuji Nakai
 
20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会samemoon
 
はじめてのDockerパーフェクトガイド(2017年版)
はじめてのDockerパーフェクトガイド(2017年版)はじめてのDockerパーフェクトガイド(2017年版)
はじめてのDockerパーフェクトガイド(2017年版)Hiroshi Hayakawa
 
ビルドサーバで使うDocker
ビルドサーバで使うDockerビルドサーバで使うDocker
ビルドサーバで使うDockerMasashi Shinbara
 
Docker handson
Docker handsonDocker handson
Docker handsonkoda3
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineEtsuji Nakai
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
DockerハンズオンKazuyuki Mori
 
Infinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondInfinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondTaisuke Yamada
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもんMasahito Zembutsu
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎Daisuke Hiraoka
 
コマンドラインツールとしてのDocker
コマンドラインツールとしてのDockerコマンドラインツールとしてのDocker
コマンドラインツールとしてのDocker74th
 
OpenNebula on Ubuntu
OpenNebula on UbuntuOpenNebula on Ubuntu
OpenNebula on Ubuntuautumnalsky
 

Similar to Dockerの仕組みとIIJ社内での利用例 (20)

Dockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しようDockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しよう
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念
 
Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 j
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会
 
はじめてのDockerパーフェクトガイド(2017年版)
はじめてのDockerパーフェクトガイド(2017年版)はじめてのDockerパーフェクトガイド(2017年版)
はじめてのDockerパーフェクトガイド(2017年版)
 
ビルドサーバで使うDocker
ビルドサーバで使うDockerビルドサーバで使うDocker
ビルドサーバで使うDocker
 
Docker handson
Docker handsonDocker handson
Docker handson
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container Engine
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
Infinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondInfinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every second
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
コマンドラインツールとしてのDocker
コマンドラインツールとしてのDockerコマンドラインツールとしてのDocker
コマンドラインツールとしてのDocker
 
OpenNebula on Ubuntu
OpenNebula on UbuntuOpenNebula on Ubuntu
OpenNebula on Ubuntu
 

Dockerの仕組みとIIJ社内での利用例

  • 1. Dockerの仕組みとIIJ社内での利用例 maebashi @ IIJ © 2014 Internet Initiative Japan Inc.
  • 2. © 2014 Internet Initiative Japan Inc. 2 本日の話 • Dockerのコンテナ起動の仕組みについて (概略のみ) • IIJ社内での利用例 特に断りがない限り、本資料の説明は CentOS 6.6 + docker 1.3.2を前提としている この資料のURL: http://www.slideshare.net/maebashi/dockeriij
  • 3. © 2014 Internet Initiative Japan Inc. 3 Docker とは? • Docker Engine + Docker Hub のプラッ トフォーム – Docker Engine – コンテナ管理ソフトウェア – Docker Hub – Dockerのイメージを共有するため のクラウドサービス
  • 4. © 2014 Internet Initiative Japan Inc. 4 コンテナとは何か? • Linux標準機能を複数組み合わせて実 現する隔離されたプロセス Namespaces ネットワーク環境やファイルシステ ム等の分離 Cgroups メモリやCPUなどのリソース制限 Capabilities 権限降格 iptables ネットワークパケットフィルタ and NAT
  • 5. © 2014 Internet Initiative Japan Inc. 5 docker run • 指定イメージを元に新しいコンテナを 作ってコマンドを実行する # docker run centos:centos6 echo Hello, world Hello, world # イメージ名 (リポジトリ名:タグ名) コマンドと引数
  • 6. container © 2014 Internet Initiative Japan Inc. 6 Docker client と daemon Host Docker daemon docker pull docker run docker ... container container Docker client HTTP Unix domain socket または TCP Docker Hub pull push
  • 7. © 2014 Internet Initiative Japan Inc. 7 Dockerの実装 • Go言語で記述 – ごく一部 C言語で記述 (libcontainerの一部) • client と daemon は同一バイナリ – 起動時オプションで動作を切り替える – 実行バイナリとしては docker 本体と、もうひとつ dockerinit がある • execdriver, graphdriverを選べる
  • 8. © 2014 Internet Initiative Japan Inc. 8 execdriver, graphdriver • execdriver – コンテナを実行するドライバ • lxc – lxc-* コマンド群を利用 • native – libcontainer を利用 • graphdriver – ディスクイメージ管理 • aufs • btrfs • devmapper • vfs この資料では execdriver = native、graphdriver = devmapper を前提とする
  • 9. # docker run centos:centos6 echo Hello, world Docker Hub run © 2014 Internet Initiative Japan Inc. 9 コンテナ起動の流れ image snapshot process snapshot create start 動いている コンテナ 止まっている コンテナ pull (ひな形)
  • 10. Docker Hub run © 2014 Internet Initiative Japan Inc. 10 コンテナ起動の流れ image snapshot process snapshot create start 動いている コンテナ 止まっている コンテナ pull (ひな形)
  • 11. CentOS 6 の場合 /var/lib/docker/devicemapper/devicemapper/ # cd /var/lib/docker/devicemapper/devicemapper/ # ls -lh total 550M -rw-------. 1 root root 100G Nov 4 14:59 data -rw-------. 1 root root 2.0G Nov 4 14:59 metadata # © 2014 Internet Initiative Japan Inc. 11 イメージの格納場所 • 上記dataファイルがブロックプール – data(とmetadata)の中に複数のイメージを格納 – devicemapper(dm)により論理デバイスとして使え る – dmで論理デバイスのスナップショットを作れる
  • 12. © 2014 Internet Initiative Japan Inc. 12 dockerのイメージ管理 • 階層化され、子は親との差分を管理 • 各イメージはそれをbuildしたコンテナの 情報を持つ docker images --viz! でGraphviz用dotファイルを 出力
  • 13. /var/lib/docker/devicemapper/metadata/<ID> © 2014 Internet Initiative Japan Inc. 13 管理情報 • dockerのイメージIDとdevicemapperの 論理デバイスとの対応 • 各イメージの親子関係、作成時刻、build コンテナの情報等 /var/lib/docker/graph/<ID>/json
  • 14. Docker Hub run © 2014 Internet Initiative Japan Inc. 14 コンテナ起動の流れ image snapshot process snapshot create start 動いている コンテナ 止まっている コンテナ pull (ひな形)
  • 15. # docker create centos:centos6 echo Hello, world 13fd39df5f742cd90ce703852af274c98c00c7c559d236..... /var/lib/docker/containers/<ID>/config.json © 2014 Internet Initiative Japan Inc. 15 docker create • config生成 hostconfig.json • 指定イメージからコンテナ用ファイルシス テム作成 – イメージから<ID>-initというsnapshotを作成 – SetupInitLayer – <ID>-initから<ID>というsnapshotを作成
  • 16. Docker Hub run © 2014 Internet Initiative Japan Inc. 16 コンテナ起動の流れ image snapshot process snapshot create start 動いている コンテナ 止まっている コンテナ pull (ひな形)
  • 17. # docker start –a 13fd39df5f74 13fd39df5f74 Hello, World © 2014 Internet Initiative Japan Inc. 17 docker start • 設定ファイル生成 – resolv.conf, hosts など • コンテナ用ファイルシステムを一旦ホスト側の 以下のディレクトリにマウント – /var/lib/docker/devicemapper/mnt/<ID> • 新規 Namespace で、外部コマンド dockerinit プロセスを起動 (つづく)
  • 18. © 2014 Internet Initiative Japan Inc. 18 Namespace • コンテナ実現のための中核となる機能 • プロセスが動作する空間を分離する – いくつかの種類がある • Network Namespace – ネットワーク環境の分離 • Mount Namespace – ファイルシステムの分離 • PID Namespace – プロセステーブルの分離 • UTS Namespace – hostnameの分離 • IPC Namespace – IPCの分離 • User Namespace – UID/GIDの分離(docker 1.3 では未使用)
  • 19. /var/lib/docker/init/dockerinit-1.3.2 native –console ”” –pipe 3 –root /var/lib/docker/ execdriver/native/<ID> -- echo Hello, world © 2014 Internet Initiative Japan Inc. 19 dockerinit プロセス起動 • 起動コマンド – コマンドライン引数例 – 親プロセス: docker daemon、子: dockerinit • 外部コマンド(dockerinit)を起動する → cloneシステムコールの呼び出し
  • 20. daemon/execdriver/native/driver.go c.ProcessConfig.SysProcAttr = &syscall.SysProcAttr{ namespaces.GetNamespaceFlags(container.Namespaces)), © 2014 Internet Initiative Japan Inc. 20 clone で新規Namespace • docker daemonがdockerinitコマンドを 起動する時のcloneのフラグを指定 Cloneflags: uintptr( CLONE_NEWNS! CLONE_NEWUTS! CLONE_NEWIPC! CLONE_NEWPID! CLONE_NEWNET! } これらの OR をとったものをフラグとして指定 (詳細は man 2 clone 参照)
  • 21. © 2014 Internet Initiative Japan Inc. 21 dockerinit 起動後 • 親(docker daemon) – 子プロセスのPIDを元にcgroup設定 – ネットワーク設定 • 子(dockerinit) – 子のPID Namespaceの中で PID=1で起動 – ネットワーク設定 – ファイルシステム関連設定(rootfsをマウント) – 本来コンテナ内で実行するコマンドを execv
  • 22. コンテナ2 Network Namespace コンテナ3 Network Namespace © 2014 Internet Initiative Japan Inc. 22 コンテナのネットワーク • コンテナ毎にNetwork Namespaceを分離 – 分離しないこともできる(ホストと共有) コンテナ1 Network Namespace eth0 eth0 eth0 vethXX vethYY vethZZ docker0(仮想ブリッジ) NIC IPマスカレード ホスト ネットワーク Network Namespace veth (仮想NICのペア)
  • 23. © 2014 Internet Initiative Japan Inc. 23 コンテナのファイルシステム • Mount Namespaceでコンテナ毎に分離 docker create /.../mnt/<ID>/! lost+found/! rootfs/! bin/! etc/! home/! ...! ホスト Mount Namespace ホスト コンテナ Mount Namespace コンテナ起動毎に スナップショットを作成 ホストLinuxの /var/lib/docker/devicemapper/mnt/<ID>/! にマウント コンテナの新規Mount Namespace内 で、その root に rootfs/ 以下をマウント /! bin/! etc/! home/! ...! mount mount image snapshot docker start コンテナ
  • 24. © 2014 Internet Initiative Japan Inc. 24 cgroups • プロセスグループのリソース(CPU、メモ リ、ディスクI/Oなど)の利用を制限 – dockerではcpu(set), memoryについて制 限可 – デバイスへのアクセスも制限 • リソース使用状況の統計値がとれる
  • 25. © 2014 Internet Initiative Japan Inc. 25 おまけ: docker exec • 指定コンテナの中でコマンドを実行 – つまり、指定コンテナ(プロセス)と同じ Namespaceでコマンドを実行 • 既存Namespaceに切り替えるには setnsシステムコールを使う – Goのプロセスモデルとあまり相性が良くな い – main()に到達する前にCで書かれたinit()で なんとかしているっぽい
  • 26. © 2014 Internet Initiative Japan Inc. 26 ここまでのまとめ • dockerのコンテナはLinux標準機能の Namespaces, cgroups等を使用して実 現
  • 27. IIJ社内での利用例 継続的インテグレーション クラスタリング モニタリング © 2014 Internet Initiative Japan Inc.
  • 28. © 2014 Internet Initiative Japan Inc. 28 継続的インテグレーション(CI) • drone – オープンソースの CI サーバ – dockerコンテナ内のクリーンな環境でビルド、テスト を実行する – GitHub/GitHub Enterprise/GitLab等と連携
  • 29. 結果 © 2014 Internet Initiative Japan Inc. 29 継続的インテグレーション: 流れ push drone 開発者 build" test" notify" deploy clone rpm serf event 社内IRC 社内yumリポジトリ docker" container
  • 30. © 2014 Internet Initiative Japan Inc. 30 コンテナのクラスタリング • 多数のDockerホスト上の多数のコンテ ナを管理したい Docker Daemon Docker Daemon Docker Daemon 空き Container Container Container Container Container Container Container Container クラスタ1 クラスタ2 クラスタ3 Host
  • 31. © 2014 Internet Initiative Japan Inc. 31 クラスタ管理ツール • fig – 開発環境用、ホスト1台のみ対象 • Apache Mesos – 複数ホストのリソース管理 • Kubernetes – Google Container Engineで使われている • flynn, dokku – PaaS用
  • 32. request/response master © 2014 Internet Initiative Japan Inc. 32 IIJ内製 docker manager 構成図 slave Docker Daemon Container Container Container 構成情報DB CLI, Web UI など Docker Remote API API dockerホスト群 使用可能ホスト リソース空き情報 IPアドレス空き情報 etc
  • 33. © 2014 Internet Initiative Japan Inc. 33 dockerコンテナのモニタリング • 個々のコンテナのメトリクスを収集したいがコ ンテナ毎にsnmpdやその他エージェントを 入れたくない • dockerコンテナのメトリクス収集 – http://blog.docker.com/2013/10/gathering-lxc-docker-containers-metrics/ – cgroupsの統計情報を使うことにより、ホスト 上で(コンテナの外から)メトリクスを収集可能 – コンテナのNetwork Namespaceに切り替え て /proc/net/devを参照することでネットワーク の統計情報を得られる
  • 34. © 2014 Internet Initiative Japan Inc. 34 docker-metricsd • 各dockerホストに常駐、dockerコンテナの情 報(cgroupsの統計情報等)を収集して返す – 似たようなもの: Google cAdvisor等 • githubで公開中 – https://github.com/maebashi/docker-metricsd • Docker Hubでも公開中 – インストール & 実行 # docker run -v /usr/local/bin:/target maebashi/docker-metricsd # /usr/local/bin/docker-metricsd &
  • 35. © 2014 Internet Initiative Japan Inc. 35 docker-metricsdはメトリクスをJSON形式で返す "memory": { "failcnt": 0, "stats": { "unevictable": 0, "total_unevictable": 0, "total_swap": 0, "total_rss": 380928, "total_pgpgout": 681084, "total_pgpgin": 697086, "total_mapped_file": 1433600, "total_inactive_file": 38936576, "mapped_file": 1433600, "inactive_file": 38936576, "inactive_anon": 0, "hierarchical_memsw_limit": 9223372036854776000, "hierarchical_memory_limit": 9223372036854776000, "cache": 102838272, "active_file": 63901696, "active_anon": 380928, "pgpgin": 697086, "pgpgout": 681084, "rss": 380928, "swap": 0, "total_active_anon": 380928, "total_active_file": 63901696, "total_cache": 102838272, "total_inactive_anon": 0 }, "max_usage": 139268096, "usage": 104189952 }, "interfaces": { "outpackets.0": 3021223, "inbytes.0": 8228044607, "indrop.0": 0, "inerrs.0": 0, "inpackets.0": 6429687, "name.0": "eth0", "outbytes.0": 199687042, "outdrop.0": 0, "outerrs.0": 0 }, "cpuacct": { "throlling_data": {}, "cpu_usage": { "usage_in_usermode": 2.668e+10, "usage_in_kernelmode": 8.181e+10, "percpu_usage": [ 22599918565, 987624379, 65146098, 36705600, 18221767943, 5890326, 22768005795, 4033968, 218211598, 4302652, 5437296326, 23781278563, 18992360915, 18712487134, 55742891, 18522722054 ] } }
  • 36. © 2014 Internet Initiative Japan Inc. 36 定期的にメトリクスを収集して Grafanaでグラフ化 dockerホスト群 docker-metricsd ccoonntatainineer r container メトリクス収集 ツール(内製) InfluxDB Docker Daemon
  • 37. © 2014 Internet Initiative Japan Inc. 37 結果 ↓CPU Accounting Memory→ ↓Network traffic