RailsアプリをDocker化する過程メモ
手元にあるRailsアプリをDocker上で動作させたかったので、その過程をメモ。
基本的には参考元を読んだら済む話。
Contents
開発環境を構築する
Docker MachineとDockerComposeは導入済みであることを想定。
大まかな流れは以下のとおり。
- Docker Machineで開発環境用のVMを作る
- Docker Composeで必要なコンテナ群を記載・起動する
DockerMachineで開発環境用のVMを作る
どこでもいいが、とりあえずVirtualBox上にVMを作る。
1 2 |
docker-machine create -d virtalbox awesome_sandbox eval (docker-machine env awesome_sandbox) |
これでVirtualBox上でdocker操作できるようになった。
DockerComposeで必要なコンテナ群を記載する
docker-compose.ymlというYAMLファイルを介してコンテナのグラフを構築する。
参考元の設定を拝借すれば終わり。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
mysql: image: mysql:5.6.26 environment: MYSQL_ROOT_PASSWORD: 'pass' ports: - '3306:3306' volumes_from: - datastore nginx: build: containers/nginx ports: - '8080:80' volumes_from: - datastore links: - rails datastore: build: containers/datastore command: /bin/echo hello rails: build: . command: supervisord -c supervisord_development.conf ports: - '3000:3000' environment: RAILS_ENV: development_container MYSQL_ROOT_PASSWORD: 'pass' DATABASE_URL: mysql2://root:pass@mysql:3306 SECRET_KEY_BASE: a3e4c7edb9c5c5e8ac8a4c0ca2505289c616c2f625f3028bb3bd4fad9c5062304bd44f3dfa847e7d90ff7aeb15c18561095ec6d3ed9428b777c644c6f4969145 volumes_from: - datastore volumes: - ./:/usr/src/app links: - mysql |
とりあえずnginxとrails(unicorn)とmysqlとdata-containerの4コンテナがあれば十分。
RedisやElasticSearchは必要になったら追記すればOK。
docker-compose.ymlは下記のようなコンテナのグラフを記述している。
1 2 3 4 5 6 7 8 9 10 |
nginx --> rails --> mysql | | | | | | | | | - - - - - - - - - - - | | | v datastore |
nginxコンテナが起点でrails,mysqlへと連なってる。
それから、datastoreコンテナ。これはあらゆるコンテナから参照されてる。
datastoreは永続化しておきたいデータを抱える専用コンテナ。
例えばmysqlのデータを抱えたりする
datastoreコンテナのおかげでテストデータ入のmysqlやnginxで配信する静的ファイルをサッと切り替えたりできる。
datastore
永続化したいデータを抱えるのが役目なので特別なコマンドを実行する必要はない。
ちなみにDockerfileはこんな感じ。参考元とほぼ一緒だが。。
1 2 3 4 5 6 |
FROM busybox:latest VOLUME /data VOLUME /var/lib/mysql VOLUME /usr/src/app/public VOLUME /usr/src/app/log |
mysql
mysqlコンテナは下記の通り。
1 2 3 4 5 6 7 8 |
mysql: image: mysql:5.6.26 environment: MYSQL_ROOT_PASSWORD: 'pass' ports: - '3306:3306' volumes_from: - datastore |
コンテナ起動時のコマンドはMySQLのDockerfileに記載されてる。
volumes_fromでdatastoreを関連付けてるので、このmysqlコンテナを潰してもdatastoreコンテナでデータが永続化されてる。
rails
railsのコンテナは下記の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
rails: build: . command: supervisord -c supervisord_development.conf ports: - '3000:3000' environment: RAILS_ENV: development_container MYSQL_ROOT_PASSWORD: 'pass' DATABASE_URL: mysql2://root:pass@mysql:3306 SECRET_KEY_BASE: a3e4c7edb9c5c5e8ac8a4c0ca2505289c616c2f625f3028bb3bd4fad9c5062304bd44f3dfa847e7d90ff7aeb15c18561095ec6d3ed9428b777c644c6f4969145 volumes_from: - datastore volumes: - ./:/usr/src/app links: - mysql |
基本的には参考元と同じ。
違いは2点。
1つは、コンテナ起動時にsupervisorを起動していること。
これはunicorn以外に実行したいプロセスが存在するからだ。
例えば、delayed jobやclockworkなど。
ちなみにsupervisorの設定はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 |
[supervisord] nodaemon=true [program:rails] command=bundle exec unicorn -E development_container -c config/unicorn.rb [program:worker] command=bin/delayed_job run [program:cron] command=bundle exec clockwork config/clock.rb |
もう1つはvolumesを指定してる点。
これはコンテナ環境上で開発するため。このようにホストにあるRailsアプリのコードをコンテナ上に載せておけば、手元でソースコードを変更するだけでコンテナ内に変更が伝播する。
一応、RailsのDockerfileもはっておく。
参考元のDockerfileとほぼ一緒。
supervisorを使えるように、インストールと設定ファイルをコピーする処理を追加した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
FROM ruby:2.2.3 RUN apt-get update && apt-get install -y nodejs mysql-client supervisor --no-install-recommends && rm -rf /var/lib/apt/lists/* COPY supervisord.conf /etc/ RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY Gemfile /usr/src/app/ COPY Gemfile.lock /usr/src/app/ RUN bundle install -j4 --without development test COPY . /usr/src/app EXPOSE 3000 |
それから、コンテナ上に開発環境を構築するためにRAILS_ENV: development_container
を追加している。
なので別途environmentsファイルを作成したり、database.ymlにdevelop_containerの項目を書き加える必要がある。
nginx
nginxは参考元と一緒。
1 2 3 4 5 6 7 8 |
nginx: build: containers/nginx ports: - '8080:80' volumes_from: - datastore links: - rails |
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とリンクしてるおかげで結果が永続化されてる。
336px
336px
関連記事
- PREV
- 流行してるけど避けた方がいい服
- NEXT
- ファッションに関する疑問に答えてみる