AWSにDockerの環境にRails6を構築

AWS docker ruby 環境構築


Dockerを使う理由

dockerの環境を構築する前にdockerを構築するメリットについて説明します。

dockerを使う事で、環境構築をコード化できます。また、構築したデータをイメージ化して共有する事ができます。
構築したデータを共有する事によって

  • 開発環境
  • テスト環境
  • 本番環境
  • 予備環境

等複数用意する際に、相違なく環境構築するのに漏れが発生したりしますが、「コンテナ」と言うイメージを扱う事で簡単同じ環境を構築する事ができます。

実際にAWSにDockerをインスールするには下記の通りになります。

Dockerとは

そもそもDockerとはどんな物かと言うと、linux上で動作するソフトで、linuxの仮想環境をコンテナと言う単位で作成できます。
virtualboxやvm ware等ジャンルは一緒なのですが、CPUやメモリをシミュレートする事なく、仮想化するので動作が軽快です。

AWSにDockerをインストール

公式ドキュメントを元にインストールを進めます。

https://docs.docker.com/compose/rails/

AWSにDockerをインストールするにはOSはLinux環境が必要になります。
なのでEC2にはLinux環境を作成しましょう。
作成が終わったらSSHでログインして下記コマンドを実行してインストールします。

sudo yum install -y docker

次に下記コマンドでdockerを起動

sudo service docker start

ec2-userをdockerグループに入れる。グループに入れる事でdockerコマンドが利用可能になります。

sudo usermod -a -G docker ec2-user

dockerコマンドが利用できるかと、docker起動確認の為にinfoコマンドを使い確認します。

sudo docker info

Docker-composeのインストール

Dockerは1コンテナ1プロセスと言う事が原則ですので、コンテナ複数繋げるのにdocker-composeを使います。
下記のコマンドでdocker-composeをインストールします。

sudo curl -L https://github.com/docker/compose/releases/download/1.23.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

下記コマンドで実行できるようにアクセス権を変更

sudo chmod +x /usr/local/bin/docker-compose

下記コマンドで実行できるかを確認する。

docker-compose --version

上記で行ったアクセス権の変更を反映させる為、exitで一回ログアウトします。

コンテナの構築

今回は下記の構成でインストールを行います。

.
├── Gemfile
├── Gemfile.lock
├── Dockerfile
├── entrypoint.sh
└── docker-compose.yml

構築方法は2通りあります。

  • Dockerfileを作成し環境を構築
  • docker pull でRails等のイメージを取得してコンテナを作成する方法

今回はDockerfileを作成しつつ環境を構築する方法で進めます。

DockerFileを作成する

Dockerファイルは、環境構築の手順をコード化したファイルになります。

Dockerファイルを作成する前に、まずはrubyコンテナを作成するディレクトリを作成します。

作成したフォルダに移動し下記Dockerfileを作成します。

vi 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 \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /myapp

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

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"]

[FROM] 使用するイメージとバージョン
[RUN] コマンドの実行。
[WORKDIR] 作業ディレクトリを設定
[COPY] ローカルのファイルをコンテナへコピー
[ENTRYPOINT] 一番最初に実行するコマンド(.shのシェルを実行する)
[EXPOSE] コンテナがリッスンするport番号
[CMD] イメージ内部のソフトウェア実行(ここではRailsを指す)

Gemfile

Dockerfileで呼び出されるGemfileを作成します。
インストールフォルダに移動してviで作成します。
今回自分の環境では/var/www/配下に作成します。

source "https://rubygems.org"
gem "rails", "6.0.2"

Gemfile.lockは空で作成する。

touch Gemfile.lock

entrypoint.shを作成する

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

docker-compose.yml

dbはpostgresの最新のイメージを取得し構築します。
image:postres:latestの部分がその指定になります。

webは先ほど記述したDockerfileを元に作成します。

version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
    restart: always
    user: root

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

dockerを実行します。
run webの指定でdocker-compose.yml に記載されているserviceのwebを実行しています。

AWSの無料プランで下記コマンドを実行するとメモリ不足で止まる可能性があります。

docker-compose run web rails new . --force --no-deps --database=postgresql

一度下記コマンドでSWAPメモリを作成してから実行する事をお勧めします。

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1

コンテナをビルド しますので、パーミッションを変更してからビルドします。

sudo chown -R $USER:$USER .
docker-compose build

データベースのコネクションの設定

config/database.ymlを編集してwebからdbに接続できるようにします。
今回はAWSで作成しているので、インバウンドルールに指定のポートを開放する記述を追加します。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: root
  password: root
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test
docker-compose up -d
docker-compose run web rake db:create

dockerのコンテナを操作する

今回はwebコンテナを操作するので下記コマンドになる。

docker-compose exec web bash