狠狠撸

狠狠撸Share a Scribd company logo
奥补谤诲别苍で学ぶコンテナの基础
Hiroaki UKAJI
こんな?向け
? ?????コンテナって何?
コンテナ?
コンテナ?
?ユーザ空間の隔離
?????????????????密度化
???VMより軽い
??????????????リソース分離???
??????????LXC
?起動が速い??
??????????????名前空間??
コンテナ?
??????
コンテナがなぜ必要か
(Baremetal) Machine	
OS
コンテナがなぜ必要か
ある環境の上で2つのAppを開発します
(Baremetal) Machine	
OS
コンテナがなぜ必要か
(Baremetal) Machine	
OS	
App1 App2
コンテナがなぜ必要か
でもこの図はちょっとマズイ??
?????????????????なぜならば???
(Baremetal) Machine	
OS	
App1 App2
コンテナがなぜ必要か
(Baremetal) Machine	
OS	
App1 App2
/
|-- :
|-- home/
| |-- usr1/
| | `-- app1/
| `-- usr2/
| `-- app2/
| :
$ rm -rf /home/usr2/app2/?
?緒のマシン上での開発は
????????ちょっと?配
コンテナがなぜ必要か
何か対策を???
(Baremetal) Machine	
OS
コンテナがなぜ必要か
すぐに思いつくのは???
??????????????UNIX User?
(Baremetal) Machine	
OS	
usr1
App1
usr2
App2
コンテナがなぜ必要か
しかしUNIX Userでは…
(Baremetal) Machine	
OS	
usr1
App1
App2
でもこれはちょっとやりたくない
作るの時間かかるし???
重いし???
コンテナがなぜ必要か
(Baremetal) Machine	
OS/Hypervisor	
VM	 VM	
OS	 OS	
App1 App2
コンテナがなぜ必要か
(Baremetal) Machine	
OS
欲しいものは
Appを隔離する「箱」のようなもの
(Baremetal) Machine	
OS	
App1 App2
欲しいものは
 「箱」= 環境の隔離 + リソースの制限
????????????
(Baremetal) Machine	
OS	
App1 App2
欲しいものは
 「箱」= 環境の隔離 + リソースの制限
????????????
(Baremetal) Machine	
OS	
App1 App2
これがコンテナ
wardenでは?
	
	
	
    環境の隔離? ??リソースの制限
wardenでは?
	
	
    環境の隔離? ??リソースの制限
       ||        													 		||				
  		  namespace        cgroup
	
	
             ※他のコンテナでも使われてます
まずは隔離環境の作成から
	
	
    環境の隔離? ??リソースの制限
       ||        													  	||				
  		  namespace        cgroup
	
	
             
namespace
空間を隔離し名前別に管理するもの
namespace
	
namespace?覧
	
	
	
	
ipc, mnt, net, pid, usr, utsの6種類
(各リソースにタグ付けられたID的なもの)
$ readlink /proc/$$/ns/*?
ipc:[4026531839]
mnt:[4026531840]
net:[4026531956]
pid:[4026531836]
user:[4026531837]
uts:[4026531838]
OS起動時にすでにdefault名前空間が決定
namespace
	
‘unshare’コマンドで切り替えが可能
net:[4026531956]
↓?
net:[4026532257]
$ readlink /proc/$$/ns/net?
net:[4026531956]
$ sudo unshare --net /bin/bash?
$ readlink /proc/$$/ns/net?
net:[4026532257]
unshare --net
namespace
	
net名前空間をunshareした時は…
network環境「だけ」が切り替わります
$ ls?
tmp/ warden/ workspace/
$ ifconfig eth0?
eth0 Link encap:Ethernet HWaddr 08:00:27:95:c2:a1
inet addr:10.0.2.15 Bcast:10.0.2.255
:
:
$ sudo unshare --net /bin/bash?
$ ls?
tmp/ warden/ workspace/
$ ifconfig eth0?
eth0: error fetching interface information: Device not found
namespace	
(Baremetal) Machine	
OS	
unshare --net <command> された空間
||
?leはそのまま?えるのにeth0は?えない空間
eth0
namespace @ warden
namespace @ warden	
warden> create
(Baremetal) Machine	
OS	
unshare -m {$target}/setup.sh
unshare(CLONE_NEWNS)
namespace @ warden
	
>>
!
host# readlink /proc/$$/ns/*?
ipc:[4026531839]
mnt:[4026531840]
net:[4026531956]
pid:[4026531836]
user:[4026531837]
uts:[4026531838]
host# bin/wsh /bin/bash?
container# readlink /proc/$$/ns/*?
ipc:[4026532199]
mnt:[4026532197]
net:[4026532202]
pid:[4026532200]
user:[4026531837]
uts:[4026532198]
※ホストマシン側	
※コンテナ側
namespace @ warden	
warden> create
(Baremetal) Machine	
OS	
ipc:proc間通信オブジェクト
mnt:マウント操作
net:ネットワーク系リソース??の隔離空間
pid:プロセスID
uts:ホスト?ドメイン名
次に隔離環境の操作
	
																											
    環境の隔離? ??リソースの制限
       ||        													 		||				
  		  namespace        cgroup
	
	
             
cgroup
	
	
	
プロセスのグループを作り
?括した管理を?うもの
	
	
※cgroup = control group
cgroup
	
controlできるのは
	
	
cpuやmemoryの制限
プロセスのstart&stop等々???
$ lssubsys?
cpuset
cpu
cpuacct
memory
devices
freezer
blkio
perf_event
hugetlb
cgroup
	
各サブシステムはこんな感じ
   tasks     ? pid
freezer.state ? 状態
$ cd /sys/fs/cgroup/freezer?
$ tree -L 2?
.
|-- :
|-- tasks
`-- user/
|-- 1000.user/
|-- freezer.state
|-- :
`-- tasks
1	
2	
:	
23788	
THAWED
cgroup
	
controlの方法は
   1.  グループ用ディレクトリを作成 
   2.   tasksにpidを登録        
   3.  freezer.stateで状態を制御
	
# cd /sys/fs/cgroup/freezer?
# mkdir testfs?
# echo 18327 > testfs/tasks?
# echo 18336 >> testfs/tasks?
# echo FROZEN > testfs/freezer.state?
FROZEN
これで	
			pid=18327	
			pid=18336	
のprocが停止
cgroup
   1.  グループ用ディレクトリを作成 
	 $ cd /sys/fs/cgroup/freezer?
$ tree -L 2?
.
|-- freezer.state
|-- tasks
|-- testfs01/
| |-- freezer.state
| `-- tasks
`-- testfs02/
|-- freezer.state
`-- tasks
親DIRと同様の?leが自動生成	
(default時)全PIDは親DIRに登録
cgroup
   2.   tasksにpidを登録  
	 $ cd /sys/fs/cgroup/freezer?
