Amazon Linux 2 でdockerを使ってみる (Apache2.4)

## 概要
EC2インスタンスを起動して、dockerを使えるようにする。

## インスタンス起動
EC2 -> インスタンス -> インスタンスの作成
※ Amazon Linux ２ AMIを選択
※ セキュリティグループは、80ポートと22ポートを解放する。
（22ポートは不要だが学習用なので簡略化のため設定）

## サーバへ接続する
ターミナルを使って起動したEC2インスタンスに接続する。
※ IAMユーザーにてssh接続。
※ アカウントは、多要素認証 (MFA) を設定し、利用しない。

```bash:ターミナル
$ ssh aws

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

https://aws.amazon.com/amazon-linux-2/
Run "sudo yum update" to apply all updates.
```

とりあえず、yumを更新しておく。

```bash:ターミナル
$ sudo yum update -y
```


## Dockerインストール
Amazon Linux Extras リポジトリを使ってインストールします。
下記コマンドにてインストールできる内容を確認する。

```bash:ターミナル
$ amazon-linux-extras list
 ...
 20  docker                   available    \
        [ =17.12.1  =18.03.1  =18.06.1 ]
 ...
```

インストールされる内容を確認してみる。

```bash:ターミナル
$ amazon-linux-extras info docker
docker recommends docker          # yum install docker
```

dockerをインストールする。

```bash:ターミナル
# インストール (最新版を指定してみる)
$ sudo amazon-linux-extras install -y docker=18.06.1

# 起動
$ sudo service docker start
$ sudo systemctl enable docker.service
$ sudo service docker status

# バージョン確認
$ docker -v
Docker version 18.06.1-ce, build ...

# dockerグループに参加する
$ sudo usermod -a -G docker ec2-user
$ cat /etc/group | grep docker
docker:x:993:ec2-user

# 設定を反映するため、sshを再接続する
$ exit
$ ssh aws
```

## Docker-Compose インストール
docker-composeもインストールしておきます。

```bash:ターミナル
# 一時的にrootユーザーになって作業する
$ sudo -i
$ curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ exit

# 通常ユーザーに戻ってバージョン確認してみる
$ docker-compose --version
docker-compose version 1.11.2, build dfed245
```


## コンテナ起動
コンテナを起動して動作確認してみる。

```bash:ターミナル
# Hello Worldを実行してみる
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

# ubuntuを起動してみる
$ docker run --rm -it ubuntu bash
root@***********:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
...
root@***********:/# exit

# イメージ確認
$ docker images
REPOSITORY        TAG               IMAGE ID        CREATED           SIZE
ubuntu            latest            93fd78260bd1    3 weeks ago       86.2MB
hello-world       latest            4ab4c602aa5e    3 months ago      1.84kB

# コンテナ確認
$ docker ps -a
CONTAINER ID      IMAGE             COMMAND         CREATED           STATUS                   PORTS           NAMES
26b515135561      hello-world       "/hello"        4 minutes ago     Exited (0) 3 minutes ago                 amazing_davinci
a89895358ad3      hello-world       "/hello"        5 minutes ago     Exited (0) 5 minutes ago                 kind_zhukovsky
d055b97abbfa      hello-world       "/hello"        5 minutes ag      Exited (0) 5 minutes ago                 sleepy_northcutt

# 不要なコンテナ一括削除
$ docker rm `docker ps -f "status=exited" -q`
26b515135561
a89895358ad3
d055b97abbfa

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

## Apache2.4
webサーバを起動し、80ポートでアクセスできるようにしてみる。

```bash:ターミナル
$ docker run -d --name httpd -p 80:80 httpd:2.4

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
************        httpd:2.4           "httpd-foreground"   3 seconds ago       Up 2 seconds        80/tcp              httpd
```

ブラウザでアクセスしてみる。
起動したインスタンスの「パブリック DNS (IPv4)」に記載されているIPアドレスにアクセス。
※ 今回のIPアドレス： IPv4 パブリック IP 13.113.85.220
![test.png](https://qiita-image-store.s3.amazonaws.com/0/142279/b6a35946-5e04-adc0-7063-afab247c3832.png)
後片付け（コンテナ破棄)

```bash:ターミナル
$ docker rm -f httpd
httpd
```

以上

## まとめ
`docker-compose`などで構成管理して、コマンド一発で起動したり、`Amazon Elastic Container Registry (ECR)`などにアプリコードも含めた`Dockerfile`で構築したdockerイメージを登録して、そこから起動できるようにしたらもっと実践的になりそうですが、ここで書くと読み難くなるので別途記事化したいと思います。

## 参考サイト
- [AWS ドキュメント - Amazon ECS における Docker の基本](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html)
- [docker-hub - library/httpd](https://hub.docker.com/_/httpd/)