by shigemk2

当面は技術的なことしか書かない

Dockerを支える技術・超圧縮版 #ylug_111

オープンソース・クラウド基盤 OpenStack入門 構築・利用方法から内部構造の理解まで (アスキー書籍)

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を動かしている人はそんなに信用していない

ユーザーランドとは - OSS用語 Weblio辞書

何をトチ狂ったのか商用サポートをやるとかなんとかいってるけど

  • 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オプションの設定値に対応している