【AWS】EC2を起動してDockerアプリをdocker-composeで立ち上げてみた


はじめに

ローカルで開発したDockerアプリケーションをEC2にホストしたいと思い、試してみました。

前提条件

手順

  • AWSコンソールでEC2起動(無料枠のものを選択)
  • EC2にログイン(ssh接続)して、Dockerインストール
  • EC2でGithubからリポジトリをクローンする
  • Docker Hubに保存したimageを使ってdocker-composeでコンテナ起動

EC2の起動

インスタンスを起動

AWSコンソールを開き、EC2ページに遷移後、インスタンス起動。

インスタンスの選択

今回はテスト利用なので、Amazon Linux 2の無料利用枠の対象インスタンスを選択しました。

インスタンスタイプの選択

無料利用枠の対象のt2.microを選択。
1vCPU, 2.5GHz, 1GiBメモリ, EBSのみ

セキュリティーグループの選択

セキュリティグループのインバウンドルールは、SSHだけでなくHTTP/HTTPS接続も可能にするために追加しました。

キーペア作成とダウンロード(既存指定)

SSH接続用に、任意の名前をつけてキーペアの作成、ダウンロードします。
~/.ssh/に保存するのが一般的。
※キーをダウンロードした時に、拡張子が.cerでしたが、それをローカルで.pemに変えたらSSH接続問題なくできました。

EC2にログイン(ssh接続)して、Dockerインストール

EC2ログイン〜Dockerインストールの確認

$ ssh -i ~/.ssh/ec2_rsa.pem \
  [email protected] # EC2ログイン
$ sudo yum update -y # とりあえずインストールされているパッケージ更新
$ sudo amazon-linux-extras install docker # Dockerインストール
$ sudo usermod -a -G docker ec2-user # sudoを使用せずにDockerコマンドを実行できるように、ec2-userをdocker グループに追加
$ exit # 設定反映のために一回ログアウト
$ ssh -i ~/.ssh/ec2_rsa.pem \
  [email protected] # EC2に再度ログイン
$ docker version
# インストールしたDocker versionが表示される

ポイントとしては、dockerをインストールしてec2-userに権限を付与した後、一度EC2からログアウトして、再度SSH接続すると、dockerコマンドが普通に使えるようになるので、インストール後コマンドを実行しても使えない場合は試してください。

$ sudo service docker start # Docker起動コマンド

docker-composeのインストールと確認

