Docker (土曜日に podcast します)

Docker をいじって遊んでいる。

Docker は PaaS ベンダの DotCloud がその PaaS のバックエンドとして使っている (?) ミドルウェアを公開したもの。適当な条件の VM をポコポコ生み出してはテストや実際の運用に使うことができたりするもの。例えば「Ruby と Bundler が入っている VM」みたいなのを設定で作っておくと、後日何か Ruby でアプリケーションを動かしたいと思ったときにそのイメージをベースに VM を作ってデプロイしてやればすぐにアプリケーションが動き出す。そもそも PaaS がやっているのはそういう事で、それを汎用化したのが Docker。Travis CI のような、各言語ごとの実行環境が整った VM みたいなものに任意のコードを渡してビルドさせる、みたいなプラットフォームを作るのにも使える。

Docker のユースケースとしてはまあそんな感じなんだけど、色々と汎用的に作られているのでもっと面白い使い方がそのうち発見されるかもしれない。

より詳しい解説は今回はしない。この辺 http://apatheia.info/blog/2013/06/17/docker/ が詳しい。

CPANモジュールのスモークテストに Docker を使う

サンプルとして分かりやすいのは miyagawa さんが作った https://github.com/miyagawa/docker-plenv-vanilla で、Docker が動く環境にこの Dockerfile なるものを持ってきて docker build とすると複数バージョンの Perl が入った VM のひな形ができあがる。このひな形から VM を作る・・・ クラスからインスタンスを作るみたいな感じで作ることができる。そしてその VM に、例えば自分の作った CPAN モジュールのインストールなんかを流すと、複数バージョンでのモジュールインストールのスモークテストができる。

このように Dockerfile で、VM のひな形を作っておいて必要に応じてそこから VM を作って云々というのが Docker の基本操作になる。Docker の仮想環境は LXC ベースなのでひな形から VM を作るのは一瞬で終わる。AUFS 周りも面白いがその辺は省略。

Chef + serverspec のテストに Docker を使う

Continus Deploy や DevOps 的な文脈でこそ威力を発揮するツールなんだろうなあと思い、例によって Chef + serverspec の CI フローに使えないか検証している。

Chef + serverspec のテストとして使うにはそんなにむずかしいことはなくて、パスワードなしの sudo アカウントがあって、sshd が通ればそれで良い。そのためのイメージ (VM のひながたのことね) を作ってみる。

Dockerfile は以下のようになった。

FROM centos

RUN yum install -y passwd
RUN yum install -y openssh
RUN yum install -y openssh-server
RUN yum install -y openssh-clients
RUN yum install -y sudo

## create user
RUN useradd naoya
RUN passwd -f -u naoya
RUN mkdir -p /home/naoya/.ssh; chown naoya /home/naoya/.ssh; chmod 700 /home/naoya/.ssh
ADD ./authorized_keys /home/naoya/.ssh
RUN chown naoya /home/naoya/.ssh/authorized_keys; chmod 600 /home/naoya/.ssh/authorized_keys

## setup sudoers
RUN echo "naoya    ALL=(ALL)       ALL" >> /etc/sudoers.d/naoya

## setup sshd and generate ssh-keys by init script
ADD ./sshd_config /etc/ssh/sshd_config
RUN /etc/init.d/sshd start
RUN /etc/init.d/sshd stop

## Seems we cannnot fix public port number
EXPOSE 22
# EXPOSE 49222:22

CMD ["/usr/sbin/sshd", "-D"]

これでホストOS上で

% docker build -t naoya/sshd .

とすると、sshd ready なイメージができあがる。そこから VM を作るには

% docker run -d naoya/sshd

とするだけ。docker の port forwarding で22番ポートがホストOS上の適当なポートに転送されるので、これでその IP + port に向けて任意のクライアントから ssh が可能になる。これができれば、knife solo prepare で Chef の実行環境を整えてやって、serverspec を実行させるのはすぐだ。実際うまくいった。

いまは Jenkins などのツールとどうやって連携させればよいか、というあたりを考えている。Docker 自体が Vagrant の中にあることと、毎回フォワードするポートがランダムなのがちょっと悩ましい。

Podcast します

だいぶ雑な紹介になってますけど、まだいろいろと試行錯誤中ですので。土曜日に miyagawa さんと Podcast するのでそこでもう少しちゃんとした説明とか使用感とか、あと Vagrant との使い分けとか気になるであろうところなど、いろいろ話せたらなと思ってます。