Dockerを触ってみる
最近は、Immutable Infrastructureという文脈だとDockerがかなり注目を集めているので、例に漏れず触ってみる事にした。
そもそもDockerって何?
Dockerは、「コンテナ技術による仮想化ソフトウェア」である。中身の動きを知らないと正直ピンと来ないんだけど、ざっくり言うと「プロセスからのリソースへのアクセスを制御する事で、独立したコンテナ環境を作るソフトウェア」みたいな感じ。 これもあまり上手く説明出来ている気がしないけど、以下のページなどを読むとイメージがつかめるかも。
参考: Dockerが利用しているAUFSとLXC
http://shibayu36.hatenablog.com/entry/2013/12/30/173949
参考: Docker = LXC + aufs + GitHub Culture
http://teppeis.hatenablog.com/entry/docker
Dockerは、もともとLXC(Linux Containers)と呼ばれる最近のlinuxで提供されてるコンテナ型仮想化技術と、Aufs(Another Union File System)と呼ばれるCopy on Writeなファイルシステムを組み合わせた技術として作られた。(最近はLXCへの依存を無くしてるらしいけど)
仮想化って言ってるけどOSをエミュレートするVMを作る訳じゃ無いので、かなり高速で環境を立ち上げたり出来るのが特徴。VMを作る事によるオーバーヘッドが無くなるのは嬉しいと思う。
実際に触ってみる。
Dockerをインストール
dockerはlinuxカーネルの機能を使っている為、macでは動かす事が出来ない。そんなmacユーザーの悩みに答える為に、公式がboot2docker
と言うアプリケーションを用意してくれている。
インストールは以下のページから出来る。 http://docs.docker.com/installation/mac/
boot2dockerはdockerを使う為の最小限のlinux環境をVMとして提供してくれる。このVM内でdockerを使ってみてねって事らしい。導入は簡単で、インストーラーでインストールした後に公式ページに従って
$ boot2docker init $ boot2docker start
とすれば良いだけ。boot2docker start
した時点でVMが立ち上がる。Virtual Boxを使ってVMを作るので、
Virtual BoxのGUIアプリケーションを立ち上げてみれば確認が出来る。boot2docker-vmというVMがあればOK。
このVMへは、boot2docker ssh
でssh接続出来る。クジラが出てきてちょっと楽しい。
$ boot2docker ssh ## . ## ## ## == ## ## ## ## === /""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| boot2docker: 1.2.0 3.16.1-config-file : e75396e - Fri Aug 22 06:45:30 UTC 2014 docker@boot2docker:~$
VM内では、dockerコマンドを使う事が出来る。例えば、docker run
でコンテナを立ち上げてコマンドを実行する事が出来る。
$ docker run ubuntu ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
これは、ubuntu
という名前のついたdocker image
からコンテナを立ち上げて、ls
コマンドを実行している。root(/)ディレクトリ配下にある様々なディレクトリが表示されている事が分かる。docker run
では、ローカルに無いイメージを指定した場合にはDocker Hubというとこからダウンロードしてきてくれて、上記の例だとubuntu
イメージがダウンロードされる。
docker image
というのはコンテナの元になるイメージで、事前に作っておいた(もしくはダウンロードしておいた)docker image
と全く同一の環境がコンテナとして立ち上がる。docker runの度に新しいコンテナが立ち上がり、コマンドの実行が終わるとコンテナは停止する。
dockerコマンドで他にどんな事が出来るかは、このページとか、公式ページとか、他のdockerを取り上げたブログなんかを参考にすれば良いと思う。
ここまでで、dockerを試す為の環境が出来た!!
macでdockerコマンド使う
macではdockerコマンド使えないと書いたけど、boot2dockerが立ち上がってる時はmac側でdockerコマンド使うとboot2docker内で実行した結果を出力してくれるっぽい。
つまり、わざわざboot2docker ssh
しなくてもmac側でdocker run
とかが出来る。先程のようにubuntu ls
しても良いし、docker run hello-world
しても良い。dockerで立ち上げたコンテナ内でコマンドを実行したければ、
$ docker run -it ubuntu bash
という風にbashを起動すれば良い。いろいろ遊んでみると良いと思う。
まとめ
ちょっと前までdockerって何やねんって思ってたけど、使ってみたらかなり小さなオーバーヘッドで隔離された環境作れてすごいなと思った。コマンド実行の度にコンテナ作るのもImmutable Infrastructureっぽい雰囲気を感じる。
中身の動作については、何となくイメージは出来たけど完全には理解出来てないので、もうちょっと調べようと思う。特に、LXCで管理してるリソースをきっちりおさえておきたい。