update.はじめにエンジニアやっていると色んなサービスを作りたくなると思うのですが、Herokuのフリープランが使えなくなってしまった影響で無料でのサービス運営は難しくなってきています。Engineなど無料で運用できるものもあるのですが、サービスにロックインされてしまうのが多くちょうど良い物が見つかりませんでした。いうことである程度安く色々やろうとすると、1台のサーバでいい感じに複数サービスを立ち上げるという昔ながらの構成になるのですが、Dockerを使うことで環境セットアップなどサーバ管理の手間を最小限にしていこう、というのがこの記事の趣旨となります。安いサービスにロックインされないスケーラブル(もしサービスのアクセス量が増えたとしてスケールさせられる)インフラ管理が容易セキュリティとかなるべく気にしたくない以上のことを踏まえた結果ConoHaのVPSを使う構成となりました。(数十円/month)という構成で月2000円以下に抑えられています。検討したことPaaSとか考えたのですが結局VPSが一番安いよねという話。自宅サーバデータ消えないような仕組みづくりとかそういうところに時間を使う時代じゃなくなってきてるので自分の中ではこれは無いかな。PaaSHerokuはFreeプランでできることが少なくなったので他のサービスを探しましたが、複数サービスを無料に近い金額でできるのがありませんでした。OpenShiftとかは複数アカウント作ればできるんだろうけどその管理がめんどくさい。Bluemixは無料枠多いのでもしかしたら結構良いかもしれない。AWS、GCPなど価格が高いということでやめました。DBサーバの管理をしたくないのでマネージド型のRDBが欲しかったのですが、コストが大分高くなってしまう感じでした。NoSQL系は安いのですが使いたくなかったのがあります。VPSを使う結局安く運用するならVPSだなという結論に。マネージド型のRDBサービスについては、ConoHaクラウドがDBサーバを500円という格安料金で提供していて、LBなども追加できるIaaS的なサービスでちょうど自分の要望を満たすことができたのでこちらにしました。DBがMariaDBだったりおそらく多くのユーザで共有しているのでパフォーマンスが期待できないなどの問題が気にならなければこれで良さそう。自分の中ではDBサービスのあるVPSが無かったらたぶんAWS上でEC2+RDSの構成にしていたと思いますが(そのくらいDBの管理をしたくない)、自分でDBサーバを立てるのであればどこのVPSでも良いと思います。構成ということでこんな構成になりました。サーバの構成管理は1ファイルで完結します。Dockerのイメージ作成もDockerfileとnginx,supervisordの設定ファイルのみで簡単にできるようになっていて、必要な管理はそれだけなのが特徴です。順に構成要素を説明していきます。CoreOSDockerだけあれば良いのでCoreOSにしました。1ファイルで管理できるという点でこれしかないなと思って選びました。いれておけばファイルの管理としては十分で、プライベートリポジトリも必要とせずに構成の管理ができてしまうのが個人的には気に入りました。サービスのDockerイメージDockerの考え方的にはおそらくアプリケーションサーバとnginxは別コンテナにするべきなのですが、nginxとrailsを別コンテナで管理するコストが高いのでシンプルさという点で避けることにしました。立ち上げるような構成にしています。docker-composeを使うということも考えましたがCoreOSに入っていないのと、あくまでDevelopment向けに開発されているものなので使っていません。Rails上のsecretやDB接続先はDocker実行時の環境変数として入れることで環境に依存しないイメージを作成するようにしています。nginx-proxy複数のサービスはそれぞれのコンテナで動いているので、各リクエストを振り分けるリバースプロキシが必要です。hostやディレクトリ毎の振り分け先を書いて、みたいなことをするわけですが、nginx-proxyを使うと立ち上がっているDockerコンテナに自動的に振り分けを行うことができます。これによりサービスの投入が非常に楽になります。docker-letsencrypt-nginx-proxy-companionSSLが使えないサービスは今時ありえないので、それへの対応です。Encryptは最近注目の無料でSSL証明書を発行できるサービスです。Facebookを始めとした名高い企業がスポンサーとなっています。このコンテナを動かすだけで自動でSSL証明書の発行・更新を行ってくれます。Relicを入れています。これもコンテナを動かすだけなので管理コストは少ないです。Hubを使えば良いのですが、いくら個人のクソサービスとはいえ全部が全部公開できるものではないと思います。Hubのプライベートリポジトリはお金がかかるので小さいサービスを量産していく形だと非常にお金がかかってしまいます。CLIなどを入れて認証することが必要で複雑になるため利用を諦めました。立てることにしました。Registryから、という構成にしています。この構成は正直あまりイケてないので今後直したいです。CircleCIから自動でPushするとかもできないですし。Registryが使えるのでこんなコンポーネントは要らなくなります。Registryを自前で立てる複雑さのどちらが良いかという選択でした。以上を踏まえて環境セットアップ手順です。CoreOSのインストールVPSにCoreOSをインストールします。ConoHaのサーバにインストールした時のメモがこちら。NEW_RELIC_LICENSE_KEYs3のAPIのアクセスキーやバケットの情報があります。NewRelicとS3のアクセス情報はあらかじめ準備しておいてください。なっていることを確認します。インストールするのは大変なのでベースイメージを作っておきます。Dockerはローカルマシンにインストールしておいてください。このDockerfileはnginxをaptで入れるなどの楽をしているので、古いバージョンのnginxが入ってしまう点は改善の余地ありです。Registryを立ち上げてPushします。localhost:5000/base-imageこれでベースイメージの作成が完了です。複数サービスを立ち上げるのであればProcess式のものよりThread式のが良いかなと思ってなんとなくPumaにしています。アプリ自体は普通に作るだけなのですが、Dockerを使うにあたっていくつかポイントがあります。ログは標準出力にDockerでは基本標準出力にログを出すことで簡単にログを見ることができます。詳しくないのでもっと良い方法があったら教えて下さい。Logger.new(STDOUT)...DBなどの情報は環境変数を見るようにこんな感じにしてます。Productionだけでも良いわけですがそこは環境に応じて。上記を踏まえてDockerfileとnginx.confとsupervisord.confが下記のような感じに。Pumaもnginxの設定と合わせてセットアップが必要なのでうまいことやります。}ビルドしてPushします。HOSTでリバースプロキシを設定するのでお使いのネームサーバで今回のサービスに対するサブドメインを設定します。ヘルプを参照してください。SSL証明書の発行のため、RAILS_*はrails用の環境変数なので環境に応じて設定してください。DBはConoHaの場合管理コンソールから作成しておきます。同じ内容なのでコピペするだけなので許容範囲かなと思います。この辺は好みに応じてスクリプトでラップしたり、そもそもdocker-buildの時点で環境変数入れてしまうなどで対応できます。hoge以上で、サービスインすることができます。この状態で放置しておくと1時間に1回、SSLの証明書の更新が行われるのでhttpsでアクセスできるようになります。oneshotのサービスを定義してtimerを作成します。OnCalendar=*:*確認はsystemctlを使う。私の環境はまだスケールするような状況にはなってないですが、もしユーザ数が増えた時にそれに対応できるというのは重要ですよね。利用して簡単にセットアップできます。LBを追加して複数のサーバに負荷分散することも容易です。それでもパフォーマンスが気になってきたら、AWSなどの他のクラウドに移すことを考えるとしてもDockerのイメージを持っていくことは大した作業にはならないと思います。基本的な汎用技術しか使っていないのでその時々に応じた最適な環境に持っていけるはずです。(DBのデータの移行は必要ですけどね!)まとめ以上、Dockerを使っての複数サービスを作る際のマイベストプラクティスでした。非常に縦長のファイルになってしまいますが、個人的には複数にわかれてるより管理しやすくて好きです。するだけなのでわかりやすいと思います。実際の運用はローカルマシンでのビルド、プッシュCoreOS上でのcloud-config.ymlのアップデート辺りは簡単なスクリプトにまとめています。今回説明したものをなんとなくGitHubにまとめておきました。スクリプトの一部しか書かれてなくてよくわからない場合は参考にしてください。https://github.com/miyasakura/my-docker-sampleおわりにこれを読んで、CoreOSじゃなくてもDockerとsystemdが入ってればいいじゃんとか、素直にAWS使えばいいじゃんとか色々意見はあると思いますし、私もこの環境での運用は長くはないので問題は色々出てくると思っています。みなさんが考えるベストなシステム構成を教えて下さい。未弥@miyasakura_職歴的にはインフラ→Web→Android→iOSですがフルスタックには程遠く。upLoginユーザーは見つかりませんでした。