こんにちは、虎の穴ラボNSSです。
前回「いまさらDocker入門(AWS FargateでRails環境をつくる - その1)」という記事をご紹介しました。
多くの方に読んでいただいたようで大変嬉しかったです。
今回こそは、Fargateを利用してDockerコンテナをデプロイするところまでを紹介いたします。
...と思ったのですが、デプロイする前の準備がまだまだあったので、
今回は前回同様ローカルマシンで少し違ったRails環境の構築についてご紹介します。
1. 構築する環境について
その1で構築したRails環境をdevelopmentとし、今回構築する環境をproductionとします。
development
production
※実際本番デプロイするときはロードバランサーがありますが、ローカルマシンでの実行の際はありません。
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
services
のweb
だった箇所を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にブラウザからアクセスして確認します。
まとめ
今回はDockerでNginx+Puma環境の構築についてご紹介しました。
前回と内容が被る点が多く変わり映えしないじゃないかと思うかもしれませんが、
こちらの設定がのちに重要になってきます(主にdocker-compose.prod.ymlの内容)。
次回こそは、AWSにアプリケーションをデプロイしたいと思います。
参考にさせていただいた記事
P.S
「虎の穴ラボ」社員による2回目のオンライン座談会イベントが 8/20(木)19:30〜 開催します!
前回はリモートワークについてでしたが、今回は「オタク企業で働くエンジニアってどうなの?」というテーマとなっています。
yumenosora.connpass.com
また、虎の穴ラボ主催のオンラインLTイベントを 8/26(水)19:30〜 開催します!
今回もフリーテーマとなっており、ITに関連する内容であれば、何でも大歓迎ですので、初心者の方も練習の場としてお気軽にご参加ください!
connpassにて参加受付中です!
虎の穴ラボでの開発に少しでも興味を持っていただけた方は、採用説明会やカジュアル面談という場でもっと深くお話しすることもできます。ぜひお気軽に申し込みいただければ幸いです。
カジュアル面談では虎の穴ラボのエンジニアが、開発プロセスの内容であったり、「今期何見ました?」といったオタクトークから業務の話まで何でもお応えします。
カジュアル面談や採用情報はこちらをご確認ください。
yumenosora.co.jp