Dockerでサーバーを立てる(2)
それでは実際に、Docker-composeでRailsアプリを立てるところまでやってみたいと思う。
構成
今回のdocker-compose構成は以下である。
supervisordで1つのコンテナに全て立てるのはやはりdockerの原則に反していると思うので、原則として1プロセス1コンテナとした。 まずデータコンテナを置いて、そこにlogを取っておいて各コンテナをマウントするのはデータ永続化の手法としてしばしば用いられるらしい。 mysqldを立てていないのはsqlite3を使っているためである。sqlite3のファイル自体はデータコンテナに格納できていると思われる(?) やはりsqlは別コンテナに立てるべきだと思うので今後、改善したい。
unicornではなくpumaを使う
リバプロとしてnginxを立てる以上、スロークライアントとの通信はリバプロが引き受けるためにunicornの弱点であるプロセスの専有は防げるらしいので、pumaをアプリケーションサーバーとする必要はないらしい。だが敢えてnginx+pumaで立ててみる。
ちなみにこのエントリが、アプリケーションサーバーの機構についてまとめてあり参考になる。Unicornはマルチプロセス(prefork)型だが、Pumaはマルチスレッド型(スレッドプール)とマルチプロセス型のhybridだそうだ。但し、Rubinius or JRubyを使うことが推奨されている。今回はMRI上で動くアプリだが、TwitterAPIを叩くようなBlocking I/Oを呼ぶようなことはないので使っても大丈夫だろうという判断である。
実際のソケットの設定方法などはunicornを使ったパターンが多く、情報が少なく苦労したがこのあたりを調べた。
Arch linuxによるnginxサーバーを立てる時の注意点
既存のnginxイメージを使ってもよいのだが、せめてこれぐらいはArch linuxで立てたいと思ってDockerfileを記述した。
RUN \ pacman -Syu && \ pacman -S nginx --noconfirm ADD ./nginx.conf /etc/nginx/nginx.conf VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"] WORKDIR /etc/nginx EXPOSE 80 ENTRYPOINT /usr/sbin/nginx -g 'daemon off;'
この中で、
ADD ./nginx.conf /etc/nginx/nginx.conf
の部分が厄介で、Arch linuxのnginxでは/etc/nginx/nginx.conf
にinclude /etc/nginx/conf.d/*.conf;
という記述がないので、そのままでは/etc/nginx/conf.d/nginx.conf
などに設定ファイルを記述したところで自動で読み込んではくれない。そこで、もとの/etc/nginx/nginx.conf
を手元のファイルで上書きする必要があるのだ。
結論:自分でDockerfileをフルスクラッチで書こうとするより、先駆者のものを参考にするのがよい。
実行
Dockerfile, docker-compose.ymlがアプリのルートディレクトリに置いてあって、Arch linuxによるnginxサーバーのイメージは予めbuildしてあることとする。
$ docker-compose up -d
これで、コンテナをcreateして実行してくれる。Dockeruiによる管理をしていれば、webui上で正常に動作しているかどうかを確認できる。
その後、dbのmigrationは実際に内部に入って行う必要がある。
$ docker exec -it app bash # bundle exec rake db:migrate
$ docker-compose down
これでコンテナを消せるので、失敗したものはどんどん消していくとよいと思う。