はじめに
Dockerの勉強会に参加して少し、Dockerについて勉強しました。
せっかく勉強したので、Raisの開発環境をDockerで構築してみました(._.)
まだまだわからないことだらけですが、とりあえず開発環境をDockerコンテナ上に構築・実行確認とherokuへのデプロイまで確認出来たので、手順をメモしてみますφ(._.)
※ちなみに下記ページを大変参考にさせて頂きました・・・!
DockerFile等を含んだ形でgithubにサンプルソースをpushしているので、ソースだけ見たい方はこちらへ。
環境
私の環境
ちなみに私のローカル環境は、こんな感じです!
構成 | 内容 |
---|---|
ローカル | Mac OSX Yosemite |
Docker | 17.12.0-ce-mac47 |
Docker
Dockerとは
DockerとはRubyやPosgresといったミドルウェアをDocker上にコンテナとして構築出来るものです。
似たような技術として仮想環境がありますが、下記のようなメリットがあり、最近注目されている技術です。
- 環境をテキストベースのファイルとして配布出来る。環境の再現性。
- スクラップ&ビルドが容易
- DockerがOSレイヤーをラップして、各OSの差分を吸収してくれるためOS環境を気にしなくても良い。
上記説明ではわからない部分が多いと思うので、下記のような記事で確認頂ければと思います。
Dockerのインストール
MACだったらDockerのインストールはとても簡単です!
下記のインストールページにアクセスし、Get Docker
を押すと安定版のインストーラーが入手出来るので、あとは手順に従えばOKです。
https://store.docker.com/editions/community/docker-ce-desktop-mac
最後にターミナルからインストールを確認して下記のようになれば、OKです。
$ docker --version Docker version 17.12.0-ce, build c97c6d6
Dockerを使ってRails開発環境を構築する
目指す環境構成
今回目指す環境はこんな感じで、ベーシックなRailsの環境を目指して行きます!
構成 | 内容 |
---|---|
Ruby | 2.4.0 |
Rails | 5.1.4 |
DB | PostgreSQL 10.1 |
本番環境 | Heroku |
Docker上にRailsが動作するコンテナとPosgreSQLが動作するコンテナの立てて、ローカルで動作確認を行いHerokuへデプロイしてみたいと思います。
イメージはこんな感じです。
手順
Railsプロジェクトの作成
まずは、普通にローカルでRailsプロジェクトを作成します。
rails new docker_sample_app
Docker関連ファイルの配置
その後、DockerFile
及びdocker-compose.yml
をrootディレクトリ配下に配置します。
DockerFile
はコンテナの定義ファイルで、docker-conpose.yml
は、DockerFile
の関連を定義したファイルです。
DockerFile
でWeb用のコンテナを既存のrubyのimageをベースに定義しています。DB用のコンテナはdocker-compose.yml
で公式のpostgres
のイメージを使ってそのまま構築しています。
DockerFile
# ベースイメージの設定 FROM ruby:2.4.0 # 環境変数の設定 ENV APP_ROOT /docker_sample_app # コンテナ上で関連パッケージのインストール RUN apt-get update -qq && apt-get install -y nodejs build-essential libpq-dev postgresql-client # コンテナ上でフォルダを作成 RUN mkdir $APP_ROOT # 作業ディレクトの設定 WORKDIR $APP_ROOT # Gemfileをコンテナ上にコピー ADD Gemfile ${APP_ROOT}/Gemfile ADD Gemfile.lock ${APP_ROOT}/Gemfile.lock # コンテナ上でbundle install RUN bundle install # rootフォルダ配下をコンテナ上にコピー ADD . $APP_ROOT
docker-compose.yml
version: '2' services: # DB用のコンテナ db: image: postgres ports: - "5432" # データをホスト側で保持し、関連付けることで永続化 volumes: - ./data/postgres:/var/lib/postgresql/data # Web用のコンテナ web: # DockerFileの配置フォルダ build: . # コンテナ起動時に実行されるコマンド command: bundle exec rails s -p 3000 -b 0.0.0.0 ports: - "3000:3000" # dbとwebを関連付け links: - db # ローカルのルートディレクトリをコンテナ上の作業ディレクトリと関連付け volumes: - ./:/docker_sample_app # 環境変数 environment: DATABASE_USER: postgres DATABASE_PASSWORD: DATABASE_PORT: 5432 DATABASE_HOST: db
DB関連ファイルの修正
DBをPosgreSQLに変更
これは、過去の記事にまとめているので参照して頂ければと思います。
DB設定をDB用のコンテナに合わせて変更
DockerコンテナでDBを構築するにあたって、DBの参照の仕方等を少し工夫する必要があるためにdatabase.yml
ファイルを編集します。
default: &default adapter: postgresql encoding: unicode timeout: 5000 # docker-composeで指定した環境変数の読み込み port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %> host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %> username: <%= ENV.fetch('DATABASE_USER') { 'root' } %> password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %> pool: <%= ENV.fetch('RAILS_MAX_THREADS') { 5 } %> development: <<: *default database: docker_sample_app_development test: <<: *default database: docker_sample_app_test production: <<: *default database: docker_sample_app_production username: docker_sample_app password: <%= ENV['appname_DATABASE_PASSWORD'] %>
Dockerコンテナの起動
では実際にDocker上に環境を構築していきます。 流れとしては、下記のような形になります。 1. Web用のコンテナとDB用のコンテナを構築 2. DBを作成 3. マイグレーションの実行 4. Dockerコンテナの起動
# Dockerイメージの取得等の初期化処理 $ docker-compose build # DBの作成とマイグレーションの実行 $ docker-compose run web rake db:create $ docker-compose run web rake db:migrate # Web、DB用のコンテナの起動 $ docker-compose up
localhost:3000
にブラウザから接続するとRailsのスタートページが見えました!
Herokuにデプロイ
最後にHerokuにデプロイしてみようと思います。 HerokuへのデプロイはDockerを使わない環境と特に変わりません。
今回は、scaffold
でUser
モデルを作成後、Herokuへデプロイしてみました。
$ rails generate scaffold user name:string age:integer $ git add -A $ git commit -m "scaffold user model" $ git push heroku master $ heroku run db:migrate $ heroku open
無事にherokuにデプロイできました!
https://rails-docker-sample-app.herokuapp.com/users
おわりに
まだまだDockerのことは理解出来ていない部分が多いですが、なんとかネットの情報を元に環境と立ててデプロイすることが出来ましたφ(..)
Dockerだと失敗しても潰して、もう一回ということが簡単に出来るので、仮想環境の構築よりもストレスは大分少ないんじゃないかなぁと思います…!
Dockerは色々書籍も出ているので、色々と勉強してみようと思いました。 オススメの書籍等あれば、教えてくださいφ(..)