備忘録 blog

Docker/Machine Learning/Linux

Dockerでサーバーを立てる(2)

それでは実際に、Docker-composeでRailsアプリを立てるところまでやってみたいと思う。

構成

今回のdocker-compose構成は以下である。

supervisordで1つのコンテナに全て立てるのはやはりdockerの原則に反していると思うので、原則として1プロセス1コンテナとした。 まずデータコンテナを置いて、そこにlogを取っておいて各コンテナをマウントするのはデータ永続化の手法としてしばしば用いられるらしい。 mysqldを立てていないのはsqlite3を使っているためである。sqlite3のファイル自体はデータコンテナに格納できていると思われる(?) やはりsqlは別コンテナに立てるべきだと思うので今後、改善したい。

unicornではなくpumaを使う

blog.willnet.in

リバプロとしてnginxを立てる以上、スロークライアントとの通信はリバプロが引き受けるためにunicornの弱点であるプロセスの専有は防げるらしいので、pumaをアプリケーションサーバーとする必要はないらしい。だが敢えてnginx+pumaで立ててみる。

yuuki.hatenablog.com

ちなみにこのエントリが、アプリケーションサーバーの機構についてまとめてあり参考になる。Unicornはマルチプロセス(prefork)型だが、Pumaはマルチスレッド型(スレッドプール)とマルチプロセス型のhybridだそうだ。但し、Rubinius or JRubyを使うことが推奨されている。今回はMRI上で動くアプリだが、TwitterAPIを叩くようなBlocking I/Oを呼ぶようなことはないので使っても大丈夫だろうという判断である。

実際のソケットの設定方法などはunicornを使ったパターンが多く、情報が少なく苦労したがこのあたりを調べた。

www.digitalocean.com

arakaji.hatenablog.com

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.confinclude /etc/nginx/conf.d/*.conf;という記述がないので、そのままでは/etc/nginx/conf.d/nginx.confなどに設定ファイルを記述したところで自動で読み込んではくれない。そこで、もとの/etc/nginx/nginx.confを手元のファイルで上書きする必要があるのだ。

結論:自分でDockerfileをフルスクラッチで書こうとするより、先駆者のものを参考にするのがよい。

github.com

実行

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

これでコンテナを消せるので、失敗したものはどんどん消していくとよいと思う。

参考ページ

qiita.com

qiita.com