ruby 2.7.0 + Rails 5.2.4 + mysql 5.7.28 でDocker開発環境を構築する備忘録

# 流れ

1. Dockerfileを作成
2. docker-compose.ymlを作成
3. Gemfile,Gemfile.lockを作成
4. イメージ・コンテナの作成
5. Rails初期設定
6. Githubにリモートリポジトリ作成

# ディレクトリ構成

```
application_root/
 - Dockerfile
 - docker-compose.yml
 - Gemfile
 - Gemfile.lock
 - その他Railsアプリケーションファイル群
```

# Dockerfileを作成

application_root下に下記のファイルを作成

```
# イメージのベースラインにRuby2.7.0を指定
FROM ruby:2.7.0
# Railsに必要なパッケージをインストール
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN gem install bundler
# ルートディレクトリを作成
RUN mkdir /app
# 作業ディレクトリを指定
WORKDIR /app
# ローカルのGemfileとGemfile.lockをコピー
COPY ./Gemfile /app/Gemfile
COPY ./Gemfile.lock /app/Gemfile.lock
# Gemのインストール実行
RUN bundle install
# カレントディレクトリの内容をコピー
COPY . .
```

# docker-compose.ymlを作成

同様に下記のファイルを作成。
DBはmysqlで、ローカルにデータストアを設けて永続化している。

```
# docker-compose.ymlフォーマットのバージョン指定
version: '3'
services:
  # Railsコンテナ定義
  web:
    # Dockerfileを使用してイメージをビルド
    build: .
    # ポート3000が来たらrailsサーバーが応答
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    # ローカルのsrcをコンテナにマウント
    volumes:
      - .:/app
    ports:
      - 3000:3000
    # dbコンテナが先に起動するよう設定
    depends_on:
      - mysql
    tty: true
    stdin_open: true
  # MySQLコンテナ定義
  mysql:
    # mysqlを使用してコンテナ作成
    image: mysql:5.7.28
    volumes:
      # データストアからマウント
      - ./tmp/mysql:/var/lib/mysql
    # コンテナ内の環境変数を定義
    environment:
      # mysqlのルートユーザーのパスワード設定
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    restart: always
```

# Gemfile,Gemfile.lockの作成

以下のコマンドでGemfileを作成。

```
bundle init
```

下記のように編集。

```
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails", "~> 5.2.4"
```

Gemfile.lockは空で作成しておく。

```
touch Gemfile.lock
```

# イメージ・コンテナの作成

Railsプロジェクトを作成する。

```
docker-compose run web rails new . --force --database=mysql
```

Dockerイメージを作成する。（で合っているよね？）

```
docker-compose build
```

作成されたイメージを確認できる。
コンテナはまだない。

```
# イメージのリスト
docker image list

# 動作しているコンテナ一覧
docker ps
```

ここまでがうまくいかなかった時は削除してやり直す。

```
docker rm -f [container_id]
docker rmi -f [image_id]
```

いよいよコンテナを立ち上げる。
-dをつけるとデーモン実行できるが、ログを見たいのでそのまま実行。

```
docker-compose up
```

# Rails初期設定

config/database.ymlのpassword, hostを編集する。

```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # docker-compose.ymlに記載したパスワード
  host: mysql # docker-compose.ymlに記載したホスト名
```

コンテナ内に入って、DBを作成する。

```
docker exec -it [container_name] bash
rake db:create
```

下記URLで動作が確認できる。
http://localhost:3000

<img width="557" alt="スクリーンショット 2020-01-18 0.33.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568257/c2e2c805-1b51-c667-ca43-5b3747828404.png">

# Github設定（ついでに）

Githubアカウントは作ってある前提で・・・

まずはSSHキーを作成。もうある場合は不要。
内容をGithubの設定から、SSH keysにアップロードする。

```
ssh-keygen -t rsa
cat .ssh/id_rsa.pub
```

あとはリモートリポジトリのSSHアドレスを設定してPush。

```
# ユーザー名の設定
git config --global user.name [ユーザー名]

# リモートリポジトリの設定
git remote add origin git@github.com:xxxxxxxx/xxxxxxxxx.git

# アプリケーションの初期状態をPush
git add -A
git commit -m "create application"
git push origin master
```