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 AWSとGitHubを連携
以下コマンドを実行
ターミナル
# 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と入力したら、AWSとgithubの認証が成立
ターミナル
[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/sockets
とmkdir 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 //パスワードを入力してログイン