LoginSignup
5
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-05

修正履歴

  • 見出し表記の誤り修正(20190811)

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

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

ディレクトリ構造

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

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

構築ファイル準備(リバースプロキシ)

docker-compose.yml

phpMyAdminのサブドメインは、乱数を入れてアクセスしづらくしておくと良いと思います。

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

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

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

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

Gemfile.lock

ファイルの中身は空でOK

app1/src/Gemfile.lock

構築コマンド

使用するdocker networkを作成

$ docker network create --driver bridge share

スケルトンアプリ作成

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

database.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イメージのビルド

$ docker-compose build

コンテナ立ち上げ

$ docker-compose up -d

MySQLにRailsのDBを作成

$ docker-compose run app1 rails db:create

DNS設定

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

ホスト名:app1.example.com
TYPE:CNAME
VALUE:example.com

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

インストール後の作業

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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1