AWSにDockerの環境を構築

内容

AWSのEC2にDockerの環境を構築する

手順1 EC2インスタンスssh接続

まずキーを他人に不正利用されないように、自分で読み込みだけ可能な設定にしてから接続
自分には読み込みだけじゃなく全権限を与えたい場合は下記の数字を700にする(キーはむしろ変更したくないので読み込みだけ許可の400がいい)
ターミナル

% chmod 400 キーの名前.pem
% ssh -i キーの名前.pem ec2-user@パブリックIPアドレス

手順2 AWS(EC2)にDockerをインストール

AWSにDockerをインストールするにはOSはLinux環境が必要となる
下記コマンドを実行
ターミナル

# Dockerをインストール
[ec2-user@ip-〜]$ sudo yum install -y docker

# Dockerを起動
[ec2-user@ip-〜]$ sudo service docker start

# ec2-userをdockerグループに入れる事でdockerコマンドが利用可能になる
[ec2-user@ip-〜]$ sudo usermod -a -G docker ec2-user

# 一度exitでログアウトし再度sshでログイン
# dockerコマンドが利用できるか、docker起動確認の為にinfoコマンドを使い確認
[ec2-user@ip-〜]$ docker info

# EC2起動時にDockerを自動で立ち上げる場合は下記コマンド
[ec2-user@ip-〜]$ sudo chkconfig docker on

手順3 Docker-composeのインストール

AWSにもDocker-composeをインストール
ターミナル

# docker-composeをインストール
[ec2-user@ip-〜]$ sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

# 下記コマンドで実行できるようにアクセス権を変更
[ec2-user@ip-〜]$ sudo chmod +x /usr/local/bin/docker-compose

# 下記コマンドで実行できるかを確認
[ec2-user@ip-〜]$ docker-compose --version

手順4 AWSGitHubを連携

以下コマンドを実行
ターミナル

# gitをインストール
[ec2-user@ip-〜]$ sudo yum install -y git

# キーを作成(質問は全てエンター)
# -t 暗号化方式を指定
# -b 暗号化強度を指定
[ec2-user@ip-〜]$ ssh-keygen -t rsa -b 4096

# 作成した公開鍵を表示し、コピー
[ec2-user@ip-〜]$ cat ~/.ssh/id_rsa.pub

こちらのサイトにアクセス
右上の「new SSH key」をクリック
titleを入力し、keyのところに先ほどコピーした文字列を貼り付ける(ssh-rsa~から)
以下コマンドを実行し、途中yesと入力したら、AWSgithubの認証が成立
ターミナル

[ec2-user@ip-〜]$ ssh -T git@github.com

以後、AWSインスタンス側から自身のgithubに対し、pull等ができるようになる

手順5 コンテナの構築

構築方法は以下の2通り
- Dockerfileを作成し環境を構築
- docker pullでRails等のイメージを取得してコンテナを作成する方法
今回はDockerfileを作成しつつ環境を構築する方法で進める
※ここから自分のファイル名をmyappに置き換える

1. Dockerfileの修正

ここはローカル用とAWS用で同じコードを使う
前回作成したファイルの記述から変更
Dockerfile

FROM ruby:2.6.5
# これがないとAWSでyarnが使用できない
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 \
    build-essential \
    libpq-dev \
    nodejs \
    yarn \
    vim
WORKDIR /myapp
ADD Gemfile /run-share/Gemfile
ADD Gemfile.lock /run-share/Gemfile.lock
RUN gem install bundler
RUN bundle install
ADD . /myapp
RUN mkdir -p tmp/sockets
RUN mkdir -p tmp/pids

NginxのDockerfileは変更なし
nginx_docker/Dockerfile

FROM nginx:1.21.3
RUN rm -f /etc/nginx/conf.d/*
ADD nginx.conf /etc/nginx/conf.d/run-share.conf
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

2. database.ymlの修正

下記を追加して、本番環境は環境変数から値を読み込むようにする
database.yml

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

DB_HOSTはRDSのエンドポイント
AWSのRDSダッシュボードのデーターベースをクリックし、一覧から該当のRDSを選択すると確認できる

3. nginx設定ファイルの修正

以下の部分を本番環境用に変更
nginx.conf

server {
  listen 80;
# =========ローカルと本番切り替え===========
  server_name 固定IP;
  # server_name localhost;
# ======================================

4. .envファイルに環境変数を設定

2.の環境変数を設定する

5. docker-compose.ymlの修正

dbコンテナは本番環境ではRDS使用で不要のためコメントアウト(appコンテナのdepends_onもまとめて)
commandのbundle exec pumaに-e production を追記して、本番環境でサーバーを立ち上げる

手順6 githubからclone

再度sshログインして、githubからclone(URLはリポジトリを表示したときのURL)
ターミナル

# ルート直下に移動(homeディレクトリでコンテナを展開するとpumaとnginxの連携でエラーが出る場合がある)
[ec2-user@ip-〜]$ cd /
[ec2-user@ip-〜]$ sudo git clone https://github.com/〇〇〇〇〇〇/〇〇〇〇〇〇
# ディレクトリがあるか確認
[ec2-user@ip-〜]$ ls

手順7 .gitignoreに記載したファイルを転送

現在.gitignoreに記載したファイル(.env master.key)は含まれていないので、ssh通信を用いてローカルからAWSに直接ファイルを転送
ターミナル

# 一旦ログアウトして、ローカルのmyappファイルに移動
[ec2-user@ip-〜]$ exit

# scpコマンドを用いて、AWSに.envを転送
# 権限の関係で一旦、ホームディレクトリに転送
% sudo scp -i ~/.ssh/myapp_key.pem .env ec2-user@固定IP:/home/ec2-user/
% sudo scp -i ~/.ssh/myapp_key.pem config/master.key ec2-user@固定IP:/home/ec2-user

再度sshログインし、ファイルが転送できているか確認
ターミナル

[ec2-user@ip-〜]$ cd
[ec2-user@ip-〜]$ ls -a

ホームディレクトリに移動して.envとmaster.keyが存在することを確認し、.envとmaster.keyを移動させる
ターミナル

[ec2-user@ip-〜]$ sudo mv .env /myapp
[ec2-user@ip-〜]$ sudo mv master.key /myapp/config
[ec2-user@ip-〜]$ ls -a  /myapp/
[ec2-user@ip-〜]$ ls -a  /myapp/config

手順8 コンテナを起動

まずはイメージをビルド
※この時Dockerのサービスが停止していてdockerコマンドが使えなくなっている可能性があるので、その際はsudo service docker startで再度Dockerを起動させる
ターミナル

[ec2-user@ip-〜]$ cd /myapp
[ec2-user@ip-〜]$ docker-compose build

サーバー起動前の準備(プリコンパイル
ターミナル

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

コンテナを起動
※ここでbundler: failed to load command: pumaというエラーが表示され、appサーバーが起動されない場合がある
これが正解かわからないが、mkdir tmp/socketsmkdir tmp/pidsで自分でディレクトリを作成すると解決できた
ターミナル

[ec2-user@ip-〜]$ docker-compose up -d

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

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

RDSのデーターベース確認方法

以下のコマンドで実行
ターミナル

mysql -u RDSのユーザー名 -h RDSのエンドポイント -p
//パスワードを入力してログイン