DockerでYay! 〜今更聞けないDocker入門編〜


# はじめに
皆さん、おはこんばんちは。
新谷@diffeasyです。

今回は、タイトルの通りDockerを導入、Railsのデフォルトページを表示するまでを書いていこうと思います。

開発/本番環境の構築までは、カバーしていません。

# 今回の環境
* macOS Sierra 10.12.6
* Docker version 17.09.1-ce, build 19e2cf6

# Docker導入
https://www.docker.com/community-edition#/download
↑からご自分のOSにあったモノをダウンロード、インストールしてください。
または、Homebrew Caskでインストールしてください。

``` bash
$ docker -v
Docker version 17.09.1-ce, build 19e2cf6
```

バージョンが出れば導入は完了です。

今回は説明しませんが、Docker Hubでimageを公開することが出来ます。
その場合は、アカウントを作成する必要があります。

# Dockerfile作成
https://docs.docker.com/compose/rails/#define-the-project
↑に、導入手順が載っていますがそのままだと面白くないので、Alpineを使おうと思います。

``` bash
$ mkdir ~/develop/docker-test
$ vi Dockerfile
```

``` Dockerfile
FROM ruby:2.4.3-alpine3.7

RUN apk update \
 && apk add --no-cache --virtual build-dependencies build-base gcc wget git mariadb-dev nodejs tzdata \
 && apk add --no-cache bash \
 && mkdir /myapp

WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install

COPY . /myapp
```

こんな感じになりました。

# 必要なファイルの用意
## Gemfileの作成

``` bash
$ vi Gemfile
```

``` ruby:Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 5.1', '>= 5.1.4'
```

## Gemfile.lockの作成

``` bash
$ touch Gemfile.lock
```

# docker-compose.ymlの作成
``` bash
$ vi docker-compose.yml
```

今回は、DBMSにMariaDBを、ホスト側のポートを4000番にしました。
DBのrootパスワードは適当に。

``` ruby:docker-compose.yml
version: '3'
services:
  db:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "4000:3000"
    depends_on:
      - db
```

# イメージの作成

``` bash
$ docker-compose build
```

# DB接続設定の作成
`password` は、 `docker-compose.yml` の `MYSQL_ROOT_PASSWORD` と同じパスワードにしてください。

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

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
```

# 起動

```
$ docker-compose up
```

# DBの作成

``` bash
$ docker-compose run web rails db:create
Starting dockertest_db_1 ... done
Created database 'myapp_development'
Created database 'myapp_test'
```

# 確認
ブラウザで `localhost:4000` にアクセスしてみてください。
![Yay!](https://qiita-image-store.s3.amazonaws.com/0/221827/3d4976d2-7a95-463b-bcdb-e20dbb30fafe.png "Yay!")
Yay!ページが表示されましたね。

# イメージの確認
今回は、Alpineで構築をしたので、容量を確認してみましょう。

``` bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dockertest_web      latest              870f797d49bd        14 minutes ago      594MB
ruby                2.4.3-alpine3.7     378163876b18        6 days ago          72.4MB
mariadb             latest              b1fe0881b739        10 days ago         398MB
alpine              latest              e21c333399e0        2 weeks ago         4.14MB
```

`dockertest_web` が、ゴール地点でのイメージになります。594MB!
`mariadb` が398MBなので、足して1GBいかないくらいです。にしても、DBMSは大きいですね😓
UbuntuやCentOSで、構築すると `ruby` だけで700MBほどになるので、それなりにスリムになりましたね。
設定を突き詰めれば、もっと軽くなりそうです。
一番下の `alpine` は、驚愕の4.1MB。流石、軽いですね😇

# さいごに
今回は、公式ドキュメントに掲載されいているRailsの環境構築を少しアレンジして入門編としてお送りしました。
今のところ、データの永続化など問題があり、このままでは開発環境に使うことは出来なさそうです。

引き続き、勉強を続けてまずは開発環境でDockerが使える様にしたいと思います。

ここまで読んで頂きありがとうございます！