AWSにコンテナ環境を構築する

#はじめに
コンテナ開発環境をAWS上に構築します。
なお、本記事は以下のUdemy講座を元にした覚書です。
[米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/share/103aTRAEASdltXRH0F/)

#準備
1. コンソールよりAWSのEC2インスタンスを生成
https://aws.amazon.com/jp/console/

2. OSはUbuntuなどを選択

3. インスタンスが起動したらログインし、Dockerをインストール

```bash
# sshでAWSにログイン
ssh -i /Users/yukokanai/work/aws/ssh/mydocker.pem ubuntu@ec2-13-230-103-136.ap-northeast-1.compute.amazonaws.com

# dockerインストール
sudo apt-get update
sudo apt-get install docker.io

# dockerグループを作ってubuntu（ユーザー）を入れる（sudoなしでdockerを使える様にする）
sudo gpasswd -a ubuntu docker

# 一度ログアウトしてからもう一度入り直すと使える様になる
exit
```

#AWSのインスタンスにimageをアップしコンテナ起動
いくつかあります。制約などに応じて使い分けてください。

##手段①Docker HubなどのレジストリにDocker imageをpullする
インスタンスがネットにつなげられない場合は使えないです。

1.Docker Hubにアカウントを作成
https://hub.docker.com/

2.ローカル環境にDockerをインストール

3.ローカル環境にてimageファイルを作成

```bash
docker build -f Dockerfile . {image名（repository）}:{tagname}
```
4.ローカル環境よりDockerHubにpush

```bash
docker push {アカウント名}/{image名（repository）}:{tagname}
```
5.AWSにログインし、DockerHubよりpull

```bash
docker pull {アカウント名}/{image名（repository）}:{tagname}
```
6.DLされたimageファイルよりコンテナ起動

```bash
docker run -it {imageID}
```

##手段②DockerfileをGitHubから取得する
ビルドコンテキストの差異が出る可能性がある
Cloudがネットにつなげられない場合は使えない

1.Git Hubにアカウントを作成
https://github.co.jp/

２.ローカル環境にGitをインストール(Macの場合デフォルトで入っています）

3.ローカル環境にてリポジトリ作成

```bash
# ローカルリポジトリ作成
cd {ディレクトリ名}
git init
git status

# リモートリポジトリに紐付け
git remote add origin git@github.com:{ユーザー名}/{リポジトリ名}.git
```
3.ローカル環境にてDockerfileを作成（置き場所はローカルリポジトリの中）

4.ローカル環境よりDockerfileをGit Hubにpush

```bash
# Dockerfileをコミット
cd {ディレクトリ名}
git add .
git commit -m "こめんと"
git push origin {リポジトリ名}
```
5.AWSにログインしGitをインストール

```bash
sudo apt-get update
sudo apt-get install git
```

6.AWSにてリポジトリを作成し、Dockerfileファイルをpull

```bash
# ローカルリポジトリ作成
cd {ディレクトリ名}
git init
git status

# リモートリポジトリに紐付け
git remote add origin git@github.com:{ユーザー名}/{リポジトリ名}.git

# pull
git pull origin {リポジトリ名}
```

7.AWSにて、imageファイルを作成

```bash
# ビルド
docker build -f Dockerfile . {image名}:{tagname}

# imageファイルが作成されていることを確認
docker images
```

8.作成されたimageファイルよりコンテナ起動

```bash
docker run -it {imageID}
```

##手段③Dockerfileをファイル転送する
ビルドコンテキストの差異が出る可能性がある
Cloudがネットにつなげられない場合は使えない

1.ローカル環境にDockerをインストール

2.ローカル環境にてDockerfileを作成

3.sftpにてAWSへファイル転送（インスタンスは起動しておく）

```bash
# sftpでAWSへログイン
sftp -i /Users/yukokanai/work/aws/ssh/mydocker.pem ubuntu@ec2-13-230-103-136.ap-northeast-1.compute.amazonaws.com

# 圧縮ファイルをAWSインスタンスへput
put Dockerfile /home/ubuntu

# ログアウト
exit
```

4.AWSにログインし、imageファイルを作成

```bash
# ビルド
docker build -f Dockerfile . {image名}:{tagname}

# imageファイルが作成されていることを確認
docker images
```

5.作成されたimageファイルよりコンテナ起動

```bash
docker run -it {imageID}
```

##手段④Docker imageを圧縮して送る
他手段に比べてimageファイルはサイズが大きいので時間がかかる

1.ローカル環境にDockerをインストール

2.ローカル環境にてimageファイルを作成

```bash
docker build -f Dockerfile . {image名}:{tagname}
```
3.imageファイルを圧縮

```bash
docker save {imageID} > myimage.tar
```
4.sftpにてAWSへファイル転送（インスタンスは起動しておく）

```bash
# sftpでAWSへログイン
sftp -i /Users/yukokanai/work/aws/ssh/mydocker.pem ubuntu@ec2-13-230-103-136.ap-northeast-1.compute.amazonaws.com

# 圧縮ファイルをAWSインスタンスへput
put myimage.tar /home/ubuntu

# ログアウト
exit
```

5.AWSにログインし、圧縮ファイルを展開してimageファイルを作成

```bash
# 圧縮ファイルを展開
docker load < myimage.tar

# imageファイルが作成されていることを確認
docker images
```

6.作成されたimageファイルよりコンテナ起動

```bash
docker run -it {imageID}
```