mongeezを使ってSpring boot + MongoDB 環境でDBマイグレーション環境を作る

Spring-bootでmongodbを使うアプリケーションを時間を見つけて作ったりしているのですが、いわゆるflywayのようにmongodbでもDBマイグレーションが出来るようにしたかった。

mongeez is 何?

mongeezは、mongodb用のマイグレーションツールです。DBの状態にもバージョンを持たせて、ソースコードと一緒に管理することができます。

いつものことですが、こういった類のものは日本語記事がほとんどない。Google翻訳さまさまやでぇ

Spring bootにmongeezを使う。

最初はflywayでmongodbのマイグレーションが出来ないかなぁって探していたのですが、たまたまmongeezというgithubのページを見つけました。

そこで僕は思ったのですね。「Springのことだ、きっと、mongeez-starterみたいな依存関係が容易されているに違いない!」と浅はかな期待を胸に検索してみた結果。

hzpz/mongeez-spring-boot-starter

うふふ、あった。予想通り。

なので、まずはこのページのREADMEに則り、依存関係を追加します。githubのほうではmevenで書かれていますが、gradleではこんな感じ。

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-aop")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("org.springframework.boot:spring-boot-starter-data-mongodb")
    compile("org.springframework.boot:spring-boot-starter-security")

    // mongeez
    compile("io.github.hzpz.spring.boot:mongeez-spring-boot-starter:1.0.0") // 追加
    compile("org.mongeez:mongeez:0.9.4") // 追加

    testCompile("org.spockframework:spock-spring:1.0-groovy-2.4")
}

次にdb/mongeez.xmlを作りなさいと書いてあったので作ります。

mongeez.xmlには、マイグレーションで利用するxmlファイルもしくは、jsファイルを指定します。折角だから、jsでやってみることにしました。

<changeFiles>
    <file path="v1_1__initial_data.js"/>
</changeFiles>

ちなみにmongeezのおき場所はresources/db/mongeez.xml になります。

mongeezと同じディレクトリにchangeFilesで指定したファイル名でjsファイルを置きます、
jsファイルの中身については、mongodbへのインサート文を書いておきます。

//mongeez formatted javascript
//changeset system:v1_1
db.user.insert({
  "_id":        ObjectId("55c358aa71e7030eec88de0f"),
  "_class":     "jp.co.tads.room.domain.model.User",
  "userName" :  "admin",
  "email" :     "admin",
  "password" :  "$2a$10$8r2ZqDyovFQZiu5qqaTWHeLwo1RJlA2sGMLJJbFV9pCIcjPAOOCSC"
});

はい、あとはapllication.ymlに書いた接続先が利用されてマイグレーションが実行されます。

15:22:55: Executing external task 'bootRun'...
:compileJava
:compileGroovy UP-TO-DATE
:processResources
:classes
:findMainClass
:bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.2.5.RELEASE)

(中略)

initialization completed in 3458 ms
2015-08-07 15:23:18.144  INFO 4912 --- [ost-startStop-1] org.mongeez.reader.FilesetXMLReader      : Num of changefiles 1
2015-08-07 15:23:18.397  INFO 4912 --- [ost-startStop-1] org.mongeez.ChangeSetExecutor            : ChangeSet v1_1 has been executed
2015-08-07 15:23:19.840  INFO 4912 --- [ost-startStop-1] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/mappings],methods=[GET]}" 

簡単!こういった周辺ツールが充実しているのもSpringのいいところですね!!

G* ワークショップに参加してみました #jggug

2014/09/27 1400-1830の時間で札幌においてG* ワークショップが開催されたので参加してみました。
http://jggug.doorkeeper.jp/events/14341

どのような話をされたのかは、リンクの詳細を見て頂ければわかるのですが、
そこまで敷居の高いものではなく、ざっくばらんに優しくお話して頂けました。

弊社の若いのも参加していたのですが、楽しかったという感想をもらえたので何よりです。

