Dockerでrails開発環境構築(リバースプロキシで複数アプリを構築)

# 修正履歴
- 見出し表記の誤り修正(20190811)

DockerでRails開発環境構築します。
下記を想定して作業。

- リバースプロキシで複数アプリを構築できるようにする
- phpMyAdminでMySQLを操作できるようにする
- SSL通信できるようにする




# ディレクトリ構造
「proxy」：リバースプロキシ、phpMyAdmin、MySQLのディレクトリ
「app1」：アプリケーションのディレクトリ
※「app1」、「app2」・・・と立ち上げるアプリケーション数に応じてディレクトリを作る。


```terminal
├─proxy
│  └─docker-compose.yml
│
├─app1
│  ├─src
│  │  ├─Gemfile
│  │  └─Gemfile.lock
│  ├─Dockerfile
│  └─docker-compose.yml
│
├─app2
```




# 構築ファイル準備(リバースプロキシ)
## docker-compose.yml
phpMyAdminのサブドメインは、乱数を入れてアクセスしづらくしておくと良いと思います。

```yml:proxy/docker-compose.yml
version: "2"
services:
  proxy:
    image: jwilder/nginx-proxy
    container_name: proxy
    privileged: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./docker-compose.d/certs:/etc/nginx/certs:ro
      - ./docker-compose.d/htpasswd:/etc/nginx/htpasswd
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "10"

  mysql:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
        - ./db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'MySQLルートユーザーパスワード'
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "10"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      VIRTUAL_HOST: 'phpmyadmink4sw4xNVCby2.example.com'
      VIRTUAL_PORT: 80
      LETSENCRYPT_HOST: 'phpmyadmink4sw4xNVCby2.example.com'
      LETSENCRYPT_EMAIL: 'phpmyadmin@example.com'
      LETSENCRYPT_TEST: "false"
      PMA_ARBITRARY: 1
      PMA_HOST: 'mysql'
    volumes:
      - /sessions
      - ./php.ini:/etc/php7/conf.d/php.ini:ro
    depends_on:
      - mysql
    links:
      - mysql
    restart: always

  letsencrypt-nginx:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-nginx
    privileged: true
    volumes:
      - ./docker-compose.d/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - proxy
    restart: always

networks:
  default:
    external:
      name: shared
```






# 構築ファイル準備(Rails)

## Dockerfile

```Dockerfile:app1/Dockerfile
FROM ruby:2.5.3
ENV LANG C.UTF-8

RUN apt-get update -qq && \
    apt-get install -y build-essential \
            libpq-dev \
            nodejs

RUN mkdir /app
RUN mkdir /app/src

ENV APP_ROOT /app/src
WORKDIR $APP_ROOT

ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install

ADD . $APP_ROOT
```



## docker-compose.yml

```yml:app1/docker-compose.yml
version: '2'

services:
  app1:
    build: .
    container_name: 'app1'
    command: bundle exec rails s -p 80 -b '0.0.0.0'
    volumes:
      - ./src:/app/src
    environment:
      VIRTUAL_HOST: 'app1.issei-dev.work'
      VIRTUAL_PORT: 80
      LETSENCRYPT_HOST: 'app1.example.com'
      LETSENCRYPT_EMAIL: 'app1@example.com'
      LETSENCRYPT_TEST: "false"
      APP_DATABASE_HOST: 'mysql'
      APP_DATABASE_USER: 'app1'
      APP_DATABASE_PASSWORD: 'MySQLのapp1ユーザーパスワード'
    external_links:
      - mysql
    expose:
      - 80
    restart: always


networks:
  default:
    external:
      name: shared
```



## Gemfile

```Gemfile:app1/src/Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.2'
```



## Gemfile.lock
ファイルの中身は空でOK

```Gemfile.lock:app1/src/Gemfile.lock

```







# 構築コマンド
## 使用するdocker networkを作成

```terminal
$ docker network create --driver bridge share
```

## スケルトンアプリ作成

```terminal
$ docker-compose run app1 rails new . --force --database=mysql --skip-bundle
```

## database.ymlを修正

```yml:app1/src/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: 使用するMySQLのユーザー名
  password: 上記ユーザー名のパスワード
  host: mysql
```

## Dockerfileイメージのビルド

```terminal
$ docker-compose build
```

## コンテナ立ち上げ

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

## MySQLにRailsのDBを作成

```terminal
$ docker-compose run app1 rails db:create
```







# DNS設定

```
ホスト名：example.com
TYPE：A
VALUE：IPアドレス

ホスト名：app1.example.com
TYPE：CNAME
VALUE：example.com
```


この時点でブラウザで表示確認できるようになっていると思います。



# インストール後の作業

私の記事ですが、下記の手順もまとめましたので、参考にしていただければ幸いです。

* [【devise】メール認証のサインアップ・イン・アウト機能](https://qiita.com/jung_issei/items/a3bb837cfdedda7b5d85)