修正履歴
- 見出し表記の誤り修正(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
この時点でブラウザで表示確認できるようになっていると思います。
インストール後の作業
私の記事ですが、下記の手順もまとめましたので、参考にしていただければ幸いです。