色々とご縁があって札幌開催の運びとなったのですが、「年一回でも定期的に札幌でやりたいですね」と
言って頂けたので、これからも札幌にお呼びできたらいいなと感じておる次第です。

ちなみに、僕の同期のダダ滑りLTにも、ついてきて(いる風?)もらえたようなので、
懐の深さを感じましたねwww

ただやっぱり短かったかなぁ?

その後の懇親会でも、「やっぱり手を動かしたいよね」という話も出てきていたので、
鉄は熱いうちに打てですから、来年やります宣言してしまって、jggug札幌合宿とかあると、
面白いのかもしれませんね。

あとは、ミニ四駆オータムカップ札幌とかの前日ぐらいにやればいいんじゃないかな?(←Okuさん用)

とりあえずせっかく盛り上がって北海道(札幌)も気に入って頂けたようなので、
熱いうちにやりたいことどんどんやってしまいたいです。

「"○○支部"は言ったもん勝ち」という名言も出たことですしねwww

もちろん、勢いだけでは結果失速してしまうと思うので、当日参加していた
札幌のメンバーとも相談しながら、また色々とやっていけたらいいなと思いました。

以上です。

Docker1.0.0を記念して、ISO imageからCoreOSをインストールしてみた。

三十路になりました。とうも、はせひろです。

Dockerが1.0.0になったことだし、Dockerfileを書いて遊んでいましたが、そろそろCoreOSを触ってみようと、とりあえずISO imageからインストールしてみました。

相対的に見てvagrantを使ったインストール方法の記事が多いけど、最初から自分でやってみたかったのと、諸事情によりそちらのほうが都合が良いので。

もちろん、こういう記事は他にもあるのですが、とりあえずね。

1. ISOをダウンロードしてくる。

以下のURLからISOイメージファイルをダウンロードします。Beta Channel, Alpha Channelがありますが、Appha Channelのほうが新しいのでそちらを選択します。
https://coreos.com/docs/running-coreos/platforms/iso/https://coreos.com/docs/running-coreos/platforms/iso/

f:id:HaseHiro:20140613164659j:plain

でも結局、インストールするときはHTTP経由でISOイメージをダウンロードしてきているっぽいので、ここではなんでもいいのかもしれません。

2. ダウンロードしたISOイメージをつかって仮想マシンをブートします。

f:id:HaseHiro:20140613165104j:plain

ここでは仮想マシンとしましたが、ISOからブートするので物理マシンでも同じ手順かと勝手に思ってます。

f:id:HaseHiro:20140613165253j:plain

さて、入力待ちになりましたので、次に進みます。

2. cloud-configを作成してCoreOSをインストールする。

さて、次はcloud-configファイルを作成していきますが、CoreOS側端末だけで作るのはいささか大変です。

CoreOSはSSHでしかログインできません。かつ、SSH鍵認証が必要です。

cloud-configの設定ファイルに公開鍵を設定しなければいけないのですが、さすがに手で入力するのはつらいです。

ですが、インストールするまでならユーザIDとパスワードでSSHログインが可能ですので、そうしましょう。

ちなみに、デフォルトで「core」というユーザが存在しているのでこいつにパスワードを設定してあげましょう。

$ sudo passwd core

パスワードを設定したら、windowsであれば tera term などを使って別端末からログインしましょう。

ログインできたら、とりあえずスーパーユーザになっておいてください。
以降はCoreOS側端末ではなく、別の作業用端末からの作業になります。

$ sudo -s

さて次にcloud-config用のファイルを作成します。おもむろに次のようにコマンドを打ちましょう。

# vi config

cloud-configはCoreOS固有の設定を記述しておくファイルです。公式サイトのドキュメントを見ればもっとたくさんの設定が書いてありますが、今回は単純にインストールするだけですので、以下のようにします。

#cloud-config

ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqD・・・・・

ssh_authorized_keys:は、ログインに使用する公開鍵を設定しておくところです。
users:などを利用しなければ、デフォルトのユーザ「core」ユーザでログインするときに使用する鍵になります。

ssh-keygen -t rsa などで作成した鍵を利用しましょう。ここに設定するのは.pubのほうです。

