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 の中にあることと、毎回フォワードするポートがランダムなのがちょっと悩ましい。