以前、 AWS ECS で試験運用したことがあったので Docker 化自体は済んでいた。 ECS などマネージドコンテナサービスを使わずに Docker 運用ができないか試してみた。
動機
関連記事の更新処理、諸々障害があって自動化できておらず、 DB を clone してきて手元で実行してサーバーにエクスポートするという運用が続いていた。これを自動化したかった。
二つ問題があって、以下の通りだった。
- 関連記事の更新処理時に日本語の分かち書きをする必要があるが、 VPS インスタンスのメモリ上限があり MeCab の拡張辞書をサーバー上でインストールできない
- VPS 上で SQLite の算術計算を行うためには追加拡張が必要で、そのためには SQLite をソースコードからコンパイルする必要がある
1 は Docker イメージにして手元でイメージをビルドすれば解決できた。 2 の問題も Docker のなかでコンパイルを行うことで解決できた。
どうやるか
- nginx.conf の修正
- コンテナの create
キャッシュのためにファイルシステムを利用しているのでホストとコンテナで public ディレクトリを共有する必要があった。
docker create \
-e DATABASE_URL=db_url \
-e RACK_ENV=production \
-v /home/morygonzalez/sites/portalshit/public:/app/public \
-p 3001:3001 --name portalshit -it morygonzalez/portalshit bundle exec puma -p 3001
- コンテナの起動
docker start portalshit
結果どうだったか
サイトを Docker で公開することはできたが、 docker create
して docker start
するまでの間、ダウンタイムが発生する。
ダウンタイムなしで deploy するためには deploy のタイミングで Nginx conf を書き換えて service nginx reload
する必要が出てくる。個人のブログレベルでそこまでやりたくない。
コンテナを管理するサービス( AWS ECS や Kubernetes )があるんだったら Nginx conf の書き換えなどしなくてもいい感じに deploy できると思うが、こちらも個人のブログレベルで使うものではないと思った。
結論
- サイトの deploy はこれまで通り cap で行い、 puma はホスト OS で普通に動かす(コンテナ化しない)
- 関連記事表示のバッチ処理のみコンテナ化することにした