#はじめに
ローカルで開発したDockerアプリケーションをEC2にホストしたいと思い、試してみました。
#前提条件
- AWSアカウントを持っている
- Docker Hubのアカウントを持っている
- Githubを持っていて、ソースをアップ済み
#手順
- 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 \
ec2-user@ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com # 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 \
ec2-user@ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com # 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 git@github.com
Hi UserName! You've successfully authenticated, but GitHub does not provide shell access.
##EC2内で任意のディレクトリに移動後、リポジトリのクローン
$ cd ~/src
$ git clone git@github.com: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
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
#ハマったポイント
-
EC2
のec2-user
に権限を付与しようと思って、sudo chown -R ec2-user
とやってしまったら、root
ユーザーの権限も変更されてしまい、sudo
実行ができなくなってしまった。- インスタンス作成時には
root
のパスワード設定がされていないもんだから、root
でログインやsudo
実行ができなくなってしまい、試行錯誤したが、結局インスタンスの破棄をする羽目になった。(ファイル転送した2.5時間が無駄に汗)- 権限をいじったり、ユーザーを追加削除する際は気を付けるべきと学んだ。
- インスタンス作成時には
-
git clone
やDocker Hub
のイメージを使わずに、macローカルと同じファイルを転送してやれば動くのではと思い、ファイル転送したら2.5時間くらいかかり、時間を果てしなく無駄にした。git cloneだったら数秒だった
。- ファイル転送し終わった後も、ファイルの欠損だったり、環境が違うから動かない等で苦しめられた。
- ファイル転送後に、
EC2
のAmazon Linux
上で、Dockerfile
のイメージをbuild
しようとしたら、EC2
の容量やメモリ不足で、build
ができず、詰んだ。- 無料枠用のスペックが小さいEC2のホストだったので、遭遇したツラみ
- 最初セキュリティーグループを作成した時に、
http/https
接続の許可を忘れた。 - インスタンスを廃棄したときに、
EBS
ボリュームのスナップショットを取っておけばよかった。- インスタンスのターミネーション時にEBSボリュームも一緒に削除される。
-
github
との接続確認の際に、root
ユーザーでssh -T git@github.com
したら、キーペアの問題が発生した。-
ec2-user
で作成した鍵だったので、ec2-user
の状態で、ssh -T git@github.com
しないとダメだった。
-
- macローカルとEC2で接続用に作成したキーペアの拡張子が
.cer
で、.pem
にするにはどうしたら、、、って悩んだが、ローカルでファイルの拡張子を.pem
に変えたら普通に使えた。 -
docker
をインストールした後に、コマンド使ってみたら反映されてなくて、ログアウトしてから試したら問題なくコマンド使えるようになった。
など、また思いついたら追記します。
#まとめ
これまでさくらのレンタルサーバーなどで、wordpressを使ったサイトなどのホストはしたことがあり、イメージがつかめてたんですが、
EC2
を使って、その中にアプリケーションをホストして、アプリを起動したままにしたらインターネット上からアクセスできるようになるというのが、初めての経験だったから、なかなか難しく、ただ、ものすごく勉強になったし、イメージの作成や、プロビジョニングとかその辺の知見も深掘りできました。
せっかくdocker
のアプリを起動させたので、今度はECS
を使ってDocker
アプリケーションを起動させていなと思います。
(今回は、ECSをキャッチアップする時間がなかったので)
以上、ありがとうございました!!