バージョン : 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 初日でした。