Docker rails mysqlで環境構築!


5/14追記 railsのバージョンをGemfileで指定する方法を追加しました。

今回はDockerにrails、MySQLの環境構築を行いました。

Dockerはdocker-for-macを使用しています

・Docker version 19.03.8
・ruby version 2.5.3
・rails version 5.2.4.2
・MySQL version 8.0.13

こちらの環境を構築していきます。

1、まずはディレクトリを作成します

今回はDockerディレクトリを作成し
その中にsampleディレクトリを作成しました。

sampleはアプリの名前になります。

こんな感じ↓

% pwd
/Users/hoge/Docker/sample

2、コードエディターを開きます

sampleディレクトリに入り
・Dockerfile
・docker-compose.yml
を作成します。

ターミナル
sample % ls
Dockerfile  docker-compose.yml

こんな感じになってると思います。↑

3、Dockerfileに記述をしていきましょう!

Dockerfile

FROM ruby:2.5.3                           
#rubyのバージョン指定
RUN gem install rails
#gemのインストール
RUN apt-get update && apt-get install -y nodejs mysql-client
#パッケージのアップデート インストール

4、docker-compose.ymlに記述していきましょう!

docker-compose.yml
version: '3'
services:           
  mysql:           #コンテナの名前(なんでもok)
    image: mysql:8.0.13
    command: --default-authentication-plugin=mysql_native_password 
                   #MySQL -v8.0から認証方式が変更されたので、mysql -v5.0に合わせるプラグイン
    volumes:  
      - "./mysql-data:/var/lib/mysql"  
                   #ローカルのmysql-dateにデータを保存する(コンテナが消えてもデータが残る)
    environment:
      MYSQL_ROOT_PASSWORD: root



  app:               #コンテナの名前(なんでもok)
    build: .         #Dockefileを指定
    volumes:         #dockerコンテナ内のファイルをローカルで編集する為の記述
      - ".:/app"
    ports:           #localhost:3000にアクセスすると、コンテナ内の3000ポートにアクセスする
      - "3000:3000"
    tty: true
    depends_on: 
      - mysql        #mysqlコンテナにアクセスする
    working_dir: "/app" #コンテナに入った時に直接appディレクトリに入る



5、Dockerを起動しましょう!

ターミナル
sample % docker-compose up
Creating network "sample_default" with the default driver
Creating sample_mysql_1 ... done
Creating sample_app_1   ... done

こんな感じになっていると思います。
dockerがインストールされていれば、dockerが立ち上がるはずです。
sampleとmysqlのコンテナが作られているのが分かると
思います。

6、コンテナに入っていきましょう!

ターミナルで
(command+T)で別タブを開きましょう。

ターミナル
sample % docker exec -it sample_app_1 /bin/bash
root@*********:/app# pwd
/app

コンテナに入れたら、/appディレクトリに居てるのがわかります。

7、rails newをしていきましょう!

今回は、railsのバージョンを指定したいので、指定できるバージョンを確認しましょう。

ターミナル

root@*********:/app# gem list rails

*** LOCAL GEMS ***

rails (6.0.3)

今回はrails (5.2)系を使用します。
該当するバージョンが無いのでインストールしましょう。

ターミナル

root@*********:/app# gem i -v 5.2.0 rails

インストールが出来たら、確認してみましょう。

ターミナル

root@*********:/app# gem list rails

*** LOCAL GEMS ***

rails (6.0.3, 5.2.0)

インストールが確認出来たと思います。

それでは、バージョンを指定してrails newをして行きましょう!

ターミナル

root@*********:/app# rails _5.2.0_ new .

これで、sampleディレクトリにrailsのファイル類が出来たと思います。

ターミナル
root@*********:/app# ls                
Dockerfile  Gemfile.lock  Rakefile  bin     config.ru  docker-compose.yml  log         package.json  storage  tmp
Gemfile     README.md     app       config  db         lib         mysql-data  public        test     vendor

このままbundle installして行きましょう

ターミナル

root@*********:/app# bundle install

ここまで来れればもう少し!

8、rails serverを立ち上げましょう!

ターミナル

root@*********:/app# rails s -b 0.0.0.0

rails serverが立ち上がれば、いつも通り
localhost:3000
で確認してみましょう!

こうなればOKですね!

8、MySQLの設定をして行きましょう!

まずはGemfileを編集しましょう!
(sqlite3)になっているので,(mysql2)
に書き換えましょう!

Gemfile

gem 'sqlite3' <-削除します
gem 'mysql2'

書き換えたらbundle install

ターミナル

root@*********:/app# bundle install

9、database.ymlを編集しよう!

:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  username: root
  password: root
  host: mysql
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: rails_app_development


test:
  <<: *default
  database: rails_app_test

production:
  <<: *default
  database: rails_app_production


編集が出来れば、DBを作成します!

ターミナル

root@*********:/app# rails db:create

10、mysqlに入って確認してみましょう!

ターミナル

root@*********:/app# mysql -u root -proot -h mysql

MySQL [(none)]> show datebases;

+-----------------------+
| Database              |
+-----------------------+
| information_schema    |
| mysql                 |
| performance_schema    |
| sample_development   |
| sample_test          |
| sys                   |
+-----------------------+

こんな感じになっていればOKです!

お疲れ様でした!
ここからはいつも通り、開発を進めて行けばOKです。

Docker環境構築の方法は色々ありますが。
個人的にはこの方法が理解しやすかったので。
記事にしてみました。

docker hubにimageがあるので
好きな、バージョンを集めて環境構築をしてみて下さい。

間違いなどあれば、指摘していただけると幸いです

追記 railsのバージョンをGemfileで指定する方法

・Dockerfile
・docker-compose.yml(上記と同じ)

を作成し、そのまま

・Gemfile
・Gemfile.lock
を作成します。

Dockerfileを編集

Dockerfile

FROM ruby:2.5.3                         
#rubyのバージョン指定
RUN gem install rails
#gemのインストール
RUN apt-get update && apt-get install -y nodejs mysql-client
#パッケージのアップデート インストール

COPY Gemfile /Gemfile
COPY Gemfile.lock /Gemfile.lock
#ローカルのファイルをコンテナにコピー
RUN bundle install

Gemfileを作成

Gemfile

source 'https://rubygems.org'
gem 'rails', '~> 5.2.0'

Gemfile.lockを作成

Gemfile.lock
#記述は不要

Dockerの起動

ターミナル
sample % docker-compose up

コンテナに入ります

ターミナル
sample % docker exec -it sample_app_1 /bin/bash
root@*********:/app# pwd
/app

rails new

プロジェクトを指定して、rails new

ターミナル
root@*********:/app# bundle exec rails new . 

必要であれば

ターミナル
root@*********:/app# bundle update

ここからは、同じですので。
8、rails serverを立ち上げる所から進めて下さい!

以上です