$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` \
 -o /usr/local/bin/docker-compose # 公式より:https://docs.docker.jp/compose/install.html#linux
$ sudo chmod +x /usr/local/bin/docker-compose # ec2-userにも実行権限を付与
$ docker-compose --version
docker-compose version 1.16.1, build sdfeb43

コマンドが使えない場合はEC2に再ログインしてみてください

これで、Docker自体を起動した後に、docker-compose upでドッカーコンテナの起動ができるようになりました。

EC2でGithubと連携

EC2でGithubからリポジトリをssh接続してクローンできるようにします。

EC2上で、Github SSH接続用キーペアの生成

$ cd ~/.ssh
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):ec2_github_rsa #<=名前を任意指定
Enter passphrase (empty for no passphrase):[enter]
Enter same passphrase again:[enter]
$ chmod 600 ~/.ssh/ec2_github_rsa # 秘密鍵 600は 所有者は読取&書込OK, グループ, その他は禁止
$ chmod 644 ~/.ssh/ec2_github_rsa.pub # 公開鍵 644は 所有者は読取&書込OK, グループ, その他は読取OK

passphraseを指定する場合は、任意のものを指定してください。指定しない場合はenter

EC2上で、~/.ssh/configの作成or編集

下記を記述。

Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/ec2_github_rsa
  User git

EC2上で生成した公開鍵をGitHubのSSHキー設定に登録

Key Settings - Githubに遷移して、[New SSH Key]から作成。

ec2_github_rsa.pubの内容を全てコピーして貼り付ける。
秘密鍵をコピペしないように注意。

EC2上で、GithubとのSSH接続確認

接続成功しました!!

$ ssh -T [email protected]
Hi UserName! You've successfully authenticated, but GitHub does not provide shell access.

EC2内で任意のディレクトリに移動後、リポジトリのクローン

$ cd ~/src
$ git clone [email protected]:username/repository_name.git

こちらも参考にご確認ください。

docker-compose upでコンテナ起動

Docker Hubに保存したimageを使ってdocker-composeでコンテナ起動します。
※事前に、ローカルでbuildしたDockerfileのイメージを自分のDocker HubのリポジトリにPushしておいてください。
Docker for Desktopを使うとGUIでイメージの管理やpush等が可能

$ cd ~/src/repository_name # docker-compose.ymlのあるディレクトリに移動
$ docker-compose up -d # デーモン化してDockerアプリケーション起動

使用するdocker-composeファイルの中身

最小限の記述です。自分用にカスタマイズしてください。
Compose ファイル・リファレンス - Docker

docker-compose.yml
version: "3.3" # 2021/05/21時点で自分の環境的に3.3じゃないとエラーが出た

services:
  web:
    image: dockerhub-rep-username/image-name:tag-name # 自分のDocker Hubのリポジトリのイメージを使用
    container_name: web
    ports:
      - 80:80
    networks:
      - ec2_docker

  api:
    image: dockerhub-rep-username/image-name:tag-name # 自分のDocker Hubのリポジトリのイメージを使用
    command: >
      # some run app command
    container_name: api
    ports:
      - 8080:8080
    networks:
      - ec2_docker

  db:
    image: mysql:5.7 # Docker Hub公式のmysqlのイメージを使用
    container_name: db
    ports:
      - 3306:3306
    networks:
      - ec2_docker

networks:
  services:
    external:
      name: ec2_docker

サイトにアクセスしてみる

開発合宿用にアプリを作成していたもんで、お恥ずかしい、、、w

無事、接続できましたね✨

インスタンスも起動中🔛

ハマったポイント

  • EC2ec2-userに権限を付与しようと思って、sudo chown -R ec2-userとやってしまったら、rootユーザーの権限も変更されてしまい、sudo実行ができなくなってしまった。
    • インスタンス作成時にはrootのパスワード設定がされていないもんだから、rootでログインやsudo実行ができなくなってしまい、試行錯誤したが、結局インスタンスの破棄をする羽目になった。(ファイル転送した2.5時間が無駄に汗)
      • 権限をいじったり、ユーザーを追加削除する際は気を付けるべきと学んだ。
  • git cloneDocker Hubのイメージを使わずに、macローカルと同じファイルを転送してやれば動くのではと思い、ファイル転送したら2.5時間くらいかかり、時間を果てしなく無駄にした。git cloneだったら数秒だった
    • ファイル転送し終わった後も、ファイルの欠損だったり、環境が違うから動かない等で苦しめられた。
    • ファイル転送後に、 EC2Amazon Linux上で、Dockerfileのイメージをbuildしようとしたら、EC2の容量やメモリ不足で、buildができず、詰んだ。
      • 無料枠用のスペックが小さいEC2のホストだったので、遭遇したツラみ
  • 最初セキュリティーグループを作成した時に、http/https接続の許可を忘れた。
  • インスタンスを廃棄したときに、EBSボリュームのスナップショットを取っておけばよかった。
    • インスタンスのターミネーション時にEBSボリュームも一緒に削除される。
  • githubとの接続確認の際に、rootユーザーでssh -T [email protected]したら、キーペアの問題が発生した。
    • ec2-userで作成した鍵だったので、ec2-userの状態で、ssh -T [email protected]しないとダメだった。
  • macローカルとEC2で接続用に作成したキーペアの拡張子が.cerで、.pemにするにはどうしたら、、、って悩んだが、ローカルでファイルの拡張子を.pemに変えたら普通に使えた。
  • dockerをインストールした後に、コマンド使ってみたら反映されてなくて、ログアウトしてから試したら問題なくコマンド使えるようになった。

など、また思いついたら追記します。

まとめ

これまでさくらのレンタルサーバーなどで、wordpressを使ったサイトなどのホストはしたことがあり、イメージがつかめてたんですが、
EC2を使って、その中にアプリケーションをホストして、アプリを起動したままにしたらインターネット上からアクセスできるようになるというのが、初めての経験だったから、なかなか難しく、ただ、ものすごく勉強になったし、イメージの作成や、プロビジョニングとかその辺の知見も深掘りできました。

せっかくdockerのアプリを起動させたので、今度はECSを使ってDockerアプリケーションを起動させていなと思います。
(今回は、ECSをキャッチアップする時間がなかったので)

以上、ありがとうございました!!