カタカタブログ sierで働くitエンジニアがカタカタした記録を残す技術ブログ。java, oracle database, linuxが中心です。たまに数学やデータ分析なども。
rails 5.2 + postgresqlアプリをdockerで起動してみる
はじめに

かなり久しぶりのブログ記事。最近はdockerなどコンテナを触り始めており、いろいろ検証している。
今回はrails 5.2(6.0もすでに出ているが、、手順はさほど変わりないはず)とpostgres dbをつないだアプリをrailsもdbも両方ともdockerコンテナ上で起動させてみる。

人気爆発衝撃特価  MAX30A出力:セミプロDIY店ファースト24V仕様安定化電源 連続使用容量:30A 直流安定化電源 日動工業 DPS-A3024H ライスタ 可変) マサダ製作所(爪付油圧ジャッキ·オイルジャッキ)·ジェットタガネ ナックアクリルカーブミラー·ステンレスカーブミラー·消火器 (AC90~130V⇒DC10~30V

なお環境はwindows 10上のdocker for windowsを入れて、wsl(ubuntu)からコマンドラインで操作している。
そのあたりもvscodeのremote wsl機能でコードもターミナルもかなり快適に使えるようになったきた(が、このあたりは本題ではないので割愛する)。
またrubyやrails環境も構築済みとする。

環境情報は以下。

$ docker -v
docker version 19.03.4, build 9013bf5
$ docker-compose -v
docker-compose version 1.24.1, build 4667896b
$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
$ rails -v
rails 5.2.3
railsのサンプルアプリ作成

まずはrailsのサンプルアプリを作成する。今回はコンテナ上で動くrailsアプリがコンテナ上で動くpostgresqlに接続し、dbアプリとして正常に動作確認ができればよいので、
簡単にscaffoldで構築することにする。

何はともあれrails newする。--database=postgresqlオプションも明示する。

$ rails new rails-sample-app --database=postgresql

db処理を持つ画面機能をscaffoldで実装する。

$ rails generate scaffold user name:string email:string

さて、ここまででアプリはできているが、コンテナで扱う上でdb情報などは環境変数から渡せるようにしておくと便利。

なのでdatabase.ymlを修正し環境変数で各種パラメータ値を取得するように修正する。

人気爆発衝撃特価  MAX30A出力:セミプロDIY店ファースト24V仕様安定化電源 連続使用容量:30A 直流安定化電源 日動工業 DPS-A3024H ライスタ 可変) マサダ製作所(爪付油圧ジャッキ·オイルジャッキ)·ジェットタガネ ナックアクリルカーブミラー·ステンレスカーブミラー·消火器 (AC90~130V⇒DC10~30V


 >  > 人気爆発衝撃特価  MAX30A出力:セミプロDIY店ファースト24V仕様安定化電源 連続使用容量:30A 直流安定化電源 日動工業 DPS-A3024H ライスタ 可変) マサダ製作所(爪付油圧ジャッキ·オイルジャッキ)·ジェットタガネ ナックアクリルカーブミラー·ステンレスカーブミラー·消火器 (AC90~130V⇒DC10~30V
default: &default adapter: postgresql encoding: unicode pool: %= env.fetch("rails_max_threads") { 5 } % host: %= env['db_host'] % port: %= env['db_port'] % database: %= env['db_name'] % username: %= env['db_user'] % password: %= env['db_password'] % development: : *default test: : *default database: rails-sample-app_test production: : *default database: rails-sample-app_production username: rails-sample-app password: %= env['rails-sample-app_database_password'] %

ここまででrailsアプリとしては完成とする(簡単!)

dockerコンテナイメージ作成

続いてアプリ部分ができたのでインフラとしてのコンテナ部分を作る。
dockerfileとdocker-compose.ymlの二つのファイルを作成する必要があるが、いずれもrailsアプリプロジェクトのトップに直接配置する。

まずdockerfileを作成する。
railsサーバやpostgressql(pgのgem)を導入するのに必要なパッケージのインストールをappフォルダをコンテナ内に配置してbundle installするのみ。
これだけだとdbマイグレーションとかはできないのが、そのあたりはコンテナでrailsとdbの両方が起動した後に別途実行する必要がある。

dockerfile

人気爆発衝撃特価  MAX30A出力:セミプロDIY店ファースト24V仕様安定化電源 連続使用容量:30A 直流安定化電源 日動工業 DPS-A3024H ライスタ 可変) マサダ製作所(爪付油圧ジャッキ·オイルジャッキ)·ジェットタガネ ナックアクリルカーブミラー·ステンレスカーブミラー·消火器 (AC90~130V⇒DC10~30V

人気爆発衝撃特価  MAX30A出力:セミプロDIY店ファースト24V仕様安定化電源 連続使用容量:30A 直流安定化電源 日動工業 DPS-A3024H ライスタ 可変) マサダ製作所(爪付油圧ジャッキ·オイルジャッキ)·ジェットタガネ ナックアクリルカーブミラー·ステンレスカーブミラー·消火器 (AC90~130V⇒DC10~30V





TR046-No.0143

直流安定化電源装置(AC100V?DC24V) 24V仕様

AC100VでDC24Vのアマチュア無線機、業務用無線機、カーステレオ等が使用できます。

商品の特徴

●カーナビやカーステレオ等DC24Vのカー用品を自宅で使用したい場合に!
●DC24Vのカー用品を展示会や店舗でディスプレイする時に!


製品仕様
  • 入力:AC90V~130V
  • 出力:DC10V~30V(可変)
  • 容量/連続:30A
  • 容量/最大:30A
  • 仕様:屋内型 定電流型保護回路内蔵
  • サイズ:W216×D360×H136mm
  • 重量:5.0kg


from ruby:2.6.5 run apt-get update -qq && apt-get install -y \ build-essential \ libpq-dev \ nodejs \ yarn \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* run mkdir /app workdir /app copy . /app run bundle install cmd ["rails", "server", "-b", "0.0.0.0"]

dockerfileができたので、さっそくビルドしてみる。tag名をrails-app:0.1と明示的に指定しておく。
--no-cacheはコンテナイメージのキャッシュによりファイルを変更しても反映されない場合などに付与するとよい。

$ docker build --no-cache -t rails-app:0.1 .
sending build context to docker daemon24.37mb
step 1/7 : from ruby:2.6.5
--- d98e4013532b
(・・・略)
removing intermediate container 2e7649a0d45a
--- 6bc8d871d10d
step 7/7 : cmd ["rails", "server", "-b", "0.0.0.0"]
--- running in 7c3be452473b
removing intermediate container 7c3be452473b
--- ba7f6c2f08eb
successfully built ba7f6c2f08eb
successfully tagged rails-app:0.1
security warning: you are building a docker image from windows against a non-windows docker host. all files and directories added to build context will have '-rwxr-xr-x' permissions. it is
recommended to double check and reset permissions for sensitive files and directories.

途中でaptやgemのインストールなどが正常に行われていることがログから確認できる。エラーなく終了すればコンテナビルドはok。

docker-compose.yml作成

さて、先ほど作ったrailsアプリのコンテナイメージとpostgressqlのコンテナイメージを両方起動するdocker-compose.ymlを作成する。
railsのdb接続情報もpostgresの各種db情報も環境変数で渡せるようになっているので、以下のようにそれぞれに同じ値を設定する。

version: '3'
services:
  db:
    image: postgres:11.5
    environment:
      - postgres_port=5432
      - postgres_db=sample
      - postgres_user=sample-user
      人気爆発衝撃特価  MAX30A出力:セミプロDIY店ファースト24V仕様安定化電源 連続使用容量:30A 直流安定化電源 日動工業 DPS-A3024H ライスタ 可変) マサダ製作所(爪付油圧ジャッキ·オイルジャッキ)·ジェットタガネ ナックアクリルカーブミラー·ステンレスカーブミラー·消火器 (AC90~130V⇒DC10~30V- postgres_password=password
    ports:
      - 5432:5432
  web:
    image: rails-app:0.1
    ports:
      

人気爆発衝撃特価  MAX30A出力:セミプロDIY店ファースト24V仕様安定化電源 連続使用容量:30A 直流安定化電源 日動工業 DPS-A3024H ライスタ 可変) マサダ製作所(爪付油圧ジャッキ·オイルジャッキ)·ジェットタガネ ナックアクリルカーブミラー·ステンレスカーブミラー·消火器 (AC90~130V⇒DC10~30V

人気爆発衝撃特価  MAX30A出力:セミプロDIY店ファースト24V仕様安定化電源 連続使用容量:30A 直流安定化電源 日動工業 DPS-A3024H ライスタ 可変) マサダ製作所(爪付油圧ジャッキ·オイルジャッキ)·ジェットタガネ ナックアクリルカーブミラー·ステンレスカーブミラー·消火器 (AC90~130V⇒DC10~30V

- 3000:3000 depends_on: - db links: - db environment: - db_host=db - db_port=5432 - db_name=sample - db_user=sample-user - db_password=password
コンテナ起動

コンテナの定義ができたので、さっそく起動してみる。

$ docker-compose up -d
creating network "rails-sample-app_default" with the default driver
creating rails-sample-app_db_1 ... done
creating rails-sample-app_web_1 ... done

正常に起動できたよう。コンテナの状態も確認しておく。

$ docker-compose ps
         name                       command              state           ports
---------------------------------------------------------------------------------------
rails-sample-app_db_1    docker-entrypoint.sh postgres   up      0.0.0.0:5432-5432/tcp
rails-sample-app_web_1   rails server -b 0.0.0.0         up      0.0.0.0:3000-3000/tcp

ちゃんとdbとwebの二つのコンテナが起動していることが分かる。

ここで後回しにしていたdbマイグレーションを忘れずに実行しておく。

$ docker-compose run web rails db:migrate
starting rails-sample-app_db_1 ... done
== 20191110115438 createusers: migrating ======================================
-- create_table(:users)
   - 0.0123s
== 20191110115438 createusers: migrated (0.0127s) =============================

テーブルも問題なく作成できたよう。これでアプリとdbの両方の作成が完了した。

動作確認

最後に動作確認をしておく。

まずrailsのトップページにアクセスする。
http://localhost:3000

f:id:osn_th:20191110214035p:plain

railsサーバのトップ画面が見れることが確認できた。

続いて、db機能をテストしてみる。以下のurlにアクセスしscaffoldで実装されたcrud機能を動かしてみる。
http://localhost:3000/users

f:id:osn_th:20191110214031p:plain

new userでのデータ登録や一覧表示等のdb操作が正常にできることが確認できた!
コンテナ上でrailsアプリが正しくコンテナ上のpostgresqlと連携し、機能していることが確認できた。

まとめ

railsアプリをwebサーバ・dbサーバともにdockerによりコンテナ化し正常に動作するところまで確認できた。
これでローカル開発するときもrailsやpostgresのインストールをせずともアプリ開発ができるし、コンテナをawsのecsなどにデプロイすれば本番環境としても利用できる。
コンテナ化によりアプリ開発や本番運用がますます簡単になってきているので、いろいろ検証して利用を進めていきたい。
(もちろんこれはごく簡単な例なので、本格運用する場合はもっといろいろと検証ポイントはあるが)

以上!

スターをつけました

引用をストックしました

引用するにはまずログインしてください

引用をストックできませんでした。再度お試しください

限定公開記事のため引用できません。

読者です 読者をやめる 読者になる 読者になる