以前作成した React のチュートリアルを Docker Compose で動かしてみた。 (対応したリポジトリはこっち)
Docker は chef とかのレシピを作成する際に使用したり、 Circle CI などで、serverspec でテストをする際に使用する程度で、本番環境で 動かすことにはあまり気にしていなかった。
しかし、ネット上では、もうプロダクションで使っているのをちらほら見かけるので、 本番環境で動かすのを意識した使い方を調べてみて、実際に動かしてみた。
サーバーの構成
構成としては、Web アプリによくある構成で * web server * application server * database server
という構成にしてみた。
今回は、1コンテナ1プロセスということにして、上記の3つのサーバーを 1つのコンテナではなく、それぞれ3つのコンテナで動かすようにした。
以下のサイトがとても参考になった。 * 複雑な構成のrailsアプリをdockerで動かしたい場合はどうするべきか
コンテナの作成方法
行っていることは、ほとんど上記のサイトと同じで、 * nginx * rails * postgresql * datastore
のコンテナを用意する。 永続化したいデータについては datastore コンテナに配置する。 今回の場合では、データベースのデータと、rails のログ、 assets precompile したファイルを datastore に保存する。
assets precompile したファイルについてのデプロイ方法
1コンテナ1プロセスという構成にした際、気になっていたのが assets precompile したものを どのようにデプロイすれば良いのかという点だ。 普段使用しているサーバーは、nginx と rails が同じホストで動いているので、 precompile したものをそのまま配置しているだけだが、今回は nginx と rails が 別ホスト(別コンテナ)なので、precompile したものをどのように nginx 側に渡すのかが 気になっていた。
上記のサイトでは、datastore のコンテナを使い、そこで precompile したものを 共有するという方法をとっており、なるほどなと思い、同じ方法を採用した。
ディレクトリ構成
ディレクトリ構成については若干変更していて、以下のように Dockerfile は全部 containers ディレクトリ以下に配置するようにした。
├── app
...
├── containers
│ ├── datastore
│ │ └── Dockerfile
│ ├── nginx
│ │ ├── Dockerfile
│ │ └── nginx.conf
│ └── rails
│ └── Dockerfile
└── docker-compose.yml
また、docker-compose.yml のフォーマットも異なっていて、version 2 のフォーマットに対応させた。 作成した docker-compose.yml は以下のようになった。
また、作成した React Tutorial では、npm を使ったパッケージのインストールと、webpack によるビルドも 行わないといけないので、これらの作業も追加する。
追加した作業を具体的に挙げると * rails サーバーに npm をインストール及び、react などのインストール * assets precompile 前に webpack によるビルド
になる。
npm のインストール及び react などのインストールについては、rails の Dockerfile で 行うようにしている。 また、webpack によるビルドは、build_client.rake というファイル名で Rake タスクを 作成し、そのタスクを assets precompile のタスクの前にフックさせることにした。 これで、assets precompile のタスクを行えば、自動で webpack のビルドも行われるようになった。
起動方法
起動方法だが、初回時のみ * コンテナの作成 * DB のデータベースの設定とテーブルの設定。 * assets precomile
の手順が必要となる。
まず、コンテナの作成については、
$ docker-compose build
でコンテナを作成する。
次に、データベースの作成とテーブルの作成を行うため、以下のコマンドを実行する。
$ docker-compose run bundle exec rake db:create
$ docker-compose run bundle exec rake db:migrate
postgresql の起動のタイミングのせいなのか、 db:create に関しては 一回コマンドを打つと失敗するが、もう一度同じコマンドを打つと成功する。
その次に作成した Javascript を precompile する。 上記で説明した通り、このコマンドでは webpack によるビルドも同時に行われる。
$ docker-compose run bundle exec rake asset:precompile
初回では以上のコマンドが必要だが、2回目以降の起動時には不要となる。
で次にコンテナを以下のコマンドで起動し、
$ docker-compose up
http://localhost:8080 にアクセスすれば、React Tutorial の画面が見られるようになる。