DockerでRails,MySQLを使ってみる

Dockerとrailsを使って簡単なToDolistを作成してみる

## Railsアプリの作成
まずは、アプリのディレクトリを作成。作成したディレクトリでdockerのimageにrubyを追加する。
rubyのバージョンに関しては[ここ](https://hub.docker.com/_/ruby?tab=tags)から探してください。

```
$ mkdir project_name
$ cd project_name
$ docker pull ruby:バージョン
```
rubyのダウンロードが終わったらアプリを作成する。
"$PWD" , -wのあとは先ほど作成した、ディレクトリの絶対パス。
rubyのバージョンも先ほどインストールしたものを記入。

``` terminal
 docker run --rm -v "$PWD":アプリの絶対パス -w アプリの絶対パス ruby:バージョン bundle init
```
イメージ内にgemを埋め込む為に、Gemfile.lockを生成する。

``` terminal
$ touch Gemfile.lock
```

```Dockerfile
FROM ruby:バージョン

ENV APP_ROOT アプリの絶対パス

WORKDIR $APP_ROOT

RUN printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list
RUN apt-get update && \
    apt-get install -y nodejs \
                       mysql-client \
                       postgresql-client \
                       sqlite3 \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global build.nokogiri --use-system-libraries && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem

COPY . $APP_ROOT

EXPOSE  3000
CMD ["rails", "server", "-b", "0.0.0.0"]
```


| コマンド | 　　　　　　　　　　　　　意味 |
|:--|:--|
| FROM | ベースとなるDockerイメージを指定 |
| ENV | 環境変数を設定 |
| RUN | shellの実行を行う |
| WORKDIR | 起点となるディレクトリを設定　相対パスを使うときに起点になる |
| ADD | ファイル、ディレクトリなどをコンテナの指定されたパスにコピー |

```terminal
docker build -t developer_name/project_name .
```
```
$ docker ps #作成されているか確認
```

## コンテナ管理
まずはdocker-compose.ymlを作成していく。
Dockerfileをdocker-composeで管理する。
今回はバージョン３で作成していく

```docker-compose.yml
version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:アプリの絶対パス
    ports:
      - "3000:3000"

```
作成できたら、再度ビルドする
ビルドした後にコンテナの作成と起動を行う
-dはバックグランド起動を意味する

```terminal
$ docker-compose build
$ docker-compose up -d
```

## データベース設定
sqlite3からmysql2にGemfileを変更。
```Gemfile
gem 'mysql2', 'バージョン'
```

configの設定の変更をする。sqlite3のdatabaseの設定からmysql2の設定に変更。

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  port: 3306
  pool: 5
  timeout: 5000
  url: <%= ENV['DATABASE_URL'] %>
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: ""
  host: db
development:
  <<: *default
  database: データベース名

test:
  <<: *default
  database: データベース名

production:
  <<: *default
  database: データベース名
```
docker-compose.ymlにmysqlの設定をする。
最後のdriverの部分を入れないとエラーが発生する。

```docker-compose
version: '3'
services:
  db:
    image: "mysql:5.5.62"
    environment:
      MYSQL_USER: root
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    ports:
      - '3316:3306'
    volumes:
      - db

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:アプリの絶対パス
    ports:
      - "3000:3000"
    depends_on:
      - db

volumes:
  db:
    driver: local
```
ファイルの編集が終わったら再度ビルドし起動する。

```terminal
$ docker-compose build
$ docker-compose up -d
```
コンテナの起動をやめたい時は、docker-compose downで止まる。
この時点では、まだdetabaseを作成していないのでlocalhost:3000にアクセスしても、エラーがおきている。

```terminal
$ docker-compose run --rm web rake db:create
```

localhost:3000にアクセスし、下記の表示がされていれば終了
![Screen Shot 2019-05-13 at 17.24.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309490/58e42fc8-bb9d-a733-a79a-7ae0993ec16d.png)