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。

スクリーンショット 2014-08-31 6.51.14.png

このVMへは、boot2docker sshssh接続出来る。クジラが出てきてちょっと楽しい。

 $ 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で管理してるリソースをきっちりおさえておきたい。