MENU

DockerでNginx+Puma環境の構築(AWS FargateでRails環境をつくる - その2)

こんにちは、虎の穴ラボNSSです。

前回「いまさらDocker入門(AWS FargateでRails環境をつくる - その1)」という記事をご紹介しました。
多くの方に読んでいただいたようで大変嬉しかったです。
今回こそは、Fargateを利用してDockerコンテナをデプロイするところまでを紹介いたします。

...と思ったのですが、デプロイする前の準備がまだまだあったので、
今回は前回同様ローカルマシンで少し違ったRails環境の構築についてご紹介します。

toranoana-lab.hatenablog.com

1. 構築する環境について

その1で構築したRails環境をdevelopmentとし、今回構築する環境をproductionとします。

development

f:id:toranoana-lab:20200813191402p:plain

production

f:id:toranoana-lab:20200813191521p:plain

※実際本番デプロイするときはロードバランサーがありますが、ローカルマシンでの実行の際はありません。

2. Dockerコンテナの作成

以下のようにNginxのディレクトリを作成し、Dockerfileとnginx.confを作成します。

/docker_rails
├── containers
│   └── nginx
│       ├── Dockerfile
│       └── nginx.conf
├── docker-compose.yml
├── Dockerfile
├── Gemfile
└── Gemfile.lock

Dockerfile

containers/nginx配下のDockerfile

FROM nginx:1.18.0

# インクルード用のディレクトリ内を削除
RUN rm -f /etc/nginx/conf.d/*

# Nginxの設定ファイルをコンテナにコピー
ADD nginx.conf /etc/nginx/conf.d/docker_rails.conf

# ビルド完了後にNginxを起動
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

docker_rails直下のDockerfile(前回と同じファイル)

FROM ruby:2.7
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /docker_rails
WORKDIR /docker_rails
COPY Gemfile /docker_rails/Gemfile
COPY Gemfile.lock /docker_rails/Gemfile.lock
RUN bundle install
COPY . /docker_rails
RUN RAILS_ENV=${RAILS_ENV} bundle exec rails assets:precompile
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]

nginx.conf

upstream docker_rails {
  # ソケット通信したいのでpuma.sockを指定
  server unix:///docker_rails/tmp/sockets/puma.sock;
}

server {
  listen 80;
  # ドメインもしくはIPを指定
  server_name localhost#<ロードバランサーのDNS>

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

  # ドキュメントルートの指定
  root /docker_rails/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  keepalive_timeout 5;
  location /healthcheck {
    root   /usr/share/nginx/html;
    empty_gif;
    break;
  }

  location / {
    try_files $uri @docker_rails;
  }



  # リバースプロキシ関連の設定
  location @docker_rails {
    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://docker_rails;
  }
}

docker-compose.prod.yml

docker-compose.ymlとは別に本番用のdocker-compose.prod.ymlを作成します

version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  prod:
    build: .
    volumes:
      - .:/docker_rails
      - public-data:/docker_rails/public
      - tmp-data:/docker_rails/tmp
      - log-data:/docker_rails/log
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: bundle exec puma -C config/puma.rb
  nginx:
    build:
      context: containers/nginx
    volumes:
      - public-data:/docker_rails/public
      - tmp-data:/docker_rails/tmp
    ports:
      - 80:80
    depends_on:
      - prod
volumes:
  mysql-data:
    driver: local
  public-data:
  tmp-data:
  log-data:
  db-data:

前回との違いとして、nginxの設定が追加されています。

  nginx:
    build:
      context: containers/nginx
    volumes:
      - public-data:/docker_rails/public
      - tmp-data:/docker_rails/tmp
    ports:
      - 80:80
    depends_on:
      - prod

serviceswebだった箇所をprodに変えました。 また、コマンドがpumaを実行するコマンドになっています

command: bundle exec puma -C config/puma.rb

またvolumesという設定はコンテナ間でファイルをやりとりするのに利用します。

volumes:
  mysql-data:
    driver: local
  public-data:
  tmp-data:
  log-data:
  db-data:

Railsアプリケーションを修正します。

config/puma.rb

# 以下三行を一番下に追記

app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"
stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true

rootパスを設定

config/routes.rb

Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  root "welcome#index"
  resources :welcome
end

ViewとControllerも用意します。

app/views/welcome/index.html.erb

Hello World

app/controllers/welcome_controller.rb

class WelcomeController < ApplicationController
    def index
    end
end

以下のコマンドを実行します。 -fオプションで参照するファイルを指定できます。

docker-compose -f docker-compose.prod.yml build
docker-compose -f docker-compose.prod.yml up

htt:p//localhostにブラウザからアクセスして確認します。

f:id:toranoana-lab:20200814115948p:plain

まとめ

今回はDockerでNginx+Puma環境の構築についてご紹介しました。
前回と内容が被る点が多く変わり映えしないじゃないかと思うかもしれませんが、
こちらの設定がのちに重要になってきます(主にdocker-compose.prod.ymlの内容)。
次回こそは、AWSにアプリケーションをデプロイしたいと思います。

参考にさせていただいた記事

qiita.com

P.S

「虎の穴ラボ」社員による2回目のオンライン座談会イベントが 8/20(木)19:30〜 開催します!
前回はリモートワークについてでしたが、今回は「オタク企業で働くエンジニアってどうなの?」というテーマとなっています。
yumenosora.connpass.com

また、虎の穴ラボ主催のオンラインLTイベントを 8/26(水)19:30〜 開催します!
今回もフリーテーマとなっており、ITに関連する内容であれば、何でも大歓迎ですので、初心者の方も練習の場としてお気軽にご参加ください! connpassにて参加受付中です!

yumenosora.connpass.com

虎の穴ラボでの開発に少しでも興味を持っていただけた方は、採用説明会やカジュアル面談という場でもっと深くお話しすることもできます。ぜひお気軽に申し込みいただければ幸いです。
カジュアル面談では虎の穴ラボのエンジニアが、開発プロセスの内容であったり、「今期何見ました?」といったオタクトークから業務の話まで何でもお応えします。

カジュアル面談や採用情報はこちらをご確認ください。
yumenosora.co.jp