moxt

Just another Blog site

RailsアプリをDocker化する過程メモ

   

手元にあるRailsアプリをDocker上で動作させたかったので、その過程をメモ。

基本的には参考元を読んだら済む話。

開発環境を構築する

Docker MachineとDockerComposeは導入済みであることを想定。

大まかな流れは以下のとおり。

  • Docker Machineで開発環境用のVMを作る
  • Docker Composeで必要なコンテナ群を記載・起動する

DockerMachineで開発環境用のVMを作る

どこでもいいが、とりあえずVirtualBox上にVMを作る。

これでVirtualBox上でdocker操作できるようになった。

DockerComposeで必要なコンテナ群を記載する

docker-compose.ymlというYAMLファイルを介してコンテナのグラフを構築する。
参考元の設定を拝借すれば終わり。

とりあえずnginxとrails(unicorn)とmysqlとdata-containerの4コンテナがあれば十分。
RedisやElasticSearchは必要になったら追記すればOK。

docker-compose.ymlは下記のようなコンテナのグラフを記述している。

nginxコンテナが起点でrails,mysqlへと連なってる。

それから、datastoreコンテナ。これはあらゆるコンテナから参照されてる。
datastoreは永続化しておきたいデータを抱える専用コンテナ。
例えばmysqlのデータを抱えたりする
datastoreコンテナのおかげでテストデータ入のmysqlやnginxで配信する静的ファイルをサッと切り替えたりできる。

datastore

永続化したいデータを抱えるのが役目なので特別なコマンドを実行する必要はない。
ちなみにDockerfileはこんな感じ。参考元とほぼ一緒だが。。

mysql

mysqlコンテナは下記の通り。

コンテナ起動時のコマンドはMySQLのDockerfileに記載されてる。

volumes_fromでdatastoreを関連付けてるので、このmysqlコンテナを潰してもdatastoreコンテナでデータが永続化されてる。

rails

railsのコンテナは下記の通り

基本的には参考元と同じ。

違いは2点。
1つは、コンテナ起動時にsupervisorを起動していること。
これはunicorn以外に実行したいプロセスが存在するからだ。
例えば、delayed jobやclockworkなど。

ちなみにsupervisorの設定はこんな感じ。

もう1つはvolumesを指定してる点。
これはコンテナ環境上で開発するため。このようにホストにあるRailsアプリのコードをコンテナ上に載せておけば、手元でソースコードを変更するだけでコンテナ内に変更が伝播する。

一応、RailsのDockerfileもはっておく。
参考元のDockerfileとほぼ一緒。
supervisorを使えるように、インストールと設定ファイルをコピーする処理を追加した。

それから、コンテナ上に開発環境を構築するためにRAILS_ENV: development_containerを追加している。
なので別途environmentsファイルを作成したり、database.ymlにdevelop_containerの項目を書き加える必要がある。

nginx

nginxは参考元と一緒。

4コンテナの記載が終わったらdocker-compose up -dを実行してしばらく待ってると開発環境できる。
MySQLのサーバーはできてるが、データベース作成やマイグレーションはしてないのでやっておく。

docker-compose run rails rake db:create
docker-compose run rails rake db:migrate
docker-compose run rails rake assets:precompile

通常、これ系の処理結果はrun後にコンテナが死ぬので消滅するんだけど、datastoreとリンクしてるおかげで結果が永続化されてる。

 - Docker

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

  関連記事

large_v
DockerでRedmineしたい

Contents1 Docker上でRedmineを動作させる1.1 …

large_v
Dockerでよく使うコマンド

随時追加 Contents1 …

large_v
Docker Machineのメモ

随時追記する Contents1 …