AWS EC2インスタンスにdockerとdocker-composeをインストールして簡単なWEBサービスを立ち上げる方法

# 経緯
docker中毒の私は最近何をするにもdockerを使ってしまいます。ということで今回はAWS EC2にdockerとdocker-composeをインストールしていきたいと思います。
dockerの動作確認がてらnginxコンテナでWEBサービスを起動してアクセスしてみます。

# 前提条件
- AWSのアカウントが作成してあること
- SSHクライアントが用意してあること（今回はCygwinを使いました。）

# やること
1. AWS EC2インスタンスの新規作成
1. dockerインストール
1. docker-compose インストール
1. dockerでnginxコンテナを立ち上げる

# 1. AWS EC2インスタンスの新規作成
早速やっていきましょう。

## AWSコンソールで[EC2]を押下する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/345cea4d-1c6f-d5e1-8b8c-ed804bc6352e.png)

## [インスタンスの作成]を押下する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/623828ca-41f0-ff10-cd96-0a85d5ecc053.png)

## AMIを選択する
今回は、Amazon Linuxの次世代バージョンであるAmazon Linux 2を選択しました。
「無料利用枠の対象」と記載のあるAMIは"750 時間/月" 無料で使用できます。24時間*31日=744時間なので、無料というわけですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/5058ae3c-9d63-3cc3-6d5c-1743aa75f41a.png)

## インスタンスタイプを選択する
特に高スペックを要求しないので、ここも無料利用枠のついているやつを選択しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/ee01b1ee-0382-d0f4-2f99-ead80ae2e627.png)

## インスタンスを作成する
内容に問題ないかを確認して、作成を押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/446e5932-9b8a-ea65-5547-9a3f405e8ffa.png)

## キーペアを作成してダウンロードする
EC2インスタンスにSSHログインするために鍵ペアを自動で作成してくれます。
キーペア名に任意の名前を付けて、「キーペアのダウンロード」を押下します。
秘密鍵がダウンロードされますので、その後、「インスタンスの作成」が活性化するので押下します。
**<font color="Red">※秘密鍵が盗まれるとEC2に対して何でもできてしまうので、取り扱いには十分に注意してください。絶対に第三者に教えないでください。</font>**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/9765afdc-4806-ebec-a60b-b9714e75f2b0.png)

## 作成完了
インスタンスの表示を押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/1c6785de-1c23-e7a6-ca59-494d8a04b3ea.png)

ステータスチェックが「初期化しています」から切り替われば作成は完了です。
SSH接続するために、パブリックDNS(IPv4)に表示されている「ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com」を控えておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/f28a580b-01bc-e360-9d28-2c79544f8f15.png)

## EC2インスタンスにログイン
ホームディレクトリにダウンロードした秘密鍵をコピーした後、パーミッションを400に設定します。

```shell
$ cp /path/to/sample.pem ~/.ssh/
$ chmod 400 ~/.ssh/sample.pem
```

以下コマンドで接続できれば成功です。ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.comは上記で控えた自分のEC2インスタンスのものに置き換えてください。

```shell
$ ssh -i ~/.ssh/sample.pem ec2-user@ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
Last login: Tue Aug 21 01:19:50 2018 from XXXXXXXXXXXXXXXXXXXXXXXX

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-XX-XX-XX-XX ~]$
```

# 2. dokcerインストール
以下コマンドを実行します。

```shell
$ sudo yum install -y docker          # dockerのインストール
$ sudo service docker start           # dockerの起動
$ sudo usermod -a -G docker ec2-user  # ec2-userをdockerグループに入れる。これでec2-userがdockerコマンドを実行できる
$ sudo docker info                    # dockerの起動確認
```
上手く起動しない場合は一度ログアウトして再ログインすると上手くいくと思います。

# 3. docker-composeインストール
**(2022-11-24: インストールの方法が変わっていたので最新の手順に修正)**
以下コマンドを実行します。
docker-composeの最新バージョンは以下のサイトから確認できますので、コマンドの``2.4.1``のところを適宜書き換えて実行してください。
https://matsuand.github.io/docs.docker.jp.onthefly/compose/install/

```shell
$ sudo mkdir -p /usr/local/lib/docker/cli-plugins
$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
$ docker compose version
```
上手く起動しない場合は一度ログアウトして再ログインすると上手くいくと思います。

# 4. dockerでnginxコンテナを立ち上げる

## 作業用のディレクトリ作成

```shell
$ cd
$ mkdir docker-nginx-test
```

ディレクトリ配下は以下のような構成にしました

```
docker-nginx-test
  - html
      - index.html # hogeとでも書いておく
  - Dockerfile
```

```docker:Dockerfile
FROM nginx
COPY ./html /usr/share/nginx/html
```

## コンテナ起動

```shell
$ cd docker-nginx-test
$ docker build -t docker-nginx-test .
$ docker run -d --rm -p 80:80 -v $(pwd)/html:/usr/share/nginx/html --name docker-nginx-test docker-nginx-test
```

プロセスを確認して起動しているか確認します。

```shell
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
947526fd9aac        docker-nginx-test   "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         0.0.0.0:80->80/tcp   docker-nginx-test
```
無事起動しています。

## セキュリティグループで80番ポートを開放する
httpでアクセスするため80番ポートを開放します。AWSコンソールから行います。

### セキュリティグループの[launch-wizard-X]を押下する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/ef201359-1ee5-a7c9-d5de-5e5ee2ba9d6e.png)

### インバウンドの[編集]を押下する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/aec6dccf-cfb5-c557-6b93-e5083c619a59.png)

### TCP 80番ポートを開放する
タイプ「HTTP」、ソース「0.0.0.0/0」を入力して保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/4857eb42-5e17-323a-1f9c-6ab6a1c9c346.png)

## ブラウザでアクセスする
ブラウザでアクセスしてページが表示されれば成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/273110/1bf796b3-31f8-f093-7846-fe451346b51d.png)