これが出来たらインストールですが、CoreOSのインストールは、インストール時に再度HTTP経由でISOイメージを取得しにいくので、プロキシ環境の場合はhttp_proxyを設定しておいてください。

# export http_proxy="$PROXYHOST:$PORT"
# coreos-install -d /dev/sda -C alpha -c config

coreos-installがインストールコマンドです。-dオプションでインストール先のディクスを指定します。

また、-C オプションでインストールするチャンネル、-c オプションでcloud-configを記述したファイルを指定します。

インストールが完了すると「Success・・・」と表示されて、コンソールが入力待ちになるので

# reboot

リブートします。

CoreOSは何も指定しない場合、DHCPIPアドレスを取得するので、CoreOS側端末でIPアドレスを確認しましょう。IPアドレスはリブート後立ち上がったログイン画面に表示されています。

IPアドレスを確認したら、別の作業用端末から、SSH鍵認証でログインします。

f:id:HaseHiro:20140613172258j:plain

色が可愛い♪

おもむろにDockerのバージョンを確認してみましょうか。

f:id:HaseHiro:20140613172401j:plain

よし!1.0.0です!!

以上でCoreOSのインストール作業は終了です。

正直なところ、Dockerだけを使うのであればCoreOSを選択するメリットはあまりない気がしています。他のディストリビュージョンに比べて軽量であるということはありますが、クラスタリングなどを構成するときにもっとも威力を発揮するのでしょう。

特徴できなところは以下のページがとても参考になります。
CoreOS 入門 - Qiita

現場からは以上でーす。

Dockerfileを使って一撃でelasticsearch + kibana3の動くマシンを用意する。

とうも、はせひろと申します。

去年に比べるとかなり仕事も落ち着いてきて、少しずづですが余裕が出てきました。

というわけで、表題にあるようなことをやっておいたので、備忘録としてここにおいておきます。

あ、もちろんみなさんはDockerの使えるマシンがありますよね?・・・ありますよね?

なければDockerを使えるようにしておいてください。

ちなみにDockerのバージョンは0.11.1です。

Dockerfileを利用したイメージの作成はdocker build ${directory}コマンドで実施するのですが、このときに指定するdirectoryにはDockerfileが配置されている必要があります。

また、そのほかのbuild時に必要なファイルなどがあれば、${directory}/resource/xxxxxxx.tar.gz のようにしておくことで利用が可能です。

何はともあれ、僕の備忘録なので説明もそこそこにして、僕が容易した${directory}配下の構成はこんな感じです。

kibana3+elasticsearch
│  Dockerfile
│  
└─resource
    │  80Proxy
    │  elasticsearch-1.2.1.tar.gz
    │  start.sh
    │  
    └─kibana3

elasticsearchについてはtar.gzを直接持っておいておきました。
kibana3についても最初から置いておきました。ちなみに「kibana3」配下にはHTMLやらjsがたくさん置いてあります。

80Proxyはapt-getのプロキシ設定用で、start.shはdocker run時にこのシェルを起動するようにして、このシェルから必要なサービスを起動するようにしてあります。

コンテナを起動させたときにサービスを自動起動させる方法が分からなかったので、とりあえずこうしています。良い方法があれば教えて下さい。

そんでDockerfileはこちら。


gist69de0349c3d0cc154598

あ、fluentdも入っているね。

というか基本的なことが分かっていなかったんだけど、docker runしてもそのときに実行されるコマンドが終了すると、コンテナも止まってしまうのね。

\-dオプション付ければ大丈夫と思っていたけど違ったようで。

なので、start.shの最後には/bin/bashと書いておいて落ちないようにしている。

妻がしっかりと遊んできてくれて嬉しいという話

f:id:HaseHiro:20140512215859j:plain

どうも、はせひろと申します。

つい最近の話ですが、妻が終電を越えるまで友人と飲みに出かけました。

このフレーズだけだと、「なんだ?これから妻の愚痴でも書くのか?」と思われるかもしれませんが、その逆で、タイトルにもある通りちょっと嬉しいです。

