LoginSignup
23
32

More than 3 years have passed since last update.

EC2上でRailsアプリケーションにDockerを導入する(Rails、Nginx、RDS)

Last updated at Posted at 2020-06-15

※ DockerでRailsの環境構築をする方法に関して新しい記事を書いたので、下記を参照ください。 (2021/1/21更新)


前回の記事(開発環境において既存のRailsアプリにDockerを導入する方法(Rails、nginx、mysql))で開発環境において、既存のRailsアプリケーションにDockerを導入する方法をご紹介しました。
今回は本番環境においてDockerを導入する方法をご紹介します。

前提

開発環境ではRails、nginx、MySQLをコンテナ化しましたが、本番環境においてデータベースであるMySQLをコンテナ化するのは、あまり良くありません。(消える可能性があるため)
そのため、今回はAWSのサービスであるRDSのMySQLを利用します。

環境

  • Mac OS
  • Ruby2.5.7
  • Rails5.2.4
  • mysql5.7
  • nginx1.15.8

事前準備

ファイル構成

myapp
  |-- app
  |-- bin
  |-- config
  |-- containers
    |-- nginx
      |-- Dockerfile
      |-- nginx.conf
  |-- db
  |-- lib
  |-- log
  |-- public
  |-- storage
  |-- test
  |-- tmp
  |-- vendor
  |-- .env
  |-- .gitignore
  |-- config.ru
  |-- docker-compose.yml
  |-- Dockerfile
  |-- Gemfile
  |-- Gemfile.lock
  |-- package.json
  |-- Rakefile
  |-- README.md

開発環境でDockerを導入しているRailsアプリケーションのファイルを一部編集して、本番環境用とします。
myappはご自身のアプリケーション名に変えてください。

Gemfileを編集

環境変数を利用するので、環境変数を管理するgemをインストールします。

  • Gemfileに以下を追加。
Gemfile
gem 'dotenv-rails'

bundle installを実行。

$ bundle install

.envを作成

.envを作成し、データベース情報の環境変数にする設定を行います。
""内はご自身のものを記載してください。

.env
DB_USERNAME="RDSの接続ユーザ名"
DB_PASSWORD="RDSのパスワード"
DB_HOST="RDSのエンドポイント名"
DB_DATABASE="myapp"

.gitignoreを編集

.gitignoreに記述することでgithubによる管理がされなくなります。

  • .gitignoreに以下を追加。
.gitignore
/.env

database.ymlを編集

  • production:配下を編集。
database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch('MYSQL_USER') { 'root' } %>
  password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %>
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: <%= ENV['DB_DATABASE'] %>
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  host: <%= ENV['DB_HOST'] %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>

docker-compose.ymlの編集

  • db:配下をコメントアウト。
  • app: の command: に -e production を追加。
  • volumes: の mysql-data: をコメントアウト。
docker-compose.yml
version: '3'
services:
  # db:
    # image: mysql:5.7
    # environment:
      # MYSQL_ROOT_PASSWORD: password
      # MYSQL_USER: user
      # MYSQL_PASSWORD: 1234
      # MYSQL_DATABASE: myapp_db
    # volumes:
      # - mysql-data:/var/lib/mysql
    # ports:
      # - "4306:3306"

  app:
    build: .
    command: bundle exec puma -C config/puma.rb -e production
    volumes:
      - .:/myapp
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
      - log-data:/myapp/log

  web:
    build:
      context: containers/nginx
    volumes:
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
    ports:
      - 80:80

volumes:
  # mysql-data:
  public-data:
  tmp-data:
  log-data:

nginx.confを編集

  • nginx.confのserver_nameを編集。

server_name の xx.xxx.xxx.x にはご自身のIPアドレスもしくはドメインを発行している場合はドメイン名を記入してください。

nginx.conf
upstream myapp {
  server unix:///myapp/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name xx.xxx.xxx.x;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  root /myapp/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @myapp;
  keepalive_timeout 5;

  location @myapp {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://myapp;
  }
}

これでファイルの作成、編集は完了です。

githubへpush

$ git add -A
$ git commit -m "deploy setting"
$ git push origin HEAD

Railsアプリケーションをデプロイする

EC2にログインします。
xx.xxx.xxx.x はご自身のパブリックIPを記入してください。

$ ssh -i ~/.ssh/practice-aws.pem ec2-user@52.193.217.0

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

githubからアプリケーションを取得

[ec2-user@ip-xxx-xx-xx-xxx ~]$ cd
[ec2-user@ip-xxx-xx-xx-xxx ~]$ git clone GitHubのリポジトリのURL

githubで管理されないファイルをアップロード

master.key と .env は.gitignoreに記載していたため、githubにアップロードされていません。
そのため、EC2に直接アップロードします。

EC2からログアウトし、アプリケーションのconfigディレクトリに移動し、以下のコマンドを実行。
my.pemはご自身のキーペアを記入してください。
xx.xxx.xxx.x はご自身のパブリックIPを記入してください。

$ scp -i ~/.ssh/my.pem master.key ec2-user@xx.xx.xxx.xxx:myapp/config
master.key                                          100%   32     1.2KB/s   00:00   

アプリケーション直下に移動し、以下のコマンドを実行。

$ scp -i ~/.ssh/my.pem .env ec2-user@xx.xx.xxx.xxx:myapp/
.env                                                100%  134     5.7KB/s   00:00

イメージのビルド

イメージのビルドをします。

[ec2-user@ip-xxx-xx-xx-xxx]$ cd myapp
[ec2-user@ip-xxx-xx-xx-xxx myapp]$ docker-compose build

サーバー起動前の準備

[ec2-user@ip-xxx-xx-xx-xxx myapp]$ docker-compose run app rails assets:precompile RAILS_ENV=production

コンテナの起動

EC2にログインし、コンテナを起動。

[ec2-user@ip-xxx-xx-xx-xxx myapp]$ docker-compose up -d

データベースの作成、マイグレーションファイルの読み込み

最後に以下のコマンドでデータベースの作成とマイグレーションファイルの読み込みをします。

[ec2-user@ip-xxx-xx-xx-xxx myapp]$ docker-compose exec app rails db:create db:migrate RAILS_ENV=production

パブリックIPにアクセスして、正しく表示されればOKです。

参考記事

23
32
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
23
32