べにやまぶろぐ

技術寄りの話を書くつもり

Docker 起動と共にサービスを複数立ち上げたいと思ったらまず Supervisor あたりを試してみよう

バージョン : Docker 0.8

デブサミ2014 「サーバプロビジョニングのこれまでとこれから」でも触れられていた今 DevOps 界隈で一番?ホットな Docker にトライしてみたのですが結構概念的なところでいろいろつまづいています。

vagrant っぽくプロビジョニングして vagrant up した後はそこに vagrant ssh してごにょごにょって思ってたんですが

docker run -i -t my_docker /bin/bash

とかして何かしらフォアグラウンドで動くプロセスが居ないと run してもすぐに終了してしまって docker ps とかしても何も残らない… よーしパパ Apache 立ち上げちゃうぞとかいって

docker run -d -p 80:80 coreos/apache /usr/sbin/apache2ctl -D FOREGROUND

なんてしてみてもえぇ、確かに立ち上がりますけど docker の維持のためにフォアグラウンドにするんですかとか他のサービスは普通で apache だけ別扱いですかとかいろいろ気持ち悪さを感じていたんです。

いろいろ調べてみたんですが、http://docs.docker.io/en/latest/examples/using_supervisord/ にもあるような感じで Supervisor だの Monit だのプロセス監視ツールをフォアグラウンドに引きずりだしてそこから各サービスを駆動するのがある種のパターンなようです。

なのでこの場合は Dockerfile の最後ら辺で

EXPOSE 22 80 # sshd と httpd を駆動
CMD ["/usr/bin/supervisord"]

とかしておくと

sudo docker run -p 22 -p 80 -t -i  my_awesome_docker

などとコマンド抜きで起動してもちゃんと docker ps に残るコンテナが出来て、後は ssh するなり attach するなりいかようでもできてまだなんかしっくりこないものの現状これがベストな感じに思えました。

結構いろんな方が戸惑っていらっしゃるようで、

memorycraft: Dockerってなんじゃ?(Supervisorで複数のサービス起動)

とか

Dockerfile の書き方「私的」なベストプラクティス(3)〜サービスの起動について〜 - ようへいの日々精進XP

とか

riak - Run a service automatically in a docker container - Stack Overflow

などなど大変参考にさせていただきました。

moby/CHANGELOG.md at v0.7.0 · moby/moby · GitHub

には

'run -a', 'start -a' and 'attach' can forward signals to the container for better integration with process supervisors

って書いてあるよなんてのも教えてもらって、将来的にはもっと確立されたパターンになるんでしょうか。この概念的なところとかコマンドとかエラーメッセージとかまだ揺蕩っている感を感じるので今後いろいろ変わりそうですね。CI 系ツールの宿命な気もするので引き続き人柱ウォッチしていきます。

そんな Docker 初日でした。