妻もまだまだしっかりと遊べるんだなと安心しました。

妻と結婚して以来・・・というか、知り合ってから考えても初めてなんじゃないのかな?

だからいささか不安もあったんです。特に子供が出来てからは当然のごとく僕の方が帰りが遅いし、去年にいたっては、単身赴任で東京にいってたし、遊ぶといってもその傍らには常に子供が居て、かならずどこかで気にかけていなくちゃいけなくて、遊ぶことだけに集中して遊んでたことなんてほとんどないと思う。

「本当にそう思ってる?」って妻は思うと思うけど、数えるぐらいしか言ってないから妻の記憶にも残っていないと思うけど「たまには遊びにいったらいいじゃない」的なことは言っていたのです。

妻は「対人間」がメインの職業だし、子供は可愛いけど育児だってストレス溜まるじゃない?

だから今回の出来事は嬉しかった。ちゃんとしっかり遊んで抜くこと出来たんだろうなって。

ただ、妻はあまり酒が強くないし、なんせここまで遅いのは初めてだったので、なんかあったら迎えにいけるようにと起きてはいたけどねwww

出来の良すぎる妻だけに、子供に対してだったり、仕事に対してだったり、もちろん僕に対してだったり、色々と溜め込む要因は多いだろうから、これからも適度に事件などに巻き込まれないように、しっかりと飲みに行くでもなんでもいいので、遊べる時間に遊んでほしいと思います。

以上。

すもけ2

今回は考察記事ではなく、本当の彼を皆様に知って頂くための記事です。

前、こんな記事を書きました。

考察「すもけ」 - どうも、はせひろと申します。


この記事を書いたことで割りと満足していたんだけど、奴がfacebook上でとんでもねぇことをぬかしやがったので、それを全否定するべくまた記事を書くことにしました。

以下は、彼が言っていたことの大筋です。

知人から「facebook上で何かするたびに、コメントで怖いとかヤ○ザとか言われるのってなんでですか?」って言われたんだけど、全部お前らのせいだ。

え?・・・・・この『お前ら』のみなさんどうお思いですか???

つまりはこういうことですよ!

f:id:HaseHiro:20140501105824j:plain

無理無理無理無理!これは無理だろぉ.....ぜーったい納得できないねこれは。

篠原信一 対 ダビド・ドゥイエの世紀の大誤審より納得できないね。


あとね、彼ってバール好きだし。

え?だからバールだよ、バール。鈍器です。鈍器。


彼のアマゾンのwishlistをみると、バールがあるの。バールが。

んまぁ、北海道の場合は、雪かきするときなんか圧縮されすぎて固まった雪とか、氷を砕くのに使ったりするんだけど、彼の場合は違います。

f:id:HaseHiro:20140501111219j:plain

どのようなことに利用しているのかは、みなさんのご想像にお任せすることにしますが。普通に考えると・・・っと誰かが来たようだ。

あと、まだあるんだけどね、彼の風貌から、写真を撮られては弄られ、写真を撮られては弄られを繰り返しているんだけど、弄られて出来上がった作品が異常に「違和感仕事しろ!」なのです。

慣れていない人であれば必ず無理している感が出てくると思うんだけど、まるで息を吸うように弄られているのを見て、これはもしかして弄られているように見せかけて、本当の自分をさらけ出しストレス解消しているのではないかと思うぐらい。

つーかたぶんそう。



それの代名詞がこれ。

f:id:HaseHiro:20140508122552j:plain





ほら、違和感なっしんぐ。結構解消しちゃってるね、ストレス。


そしてやばい、怖すぎる。もし夜道に。。。いや夜道じゃなくても、もし突然みなさんの目の前にこのような格好をした男性が現れたらどうしますか?

全力でバックダッシュである。FF8でヘイスト状態のゼルが逃げているときよりも、高速で足が回る・・・恐怖で。



