Amazon Linux 2のコンテナイメージをDocke上で動かす

## はじめに
[Amazon Linux AMIのサポート期間終了が2020年12月31日まで](https://aws.amazon.com/jp/blogs/news/update-on-amazon-linux-ami-end-of-life/)と発表されました。今後はAmazon Linux 2での運用が必要となってきます。そこで、dockerhubで配布されている[Amazon Linux 2のコンテナイメージ](https://hub.docker.com/_/amazonlinux/)を使って検証環境を構築してみます。

## 参考情報

- [Dockerfile を書くベスト・プラクティス — Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html)
- [Dockerfileの書き方, 利用する命令, 作成手順 - わくわくBank](https://www.wakuwakubank.com/posts/270-docker-build-image/)
- [効率的に安全な Dockerfile を作るには - Qiita](https://qiita.com/pottava/items/452bf80e334bc1fee69a)
- [tfenvでTerraformのバージョン管理をする - Qiita](https://qiita.com/kamatama_41/items/ba59a070d8389aab7694)
- [Dockerで開発環境を仮想化する - Qiita](https://qiita.com/Riliumph/items/3b09e0804d7a04dff85b)
- [Dockerの基本操作メモ - Qiita](https://qiita.com/zaburo/items/97819a1910859a6f2ef9)
- [増え続ける Dockerfile 用の GitHub Repository をなんとかする - Qiita](https://qiita.com/suecharo/items/a5e0cd3fe6d31443c536)
- [Docker上のAmazonLinux2でLaravelの環境構築 - Qiita](https://qiita.com/skyknsk/items/c9710bb952a854a32cfd)
- [rbenv を利用した Ruby 環境の構築 \| Developers.IO](https://dev.classmethod.jp/articles/build-ruby-environment-by-rbenv/)
- [[TIPS] AWS CLIの「v1」と「v2」を共存させて使う方法 (Dockerコンテナ編) \| Developers.IO](https://dev.classmethod.jp/articles/aws-cli-v1-and-v2-coexistence-docker/)
- [Amazon LinuxをDockerで動かす \| ハックノート](https://hacknote.jp/archives/26819/)
- [GitHubとDockerHubを連携してDockerイメージを自動ビルドする方法(Automated Build) \| Casual Developers Note](https://casualdevelopers.com/tech-tips/automated-build-for-dockerhub/)
- [bash - Dockerコンテナにログインしても.bash_profileで設定している環境変数が反映されない - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/22379/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%A6%E3%82%82-bash-profile%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84)


## Dockerfile & コンテナイメージ 成果物
作成したDockerfileとコンテナイメージはそれぞれ以下にあります。
- https://github.com/revsystem/Dockerfiles/tree/master/AmazonLinux2
- https://hub.docker.com/r/revsystem/amzn2

## 試した環境

```shell-session
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.4
BuildVersion:	19E287
```

```shell-session
$ docker --version
Docker version 19.03.8, build afacb8b
```

作成したDockerfileのビルドやコンテナ実行はMac OS上で行いました。
[dockerhubのコンテナイメージの説明](https://hub.docker.com/_/amazonlinux/)にこのように書かれているので、他の環境でも動作すると思います。

> Where can I run Amazon Linux container images?
>
> You can run Amazon Linux container images in any Docker based environment. Examples include, your laptop, in AWS EC2 instances, and ECS clusters.

## Amazon Linux 2 on Docker にインストールするアプリケーション

Dockerfile内の環境変数でバージョン指定をしています。
Dockerfileを作成した時点の最新版を指定しています。コンテナを作って壊してを繰り返す使い方でなければコンテナ実行後にrbenvやpyenvを実行して必要なバージョンをインストールすることもできます。

- xpanes:4.1.1
- rbenv
- Ruby:2.7.1
- pyenv
- Python:3.8.2
- tfenv
- Terraform:0.12.24
- Ansible:2.9.7
- aws-cli:v2

Dockerfileは https://github.com/revsystem/Dockerfiles/tree/master/AmazonLinux2 に置いています。

## Dockerイメージのビルドとコンテナ実行

Dockerfileを手元でビルドする場合。

### Dockerイメージのビルド

```shell
git clone https://github.com/revsystem/Dockerfiles.git
cd Dockerfiles/AmazonLinux2
docker image build -t amzn2-awscliv2 .
```

### コンテナ実行

```shell-session
docker container run -it amzn2-awscliv2 /bin/bash --login
```

### ローカル環境のディレクトリをコンテナ上にマッピングする
`~/.ssh`や`~/.aws`をコンテナにマッピングする場合。

```shell-session
docker container run -it -v ~/.aws:/home/ec2-user/.aws -v ~/.ssh:/home/ec2-user/.ssh -v $(pwd):/home/ec2-user/aws amzn2-awscliv2 /bin/bash --login
```


## dockerhub上のイメージを使ってコンテナ実行

手元でビルドするとPythonやRubyのビルドに時間がかかるため、そのまま使うだけであればこちらのほうが手軽です。

```shell-session
docker container run -it revsystem/amzn2 /bin/bash --login
```

## Linuxユーザーとsudo
コンテナを実行すると ec2-user というユーザでログインします。 root 権限が必要な場合は sudo コマンドが使えます。ec2-userのパスワードは`ec2-user`です。 


```shell-session
[ec2-user@59716cc68639 ~]$ sudo su -

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for ec2-user: 
-bash-4.2# 
```