[JAWS-UG 磐田] コンテナハンズオン

# 【ハンズオン演習】コンテナ（Docker）に触ってみよう

## ◆概要

　コンテナについて解説を交えて触ってみましょう。  

　参考 [【図解】Dockerの全体像を理解する](https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc)  

- - -

## ◆ハンズオンを始める前に

### ・パソコンの準備をお願いします。
　　※パソコンでのハンズオンを実施いたします。  

### ・会場設置のWi-Fiへ接続願います。
　　※インターネットへの接続を前提としています。  

### ・AWSアカウントの準備はお済みですか？
　　※ハンズオン開始前までに準備願います。  
　　　作成手順：https://aws.amazon.com/jp/register-flow/  

### ・ターミナルソフトウェアの準備
　　※EC2（サーバ）の操作時に使用します。  
　　　Windowsクライアントの方は、Tera TermやPuTTYなどをご用意ください。  

### ・ハンズオン終了後の操作について
　　※使用したEC2・ECS・ECR・ALBは、AWSの課金対象になります。必要ない場合は、削除してください。  
　　　[[ECS(クラスター)削除方法]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/delete_cluster.html)  
　　　[[ECS(タスク定義)登録解除方法]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deregister-task-definition.html)  
　　　[[ECRイメージ削除方法]](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/delete_image.html)  
　　　[[Cloudformation削除方法]](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)  
　　　　※下記順番で削除願います。  
　　　　１．jawsug-iwata-20190821-alb  
　　　　２．jawsug-iwata-20190821-ec2  
　　　　３．jawsug-iwata-20190821-vpc  

- - -

## ◆今回の演習環境について

![構成図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/0f8ce3e5-852b-8d03-edcb-efe8e049ca23.png)  

【演習内容】  
①演習環境準備  
②ＥＣ２を使用してコンテナイメージ作成&リポジトリ登録  
③Fargateでアプリケーション実行＆プログラム更新  

- - -

## ◆ハンズオンを始める前に・・・

### ・AWSマネジメントコンソールにログインして、東京リージョンが選択されている事を確認してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/6d7c11dc-da83-40a0-e0c7-5515ba1373bc.png)

- - -

### ・画面上にIAM・EC2・S3の文字が表示されている事を確認してください。

　※表示されていない場合は、画面左上のサービスをクリックして各サービスを選択してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/d70ce94b-2ce1-c6cf-892f-49e4af5b507d.png)

- - -

## ①演習環境の準備

### １．ハンズオンのVPC環境構築用のCloudFormationの実行

<p><a href="https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/quickcreate?stackName=jawsug-iwata-20190821-vpc&amp;templateURL=https://jawsug-iwata.s3.amazonaws.com/2019_08/JAWS-UG_CreateVPC_20190821.yaml"><img alt="Launch Stack" src="https://s3.amazonaws.com/cloudformation-examples/cloudformation-launch-stack.png" /></a></p>

上のリンクより、ハンズオン用のVPC環境を構築するためのCloudFormationを実行します。  

※環境構築完了後、次の手順に進んでください。  

### ２．EC2用のキーペアー作成

#### ２－１．[[作成手順]](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html#having-ec2-create-your-key-pair)  

　※作成済みの場合は、次へ進んでください。  

### ３．ハンズオンのEC2環境構築用のCloudFormationの実行

<p><a href="https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/quickcreate?stackName=jawsug-iwata-20190821-ec2&amp;templateURL=https://jawsug-iwata.s3.amazonaws.com/2019_08/JAWS-UG_CreateEC2_20190821.yaml"><img alt="Launch Stack" src="https://s3.amazonaws.com/cloudformation-examples/cloudformation-launch-stack.png" /></a></p>

上のリンクより、ハンズオン用のEC2環境を構築するためのCloudFormationを実行します。  

※環境構築完了後、次の手順に進んでください。  

#### ３－１．KeyNameの選択

![keyname.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/009800a9-f9a4-7e2e-2a32-c347d62b5fd4.png)