そろそろ命の危険を感じてきているのでこれで最後にするけど、一番怖いのはやけに腰が低いことなんだよね。まぁ良くいうと優しくて人当たりが良いです。外見とは裏腹に。

でもほら、本物の人たちって僕らには優しいっていうじゃない?それを地で行く感じだよね。

あと、土下座がキレてる。マジでキレてる。

f:id:HaseHiro:20140508124728j:plain


この一寸の狂いも無い土下座は、いままで偉くなるために試行錯誤した結果だと思います。

普通、ここまで綺麗に土下座するほど、土下座する機会なんてないから、たぶんそういうこと。

あ、ちなみに手前の紫のダウン着てるのは僕ね。させました、土下座

ということで、そろそろ彼の今後に支障をきたすレベルになると困るので、ここら辺でやめておくか。

以上!!!!

Dockerを触ったメモ

環境構築(CentOS6.5)

それではCentOS6.5 64bit上にDockerをインストールするところから始めてみましょう。Dockerのインストールはすこぶる簡単で、以下のコマンドを順番に実行するだけで出来てしまいます。

# wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install xz docker-io -y
# service docker start

プロキシ配下で行う場合は、dockerを起動させる前に「/etc/sysconfig/docker」に対して以下を追記しておいてください。

# /etc/sysconfig/docker
#
# Other arguments to pass to the docker daemon process
# These will be parsed by the sysv initscript and appended
# to the arguments list passed to docker -d
# ↓の行を追加。
export http_proxy="http://[IP]:[PORT]"

other_args=""

コンテナイメージのダウンロードと起動

dockerで利用するコンテナのイメージについては、以下のコマンドで取得できます。

# docker run centos /bin/echo Hello

centosというイメージを取得してくるのですが、これはhttps://index.docker.io/で提供されているコンテナイメージを取得しています。

このサイトに「centos」という名前でコンテナのイメージが登録されているので、今回はそれを利用してみます。

ちなみにここからは「docker」というユーザを作成しておこなっています。

[docker@localhost ~]$ docker run centos /bin/echo Hello Docker!!
docker run centos /bin/echo Hello Dockerdocker images
Unable to find image 'centos' locally
Pulling repository centos
0b443ba03958: Download complete
539c0211cd76: Download complete
511136ea3c5a: Download complete
7064731afe90: Download complete
Hello Dockerdocker images

さて、これでイメージができた筈なので、以下のコマンドで確認してみます。

