Djangoプロジェクトをデプロイするまでの練習　１回目　Docker準備編

# はじめに
「コンテナ時代のWebサービスの作り方　コンテナで動かすWebアプリケーション 著：nasum」を参考にさせていただき、コンテナで動かすWebアプリケーションの公開を目指します。やり始めから色々試行錯誤があったので、自分用メモとして残していこうと思います。
本記事を１回目として、３回目までが色々試行錯誤した部分の準備編で、軌道に乗り始めたら別記事で改めて整理したいと思います。

# ゴール
- DockerコンテナをECSで管理して公開する
- masterブランチへのマージをフックにデプロイを実行する

# 使用する予定のもの
- GitHub　コード管理
- CircleCI　DockerイメージのビルドからECRへのプッシュ、およびデプロイ
- Docker　開発環境及びWebアプリケーションの稼働環境
- Terraform　AWSの構成管理
- AWS関係　EC2、ECR、ECS、RDS、SSM

# 環境の構築
自分のPCはWindowsなので、Dockerのpythonイメージを使用して以降の部分を進める。
ただし、そもそもDockerについて自分の知識の大部分が怪しいので整理する。

## Docker

`docker image build -t dockerdemo:ver1 .`
ビルドコンテキストにあるDockerfileをもとにイメージをビルドする。
-tオプションにより、イメージに名前を付けることができる。
-t dockerdemo:ver1のようにすると、tagがver1のイメージとして管理できる。
これをつけなければ、latestが自動的に付与される。
`docker image ls`
dockerイメージをリスト表示する

使用したDockerfileは下記の通り

```Dockerfile.
FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y \
    vim
RUN mkdir /code
WORKDIR /code
RUN pip install awscli
ADD . /code
RUN wget https://release.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip && \ unzip ./terraform_0.12.24_linux_amd64.zip -d /usr/local/bin/
```

FROM python3.7のイメージを使用
ENV　これがないと、バッファー
RUN　updateとvimをインストール
RUN　/codeフォルダを作り、それを作業フォルダにする
RUN　awscliを使用してAWSのリソースを操作する
ADD　カレントフォルダの内容を/codeフォルダにコピー
RUN　terraformをインストール
RUNコマンド毎にdockerイメージが作成される。コンテナを立ち上げたときにコマンドを実行したい場合はCMDを使用する。
下記のdocker-compose.ymlでcommandを指定すると、CMDに上書きされる。


順番としては、
1. イメージを作成（ビルド）
docker image build .

2. コンテナを起動
docker run -itd --name コンテナ名 --mount type=bind.source"$(pwd)"/bind-test,target=/app イメージ名:タグ

という感じ。

実際にはdocker-compose.ymlを使用する。

```docker-compose.yml
version: '3'
services:
  web:
    build: .
    volumes:
      - .:/code
    tty: true
    stdin_open: true
```
ttyとstdin_openをtrueにしないと、docker runで標準出力の入出力ができない。
volumesで .:/codeを指定し、バインドマウントでカレントフォルダをコンテナの/codeディレクトリへマウントする。

docker-compose up -d
docker exec -it test_web_1 /bin/bash
でコンテナをビルドから起動し、コンテナ上で操作する。

## AWSの下準備
### IAM
Terraformを使ってAWSの環境を構築するにあたり、Terraformを実行するためのIAMを作成する。
TerraformはAWSの構成を管理するものであるが、この実行用のIAMはTerraformによる管理ができないため、手動でWebコンソールから作成する必要がある。

作成した内容は以下の通り。
- プログラムによるアクセスにチェック
- ポリシーはAdministratorAccessをアタッチ
- アクセスキーIDとシークレットアクセスキーは別途控えておく

控えたアクセスキーIDとシークレットアクセスキーは、.aws/credentialsに記入し、
作成したDockerイメージのhomeディレクトリに配置することで、awscliコマンドで自動的にcredential情報を読み込んでくれる。

```$Home.aws/credentials
[default]
aws_access_key_id = アクセスキーID
aws_secret_access_key = シークレットアクセスキー
```


```Dockerfile.
FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y \
    vim
RUN mkdir /code
WORKDIR /code
RUN pip install awscli
ADD . /code
RUN wget https://release.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip && \ unzip ./terraform_0.12.24_linux_amd64.zip -d /usr/local/bin/

# 追記
RUN cp -r .aws ~
```
# 確認
作成したDockerコンテナで、Terraformおよびawsclientが正しくインストールされているか確認する。

下記のコマンドで実行中のコンテナへ接続する。
`docker exec -it test_web_1 /bin/bash`
この時は、testフォルダから`docker-compose up -d`でコンテナを起動しているため、コンテナ名は`test_web_1`になった。

```
terraform --version
Terraform v0.12.24
```
```
aws --version
aws-cli/1.18.53 Python/3.7.7 Linux/4.9.184-linuxkit botocore/1.16.3

aws s3 ls
# エラーが返ってこないか確認する。
# 既にs3バケットが作成されている場合はs3バケット名が表示される。
```

以上で下準備は終了。。
２回目に移ります。