Linux女子部08「Docker勉強会」 - connpass
個人的にそんなにDockerに興味はない
Dockerの説明をやってる。
RedHatが協力して、RHEL対応とか機能拡張をやってる。
コンテナ型の仮想化とは?
知らない人にいきなり説明するのは難しい
非仮想化環境 vs ハイパーバイザ導入
コンテナ型に仮想マシンという概念はない
- Linux標準のコンテナ型仮想化技術。
- Linuxカーネルの昨日により、ユーザプロセスの実行環境を独立した「コンテナ」に閉じ込める
アプリケーションの実行環境を分離できる「カーネル共有型」
- 異なるFSの割り当て
- 異なる仮想NICの割り当て
- 異なるCPU メモリ割り当て量を制限
ユーザ空間が複数存在する。
- コンテナ自体はDockerが流行る前から使われていた。
- 何が面倒かというと、ディレクトリを作るのが面倒。
changerootするディレクトリはバイナリから何から全て手で準備しないといけないから面倒であった。
Dockerの面白いところ
- diskimageの管理を簡単に出来る。
仮想マシンのdiskimage
コンテナにdiskimageをアタッチする。
# docker search nginx # docker pull dockerfile/nginx # docker run -d dockerfile/nginx
RHELのカーネルで動いているけどUbuntuを動かしている気分になれる。
何も知らない人はUbuntuを使っている気分になれる。
カーネルは全然違うので、カーネル依存のアプリはすぐ落ちる
/clockとかはエラーを吐いて終わる
- 従来のVMは「マシンをどうやってエミュレートするか」にかかっている
OSのエミュレーションはx86のマシンをi386で動かすことは可能
システムコールを受けるのはもとのカーネル
diskimage
カーネルのバージョン間の差分はライブラリが吸収する?
LinuxのABI
- カーネルのバージョンはどんどん上がる でもカーネルのバージョンに左右されんような開発を。
- リーナスはカーネルのシステムコールの変更とか追加にかなり敏感。なのでカーネルをとっかえても気にせず動く。
- でもVMを動かしている人はそんなに信用していない
何をトチ狂ったのか商用サポートをやるとかなんとかいってるけど
- Dockerを動かすカーネルを限定する
- Docker専用のディストリビューションを用意する?
- CoreOS
どのディストリビューションがDockerの標準に?→RedHatでしょ!!
Solarisは?→可能だけど、お金積めば…
Dockerはネットワーク周りが弱い
Diskの管理、バージョンニングが出来るのがDockerのよいところ
- もともとはUbuntuのアレ
Device Mapper
ブロックデバイスの上にソフトウェアのWrapperをかぶせて、さまざまな機能拡張を行ったブロックデバイスを作成する仕組みである。
RAIDなど
Device Mapper Thin-Provisioningとは
- Thin-Provisioning型の論理デバイスをいっぱい作れることが出来る
定義したデバイスに誰かが書き込みを行うと、慌ててアサインし始める
ブロックは100GB、論理的には1TBのデバイスが出来る
スナップショットを利用して全く同じ内容のデバイスを複数作ることが出来る。
1つの物理デバイスを「ブロックプール」として確保
もう1つの物理デバイスをメタデータ保存用に使う
一般的なスナップショットは親子関係になっている
- でもDockerのスナップショットは、どちらが親でどちらが子供かあんまり気にする必要がない。なぜならそういう関係になっていないから。
LVMによるDevice Mapper Thin-Provisioningの利用
LVMのインターフェイスからThin-Provisioning機能を利用できるようになっていて永続的なスナップショットとして使える
DockerはLVMを使わずにThin-Provisioningを利用しておる。
# ll /var/lib/docker/devicemapper/devicemapper/ 合計 15905868 -rw------- 1 root root 107374182400 5月 30 20:41 2014 data -rw------- 1 root root 117250 5月 29 22:12 2014 json -rw------- 1 root root 2147483648 5月 30 20:41 2014 metadata
イメージのIDと対応するデバイスID(Device Mapper)と論理デバイスなどの情報がわかる
# less /var/lib/docker/devicemapper/devicemapper/json | jq . ... "a4821fb7cb5b161c6de461210538e4cffc1355b6216d725eba8c6719ca80306b": { "initialized": true, "transaction_id": 8291, "size": 10737418240, "device_id": 4441 }, "a4a9209a3e4c35ed6830b6244ce4bd71043edef315dbebec705ba173966294b3": { "initialized": true, "transaction_id": 8500, "size": 10737418240, "device_id": 4598 } ...
保存イメージ→スナップショット の流れ
- コンテナ起動時にスナップショットを作成し、コンテナが停止するとスナップショットを破棄する
(RHELはレルと読む)
基本的なネットワーク構成
eth0はdocker0に接続される
仮想のスペースを複数定義し、それぞれのスペースにiptablesとかネットワークの設定を完全に独立してもたせられる
- コンテナから外部への接続はIPマスカレード
- iptablesのNAT機能でポート転送が可能
コンテナを立ち上げたあとにネットワークネームスペースに、手でごにょごにょできる。
- オレオレ仮想NICの追加も可能
超強烈にイノベイティブなのに、ハッカーからしたら「もうこんなの前からあるよ」みたいなのが本当の破壊的イノベーション。
systemdとcgroups
- RHEL7でDockerを動かすとそのタイミングでコンテナに対応するsystemdを定義する
イニシャルプロセスをスタートする
Unitの設定パラメータとしてcgroupsの設定値が用意されている
- docker runコマンドの-cオプションと-mオプションの設定値に対応している