[docker@localhost ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos6             0b443ba03958        13 days ago         297.6 MB
centos              latest              0b443ba03958        13 days ago         297.6 MB
centos              6.4                 539c0211cd76        13 months ago       300.6 MB

なぜか3つぐらいイメージが出来ていますが、何故3つも出来ているのかは勉強不足で不明です。調べておきます。

とりあえずイメージが取れたので、それでは中に入ってみましょう。仮想マシン中に入るには次のようにします。

[docker@localhost ~]$ docker run -i -t centos /bin/bash
bash-4.1#

はい、これで先ほどインストールした仮想マシンの中に入ることができました!exitなどを打てはこのマシンから抜けることが出来るのですが、抜けた瞬間にこの仮想マシン上で行った操作は破棄されます。適当にテキストファイルを作成した跡に、もう一度同じマシンに入って確認してみてください。作成したファイルが無いことを確認できます。

[docker@localhost ~]$ docker run -i -t centos /bin/bash
bash-4.1# touch test
bash-4.1# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  test  tmp  usr  var
bash-4.1# ls -la
total 8040
dr-xr-xr-x.  21 root root    4096 Apr 30 02:00 .
dr-xr-xr-x.  21 root root    4096 Apr 30 02:00 ..
-rw-rw-rw-.   1 root root     115 Apr 30 01:56 .dockerenv
-rwx------.   1 root root 8073215 Apr 28 02:54 .dockerinit
dr-xr-xr-x.   2 root root    4096 Apr 12 01:10 bin
drwxr-xr-x.   4 root root   81920 Apr 30 01:56 dev
drwxr-xr-x.  40 root root    4096 Apr 30 01:56 etc
drwxr-xr-x.   2 root root    4096 Sep 23  2011 home
dr-xr-xr-x.   7 root root    4096 Apr 12 01:09 lib
dr-xr-xr-x.   5 root root    4096 Apr 12 01:10 lib64
drwx------.   2 root root    4096 Apr 12 01:06 lost+found
drwxr-xr-x.   2 root root    4096 Sep 23  2011 media
drwxr-xr-x.   2 root root    4096 Sep 23  2011 mnt
drwxr-xr-x.   2 root root    4096 Sep 23  2011 opt
dr-xr-xr-x. 117 root root       0 Apr 30 01:56 proc
dr-xr-x---.   2 root root    4096 Apr 12 01:10 root
dr-xr-xr-x.   2 root root    4096 Apr 12 01:10 sbin
drwxr-xr-x.   3 root root    4096 Apr 12 01:10 selinux
drwxr-xr-x.   2 root root    4096 Sep 23  2011 srv
drwxr-xr-x.  13 root root       0 Apr 28 02:16 sys
-rw-rw-rw-.   1 root root       0 Apr 30 02:00 test
drwxrwxrwt.   2 root root    4096 Apr 12 01:10 tmp
drwxr-xr-x.  13 root root    4096 Apr 12 01:07 usr
drwxr-xr-x.  17 root root    4096 Apr 12 01:07 var
bash-4.1# exit
exit
[docker@localhost ~]$ docker run -i -t centos /bin/bash
bash-4.1# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var

はい、見事に元通りです。では仮想マシンでの操作を残したい場合はどうすれば良いのでしょうか?それは、docker runのときに-dオプションをつけて、仮想マシンでの操作が終わっても、破棄せずに残しておくようにします。

[docker@localhost ~]$ sudo docker run -i -t -d centos /bin/bash
3fed51cddea37cfe0dafe264c6eeb2e0b0e29255dfa1bb37fc8da83d7ad13c2b
[docker@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3fed51cddea3        centos:centos6      /bin/bash           7 seconds ago       Up 6 seconds                            hopeful_wozniak

さきほどは、仮想マシンのコンソールに移動しましたが、今回は移動しませんでした。また、docker psコマンドを打つと、ひとつ3fed51cddea3というCONTAINER IDが追加されていることがわかります。このコマンドではdockerで稼動中のコンテナを表示することができます。

では、この可能マシンにアタッチしてみましょう。

[docker@localhost ~]$ docker attach 3fed51cddea3
bash-4.1# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
bash-4.1# touch docker
bash-4.1# ls
bin  dev  docker  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
bash-4.1# [error] client.go:2268 Couldn't send EOF: use of closed network connection

[docker@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
3fed51cddea3        centos:centos6      /bin/bash           About a minute ago   Up About a minute                       hopeful_wozniak

コンテナを稼動させたままコンソールから抜けるにはCtrl-p、Ctrl-qで抜けて下さい。

次にこの変更をコミットしてみましょう。

[docker@localhost ~]$ docker commit -m "new textfile docker." 3fed51cddea3 hasehiro/centos6_test
411d681d9ab08ee5d4aa50aea0485f4b73e3eea35421026d77d76f372cd938b9
[docker@localhost ~]$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hasehiro/centos6_test   latest              411d681d9ab0        20 seconds ago      297.6 MB
centos                 centos6             0b443ba03958        13 days ago         297.6 MB
centos                 latest              0b443ba03958        13 days ago         297.6 MB
centos                 6.4                 539c0211cd76        13 months ago       300.6 MB
[docker@localhost ~]$ docker run -i -t hasehiro/centos6_test /bin/bash
bash-4.1# ls
bin  dev  docker  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var

はい、dockerというファイルが存在しているコンテナイメージが出来上がって、かつ作成したファイルが残っていることを確認できます。

まとめ

かなり気軽にかつ、高速に仮想マシンを弄れる環境を整えることができました。気軽すぎるがゆえにプロダクション環境での利用が敬遠されそうな気もしますが、今後の流れに注目です。