　　※２．で作成したキーペアーまたは作成済みキーペアーを選択  

#### ３－２．機能の項目で、承認欄をチェック

![機能.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/77eca143-2623-b20e-3107-0fc85fa1dc7c.png)

　　※チェック後、スタックの作成をクリックしてください。  

### ４．EC2への接続

#### ４－１．[Amazon EC2コンソール](https://ap-northeast-1.console.aws.amazon.com/ec2)を開きます。

　※リンク先をクリックすると、東京リージョンのコンソールに接続します。  

#### ４－２．作成したEC2サーバを選択し、[接続]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/f069be75-91d5-db09-03a6-9174febec9b7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/dc2fce6c-8bf8-2aa8-791a-62107846b984.png)

#### ４－３．パブリックDNSの文字列をコピー、ターミナルソフトでssh接続します。

|ログインユーザー|
|:--------|
|ec2-user|

### ５．ハンズオンのALB環境構築用のCloudFormationの実行

<p><a href="https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/quickcreate?stackName=jawsug-iwata-20190821-alb&amp;templateURL=https://jawsug-iwata.s3.amazonaws.com/2019_08/JAWS-UG_CreateALB_20190821.yaml"><img alt="Launch Stack" src="https://s3.amazonaws.com/cloudformation-examples/cloudformation-launch-stack.png" /></a></p>

上のリンクより、ハンズオン用のALB環境を構築するためのCloudFormationを実行します。

※環境構築完了後、次の手順に進んでください。

- - -

## ②ＥＣ２を使用してコンテナイメージ作成&リポジトリ登録

### １．ターミナルソフトからコマンド入力

``` bash
# ハンズオンフォルダーに移動
cd docker-hands-on

# コンテナイメージの作成
docker build -t jawsug/iwata/sampleap:ver1.0 ./

# コンテナイメージの確認
docker images

# コンテナの実行
docker run -d -p 80:80 --rm --name sampleap jawsug/iwata/sampleap:ver1.0
```

### ２．ブラウザーで接続

　　パブリックDNSアドレスを入力し、接続します。

![docker_image_test.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/bedfb744-de57-fb29-332a-1672f9455192.png)

### ３．リポジトリ登録

#### ３－１．[[リポジトリ作成手順]](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/repository-create.html)

|リポジトリ名|
|:----------|
|jawsug/iwata/sampleap|

![ecr.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/ffd8c000-58cc-1899-fb6e-8f23a4da193e.png)

#### ３－２．リポジトリへのコンテナイメージプッシュ手順

　　リポジトリを選択し、プッシュコマンドの表示をクリック

![ecr01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/66350aea-b164-02bd-e4bb-61a8e87fb103.png)

``` bash
# ECRリポジトリへの接続
$(aws ecr get-login --no-include-email --region ap-northeast-1)

#  コンテナイメージのタグ名変更
docker tag jawsug/iwata/sampleap:ver1.0 XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/jawsug/iwata/sampleap:latest
※XXXXXXXXXXXXは、プッシュコマンドの表示で確認してください。

#  コンテナイメージのレジストリ登録
docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/jawsug/iwata/sampleap:latest
※XXXXXXXXXXXXは、プッシュコマンドの表示で確認してください。
```

　登録が成功すると、下記のようになります。

![ecr02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/ca5bd030-ffc2-34de-fcdb-d5a33f1544ac.png)

- - -

## ③Fargateでアプリケーション実行＆プログラム更新

### １．ECSでクラスター作成

#### １－１．[[ECSクラスター作成手順]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create_cluster.html)

|クラスター名|
|:-----------|
|ecs-cluster |

![ecs_cluster01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/88c27b2c-f737-860a-05ef-f10933a52ca5.png)
![ecs_cluster02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/d5f4a3bb-9871-80fb-d596-d2071e9daa82.png)
![ecs_cluster03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/78cf7b3f-a5d4-ad44-8be3-974daf7b26ca.png)

### ２．ECSでタスク定義作成