$ tree -L 2?
.
|-- freezer.state
|-- tasks
|-- testfs01/
| |-- freezer.state
| `-- tasks
`-- testfs02/
|-- freezer.state
`-- tasks
$ echo 3861 >> testfs01/tasks	
等でPIDを書き込み
下で書き込まれたPIDは自動的に	
defaultの場所から消失
cgroup
   3. freezer.stateで状態を制御
	
tasksに登録されたprocだけがFROZENに	
$ cd /sys/fs/cgroup/freezer?
$ tree -L 2?
.
|-- freezer.state
|-- tasks
|-- testfs01/
| |-- freezer.state
| `-- tasks
`-- testfs02/
|-- freezer.state
`-- tasks
$ cat tasks	
3861
$ echo FROZEN > freezer.state
FROZEN
cgroup
   
	
	
<制限したいリソース>
|-- <tasks(PID)>
|-- <status>
`-- SubDirectory/
|-- <tasks(PID)>
`-- <status>①制限したい項目に
サブDIR作っておく	
②制限かけたいprocの  
PIDをtasksに書き込む	
③statusで一気に制御
cgroup @ warden
cgroup @ warden
   1.  グループ用ディレクトリを作成
    instance-<handle>/
????…コンテナ?成時に出現
	
($PWD=/sys/fs/cgroup/memory)
.
|-- memory.limit_in_bytes
|-- tasks
`-- instance-18fgfj7va3n/
|-- memory.limit_in_bytes
`-- tasks
cgroup @ warden
   2.   tasksにpidを登録
    tasks
????…defaultではdaemonのPIDのみ
?????コンテナでproc起動すれば追加
($PWD=/sys/fs/cgroup/memory)
.
|-- memory.limit_in_bytes
|-- tasks
`-- instance-18fgfj7va3n/
|-- memory.limit_in_bytes
`-- tasks
cgroup @ warden
   3. memory.limitで状態を制御
    memory.limit_in_bytes
????…tasksに登録したprocにのみ
?????使?memoryの制限がかかる
($PWD=/sys/fs/cgroup/memory)
.
|-- memory.limit_in_bytes
|-- tasks
`-- instance-18fgfj7va3n/
|-- memory.limit_in_bytes
`-- tasks
cgroup @ warden	
warden> limit_memory
(Baremetal) Machine	
OS	
mkdir ~~~/cgroup/memory/instance-$id
              !
echo [コンテナ内のPID] > tasks
              ! (←本当はここまで前準備)
echo [制限値] > memory.limit_in_bytes
container
container =		環境の隔離 + リソースの制限
????????????
(Baremetal) Machine	
OS	
App1 App2
container @ warden
	
	
    環境の隔離? ??リソースの制限
       ||        													 		||				
  		  namespace        cgroup	
	
        
まとめ
WardenコンテナはOS上に隔離環境を作る
? 環境を隔離するのは??namespace
隔離環境の操作は???cgroup

More Related Content

奥补谤诲别苍で学ぶコンテナの基础