AWSにRails6のDockerの環境を構築
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