#### ２－１．[[ECSタスク定義作成手順]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-task-definition.html)

|タスク定義名|
|:-----------|
|ecs-tasks   |

|タスクメモリ|タスクCPU|
|:----------|:--------|
|0.5GB      |0.25vCPU |

|コンテナ名|イメージ|ポートマッピング|
|:---------|:-------|:---------------|
|sampleap  |XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/jawsug/iwata/sampleap:latest|80|

![ecs_task01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/c5420eeb-2324-7a18-4306-f501291eba5a.png)
![ecs_task02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/26c45efe-2543-03df-6d5f-b63b223e74da.png)
![ecs_task03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/6f487a7c-ea36-5cc4-b245-a3d0dddc8fbb.png)
![ecs_task04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/9668a30c-c713-6981-a85c-dc05d9cd5060.png)
![ecs_task05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/b1a8e165-e4cb-43f1-8e1f-ad6eab8cdb7e.png)
![ecs_task06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/c52fedb5-7ec2-c3ac-eafc-679d10545a4b.png)

### ３．ECSでサービス作成

#### ３－１．[[ECSサービス作成手順]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-service.html)

|サービス名 |
|:----------|
|ecs-service|

|タスクの数|
|:---------|
|1         |

|クラスターVPC|
|:------------|
|JAWS-UG IWATA VPC_Tokyo01|

|サブネット|
|:---------|
|Trust-A   |
|Trust-C   |

|セキュリティグループ|
|:-------------------|
|fargate-sg          |

|パブリック IP の自動割り当て|
|:-------------------|
|DISABLED         |

|ロードバランサー名|プロダクションリスナーポート|ターゲットグループ名|
|:-----------------|:---------------------------|:-------------------|
|jawsug-iwata-20190821-ALB|80 : HTTP            |jawsug-iwata-20190821-TG|

![ecs_service01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/8c4d0f31-451a-fe0b-3753-3c97c2b75c30.png)
![ecs_service02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/3527aaed-1c82-7305-8bd3-5c25b0551212.png)
![ecs_service03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/6fc33062-dbb3-3836-8aeb-351b1daeaeda.png)
![ecs_service04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/4d718fc7-2a75-8c37-8ebf-f0f98cb5faad.png)
![ecs_service05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/d67ddf80-5502-d8c7-cab3-5ffbc67e1eb1.png)
![ecs_service06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/d1f4037f-53c0-8335-7634-746c8bccad6f.png)
![ecs_service07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/1366db8a-8dac-c383-a7d9-54378d98c9de.png)
![ecs_service08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/f01a28e6-5dfc-84f4-c8b6-bcce3c133b22.png)
![ecs_service09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/3c6b290b-fd80-f73c-f27c-cb3b2d132dc3.png)

### ４．ALBにブラウザーで接続

#### ４－１．ALBのDNSアドレスを入力し、接続します。

![alb_check.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/53756317-ec78-2616-6362-cd472266cf7d.png)

![alb_check2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/a23f59b2-83c4-47a7-f1a5-e3b5c229dda4.png)

### ５．プログラムの更新

#### ５－１．ターミナルソフトからコマンド入力

``` bash
cd docker-hands-on
cp -p src/index_ver2.0.php src/index.php
docker build -t jawsug/iwata/sampleap:ver2.0 ./
docker tag jawsug/iwata/sampleap:ver2.0 XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/jawsug/iwata/sampleap:latest
docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/jawsug/iwata/sampleap:latest
※XXXXXXXXXXXXは、プッシュコマンドの表示で確認してください。
```

#### ５－１．[[タスク定義の更新]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/update-task-definition.html)

#### ５－２．[サービスの更新]：タスク定義のリビジョンを最新の番号に更新する。

![service_update.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/ffa8ef00-c0bc-ff03-ff45-93cb15d73350.png)

### ６．ALBにブラウザーで接続

#### ６－１．ALBのDNSアドレスを入力し、接続します。

![service_update2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168665/7d46eb0f-c517-81fb-cd44-4e05811bb694.png)

- - -