memo

2014-07-29

docker で手元の開発サーバー走らせるのを考えている

Web アプリケーションなお仕事で、 案件ごと、アプリケーションごとに手元に用意するような開発サーバー(開発環境)を、 docker で走らせたらどうかというのを考えている。

ファイルの編集は手元(ホスト側)でやるとして、 volume を使って container と共有すれば良い。

手元と開発サーバーとの通信について、 HTTP はまあ当然として、 MySQL とか SMTP あたりは普通に出てきそう。 これらを publish でホスト側につなげるとすると、どの開発サーバーの何番ポートがホストの何番になってるのか、 把握しておく必要がありそう。無理。

ホストからなら container の IP address (172.17.0.1 みたいなやつ) に直接つなげるけど、 これは container の起動毎に割り当てされるので、 目的の開発サーバーがどのアドレスを持っているか起動毎に調べないといけない。ダルい。

ということで、 docker から containers の情報を取ってきて返す DNS サーバーを作った。

https://bitbucket.org/nakamura/doco

これを resolv.conf に設定しておけば、開発サーバーの名前だけ憶えておけば好きなポートにつなげられる。 ホストの resolv.conf は container も使用するので、 127.0.0.1 ではなく 172.17.42.1 (containers から見たホストのアドレス) を書いておく。

さて、せっかく DNS サーバーを用意したので、 名前を引かれたタイミングで container を起動する機能も付けてみた。

開発サーバーは色々ある内の今作業してる分だけ起動してくれていれば良いので、 最初のアクセス ≒ 最初の名前解決でオンデマンドで立ち上がってくれれば便利かなぁという考え。

ただし、 container 起動からポートの listen までに、例えば5秒かかるとすると、 「ポート空いてないよ」エラーが接続元に返ってしまうような気がするので:

# iptables -I INPUT -i docker0 -p tcp --tcp-flags SYN,ACK,FIN,RST ACK,RST -j DROP
# iptables -I FORWARD -i docker0 -p tcp --tcp-flags SYN,ACK,FIN,RST ACK,RST -j DROP

として RST パケットを落としてみる。

これで、ブラウザでアクセスすると開発サーバーが立ち上がって、 そのままページが返るような環境ができたんじゃないかなと思うので、 いいかげん肝心の開発サーバーを docker に乗せる作業をしようかなと思いました。