Docker の概要をしらべて触ってみた

TOC

はじめに

この記事では Docker について自分なりに理解するために調べたことをまとめる。
Docker の tutorial は command line を ブラウザで実際に叩くところまでできるようになっているので、
非常にわかりやすく入門できる。なので、 tutorial に関してはそっちをやったほうが良い。
この記事は Docker ってこんな感じのやつなんだーってのが伝わればばいいなと思う。
(ちなみに まだ Docker 歴は1日)

docker とは

LXC と aufs と github のようなものをうまくくみ合わせて提供される
仮想化ソフトウェアだ。

LXC とは

Linux Container のこと。

http://gihyo.jp/admin/column/01/vm/2011/lxc_containerによれば、

LXCの基本技術となるのが「コンテナ」と呼ばれる一種のリソース管理システムです。ファイルシステムの他,ホスト名やプロセス,ネットワークソケットなどのカーネルが扱うさまざまなリソースの管理テーブルを個々に用意し,これをコンテナごとに管理することで,コンテナごとに独立したOSのように動作させることができます。

とある。
また、カーネルの機能である Cgroups の説明をみれば非常によく理解できた。

aufs, Union FS とは

ここに、 Union mount と Union type file system の資料がある。
非常にわかりやすい説明だった。ここに、 aufs の説明もある。結構古いけど。。
http://www.oreilly.co.jp/community/blog/2010/02/union-mount-uniontype-fs-part-1.html ちょっとだけ簡単に自分用にまとめる。

union mount

filesystem A と filesystem B をマウントして、それぞれが file A, file B を同じディレクトリで持っていたとすると、
union mount をつかったとき、fileA, file B の両方のファイルが見える。

読み込み

open システムコールとかを通して呼ぶと、 union 機能が上から順に読んでいけば、差分的に一番新しいものを読める。
両方のファイルシステムが fileA を持っていて、その内容がちがう場合、filesystem の mount の優先度(レイヤー順?)で
どちらの filesystem の fileA が見えるか変わるんだと思う。

書き込み

なんらかを書き込んで差分ができたとき、 上位ディスクとは違うものを保証しなければならないため、
上位ディスクのものをコピーして書き込む。だからコピーオンライト。
でもこの場合は、 copy-up と呼ばれて、プロセス fork でいうそれとは区別されている模様。

削除

ファイルが削除されても、上位ディスクには存在しているため、事実上削除ができない。
なので 特別なファイルを作成することで 消えたように見せる。(DB で言う論理削除みたいなもんだと認識)
whiteout という。

github 的な要素

index.docker.io レポジトリに image を push できる。
memcached を Dockerfile によって image を作る tutorial があるので、それをやった。
それでできた Dockerfile を使って repository に push した例を以下に示す。
ちなみに、 https://index.docker.io/account/ にあらかじめ登録しておいた。

vagrant@ubuntu-12:~$ docker login
Username: vimtaku
Password:
Email: ******@gmail.com
Login Succeeded

vagrant@ubuntu-12:~$ docker build -t vimtaku/memcached_sample - < Dockerfile

vagrant@ubuntu-12:~$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
vimtaku/memcached_sample   latest              242bd405025e        22 seconds ago      217.1 MB
run_memcached              latest              5f1cda03f61c        17 hours ago        217.1 MB
memcached                  latest              9166d484dda8        17 hours ago        217.1 MB
brand_new_memcached        latest              7bdd82d0abf7        20 hours ago        217.1 MB
memcached_new              latest              c18168a45363        20 hours ago        245.5 MB
ubuntu                     12.10               426130da57f7        7 days ago          127.6 MB
ubuntu                     quantal             426130da57f7        7 days ago          127.6 MB
ubuntu                     10.04               8589d4e9c7c6        7 days ago          139.6 MB
ubuntu                     lucid               8589d4e9c7c6        7 days ago          139.6 MB
ubuntu                     12.04               72e10143e54a        7 days ago          125.9 MB
ubuntu                     latest              72e10143e54a        7 days ago          125.9 MB
ubuntu                     precise             72e10143e54a        7 days ago          125.9 MB
ubuntu                     13.10               721f07d19f96        7 days ago          144.6 MB
ubuntu                     saucy               721f07d19f96        7 days ago          144.6 MB
ubuntu                     13.04               476aa49de636        7 days ago          133.6 MB
ubuntu                     raring              476aa49de636        7 days ago          133.6 MB

vagrant@ubuntu-12:~$ docker push vimtaku/memcached_sample
The push refers to a repository [vimtaku/memcached_sample] (len: 1)
Sending image list
Pushing repository vimtaku/memcached_sample (1 tags)
511136ea3c5a: Image already pushed, skipping 
b74728ce6435: Image already pushed, skipping 
72e10143e54a: Image already pushed, skipping 
28d8e9cef54f: Image successfully pushed 
6be17bb13216: Image successfully pushed 
1b910f3ee9b7: Image successfully pushed 
18e04c08eb9b: Image successfully pushed 
2e32ba041afa: Image successfully pushed 
1cf353d00dd8: Image successfully pushed 
242bd405025e: Image successfully pushed 
Pushing tags for rev [242bd405025e] on {https://registry-1.docker.io/v1/repositories/vimtaku/memcached_sample/tags/latest}


出来上がりイメージ

所感

この記事では、 docker の一番の利点だと感じている、 image を簡単に作って試す、みたいな部分は書いていない。
すごい早さで image を作り出すことができるのには感動した。そこが一番の利点だと思う。
あと、この oreilly の資料は 3回くらい読む価値はありそうだ。

参考文献

http://ja.wikipedia.org/wiki/LXC
http://gihyo.jp/admin/column/01/vm/2011/lxc_container
http://ja.wikipedia.org/wiki/Cgroups
http://www.oreilly.co.jp/community/blog/2010/02/union-mount-uniontype-fs-part-1.html
http://teppeis.hatenablog.com/entry/docker
http://shibayu36.hatenablog.com/entry/2013/12/30/173949
http://2013.8-p.info/japanese/06-22-docker.html

このエントリーをはてなブックマークに追加