LoginSignup
0
0

More than 1 year has passed since last update.

Docker基礎 Docker-composeを使ってRails環境構築

Posted at

Docker-composeを使って初めてRails+PostgreSQLの環境構築したときのメモです。

Dockerfile作成

ターミナル
$ mkdir product-register && cd product-register
$ touch Dockerfile Gemfile Gemfile.lock
Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
  build-essential \
  libpq-dev \
  nodejs \
  postgresql-client \
  yarn
WORKDIR /product-register
COPY Gemfile Gemfile.lock /product-register/
RUN bundle install
Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5.2'

GemfileをDockerfileでCOPYすることでRailsをインストールします。

$ docker build .

Docker-composeを使う

どんな時に使うのか?

  • $ docker runのコマンドが長くなる時

今回もしこのまま$ docker runをするならコマンドは、以下のように長くなるので使用。

$ docker run -it -v ~/Desktop/product-register:/product-register -p 3000:3000 <image> bash
  • 複数のコンテナをまとめて起動する時。

今回はRailsのコンテナとPostgreのコンテナを使うので使用。

docker-compose.ymlの使い方と書き方

  • docker-compose.ymlというファイルを作りそこに$ docker run時のオプションコマンドなどを書いて設定しておく。
docker-compose.ymlの雰囲気
今からDocker compose書くよ宣言
service1:
  service1のパラメータ
  service1のパラメータ
service2
  service2のパラメータ
  service2のパラメータ
  • kye:valueの組み合わせで書く。
  • value部分が複数ある場合は-を使ってリスト形式
  • docker-composeでのパスの指定は相対パスで書く。

docker-compose.yml

docker-compose.yml
version: "3"

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - ".:/product-register"
    tty: true
    stdin_open: true
  • build$ docker build .
  • ports-pオプション
  • volumes-vオプション
  • ttystdin_open-itオプション

Docker composeコマンド一覧

  • $ docker build <build context>
$ docker-compose build
  • $ docker run <image>
$ docker-compose up
$ docker-compose up --build

upはimageが作られてない場合、buildも一緒にする。
Dockerfileを更新した場合は-- buildをつけることでbuildしてからrunしてくれるのでimageも更新される。

  • $ docker ps
$ docker-compose ps
  • $ docker exec <container> <command>
$ docker-compose exec <service> <command>
  • 便利コマンド
$ docker-compose down

コンテナをstopしてから消してくれる。

実際に起動してみる。
バックグラウンドで動かしたいので-dオプションをつける

$ docker-compose up -d 
$ docker-compose ps
NAME                     COMMAND             SERVICE             STATUS              PORTS
product-register-web-1   "irb"               web                 running             0.0.0.0:3000->3000/tcp

起動が確認できたので実際にコンテナに入ってみる。

$ docker-compose exec web bash
root@8d2ab4ae68c0:/product-register#

入れてたらOK

Railsセットアップ

コンテナ内で実行します。

$ rails new . --force --database=postgresql --skip-bundle

--forceは全て上書き --databaseでデータベースの指定 --skipbundle installをskipしています。
bundle installをskipしている理由は、Dockerfileの最後にRUNbundle installを指定していて、Gemfileが更新されたらその都度コンテナを抜けて再度コンテナをbuildするのでbundle installをわざわざここでする必要はないからです。

コンテナを抜けコンテナを削除します。

$ exit
$ docker-compose down

再度buildして確認します。

$ docker-compose up --build -d 
$ docker-compose ps
NAME                     COMMAND             SERVICE             STATUS              PORTS
product-register-web-1   "irb"               web                 running             0.0.0.0:3000->3000/tcp

buildされていたらOKです。

docker-compose.ymlのDB部分を追記する

DBはDB用のコンテナを作るのでDBの設定を記述していきます。

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  user: postgres
  port: 5432
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

hostで指定した名前(今回はdb)がdocker-compose.ymlのservice部分になります。

docker-compose.yml
version: "3"

volumes:
  db-data:

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - ".:/product-register"
    environment:
      - "DATABASE_PASSWORD=postgres"
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

  db:
    image: postgres
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=postgres"

volumesの部分はデータベースで保存したものをhost側で保管するための記述。
environmentは環境変数。
depends_onで指定したものができてから$ docker runするという記述。
linksはここで指定したものがwebからアクセスできるようにするための記述。

RailsとDBをセットアップ

Docker composeでそれぞれのコンテナを立ち上げRailsのコンテナに入ります。

$ docker-compose up -d
$ docker-compose exec web bash 

入ったコンテナ内でDBを作成します。

$ rails db:create
$ rails s -b 0.0.0.0

サーバーを立ち上げていつものRailsの最初の画面が出たら完成。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0