Aamazon EC2にDockerコンテナを立ち上げてJavaプログラムをテストしたい

# はじめに
本内容は、成り立てエンジニアな私の個人メモとしての記録であり、超基礎的な内容となっております。初学者向けとして本記事を閲覧していただければと思います。また、自身の成長につながるため、何かアドバイス・ご指摘があればコメントしていただけると幸いです。

# やろうと思ったきっかけ
新卒エンジニアとしてこの春より働くことになり、研修を行いつつ配属先での業務に少しずつ触れさせてもらっています。
そんな日々の中、ある日の会議でこんな話がありました。

>「それじゃあ、まずはEC2立てて、Kubernetes使って簡単な検証から始めていこうか。」
>（初心者過ぎて正確な内容は理解が追いつかず、上記の内容はめちゃめちゃニュアンスです）

議事録を取りながら聞いていたのですが、専門用語の応酬でとてもビビり散らかしていたことは覚えています。
その時の自分の心境としては、

> （EC2？たしかAWSの仮想サーバーサービスだったかな？ローカルとかではやらないんだ。）
> （クーバネティス？聞いたことあるけど全然イメージつかねぇ。Dockerとかコンテナに関連したやつってことだけは、なんとなく知ってるだけで。。。）

というような感じでした。後々先輩に聞いたところ、今後の業務では当たり前に必要になる要素だとかなんとか。
さらには、会議の最後には、実際に検証チームをいくつか編成して、自分も一つのチームに属することに。
このままじゃ無知すぎて足を引っ張り、周りに迷惑をかけることになってしまう。ヤバすぎる。泣

というような状況に至ったため、独習で少しずつそのあたりの分野の勉強を始めています。
現状持っている自分の知識をもとに何から行えばいいか考えを巡らせ、とりあえずまずは登場するものを超簡単に組み合わせて触りながら学ぼうということになりました。

# ゴール
今回のゴールは、タイトルにもある通り、「Aamazon EC2にDockerコンテナを立ち上げてJavaプログラムをテストする」になります。

したがって、本内容の方針としては、ざっくりと
1. AWSにサインインし、EC2インスタンスを作成し起動する。
1. Dockerをインストールし、Java環境のDockerイメージを用いてコンテナを作成する。
1. Javaプログラムを作成し、実装する。

といった流れで、進めていきます。
Javaを選択した理由としては、自分が触ったことあるからと今後の開発実務で使用するかも知れないからです。

# やってみよう
ということで、早速取り掛かっていきたいと思います。
※1. 本内容は、AWSの個人アカウントが作成済みであることを前提として進めていきます。
※2. 本内容は実装にフォーカスして書いておりますので、技術用語に関する説明は省略しております。

## 【手順①】AWSのEC2作成
※AWSのUIは2022年5月時点のもです。時間経過とともにUIも遷移していくため、あらかじめご了承ください。

### 1. EC2インスタンス起動
まずは、AWSにサインインして、クラウドの仮想サーバーであるEC2インスタンスを立ち上げます。
サービス一覧より、「EC2」を選択します。
すると、EC2のダッシュボードに移るので、「インスタンスを起動」を選択します。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/ec076e4a-7be4-3ed5-8db3-61fc74a86b74.png)

### 2. インスタンス詳細設定
インスタンスを起動すると、各種設定画面に映ります。

名前とタグには、テキトーに「My Server」と入力します。
OSイメージ、インスタンスタイプは、以下の画像の通りに無料利用枠のものを選択します。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/0fb76d01-cf47-e5f5-62e2-f9bef1fb0e8b.png)
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/0bad91bd-aff3-d7fa-7966-cc64133bf67a.png)
その他は、デフォルトのままで進めます。

### 3. キーペアの作成
最後に起動を選択すると、「キーペアを作成」といった画面が表示されます。

ここでは、「新しいキーペアの作成」を選択し、キーペア名、タイプ、キーファイル形式を設定します。
私は、画像の通りに設定しました。
（画像では、キーペア名のところでエラーが出ていますが、私の不手際ですので気にしないでください。）
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/5cc543b5-14fc-7502-f7de-7efa6c7d92df.png)
作成したらキーファイルが発行されます。
こちらは後程使用するので、消さずにとっておきます。

最後に起動ボタンを押すと、インスタンスが作成されます。
インスタンスのダッシュボードで「My Server」といった名前のインスタンが作成されていることを確認してください。
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/063f3f75-fe18-4723-75e2-6d48b2daa51c.png)
これで、クラウド上にテストのための仮想サーバを立ち上げることができました。
次では、このサーバ内でプログラムをテストするための環境構築を行います。

## 【手順②】Dockerコンテナ作成
この手順では、前の手順で作成したEC2インスタンスにDockerをインストールし、テスト環境を構築します。

### 1. SSH接続
EC2内にDockerをインストールしたいので、SSH接続でEC2インスタンスの遠隔操作を行います。
私はWindowsユーザのため、[このサイト](https://qiita.com/r18j21/items/6de4fefa8105356ca9ae)を参考させていただき、[Tera Term](https://ja.osdn.net/projects/ttssh2/)といったソフトウェアでSSH接続を実行しました。
この作業内で、さきほど作成したキーペアを使用します。

この作業が完了すると、ローカルPCからクラウド上の仮想サーバーへの遠隔操作が可能になった状態になります。
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/bd3c1a76-e81d-ffab-3afa-e4aa1090e947.png)

### 2. Dockerインストール
続いて、Dockerのインストール作業を行います。
こちらが参考にさせていただいた[サイト](https://qiita.com/fkooo/items/bb921218313123c14358)になります。

まずは、インストールされているのパッケージの更新を以下のコードで実行します。

    sudo yum update -y

実行が終了したら、`Complete!` と表示されるので、確認してください。

次に、Dockerを以下のコードでインストールします。

    sudo amazon-linux-extras install docker

途中で実行確認の表示がされるので`y`で先へ進みます。
なにもエラーなく終了したら、インストール完了です。

参考サイトではsudoコマンドを使用せずにDockerコマンドを実行できるよう設定を変更しているため、本記事でも例に倣って変更手順を行います。

インストールしたDockerを起動し、

    sudo service docker start

sudoを使用しないでDockerコマンドを使用できる変更を行います。

    sudo usermod -a -G docker ec2-user

SSH接続をいったん終了し、再度接続するとDockerコマンドが通常に使用できるように変更されています。
試しに、Docker情報が正しく表示されるか確認します。

    docker info

様々情報が表示されたら確認完了です。
    
### 3. Dockerイメージからコンテナを作成する

[Docker Hub](https://hub.docker.com/)よりイメージをダウンロードします。
今回は、OpenJDKでEC2で使用されることが想定されている？イメージの[amazoncorretto](https://hub.docker.com/_/amazoncorretto)を使用します。
以下のコードでダウンロードができます。

    docker pull amazoncorretto

完了したら、イメージが正常にダウンロードできたか、以下のコードでリストを出力し確認します。

    docker image ls

画像の通りに、リスト内にダウンロードしたイメージが存在しているか確認します。
![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/7353f055-30d5-4eae-4bef-2f5576222750.png)
Dockerイメージよりコンテナを立ち上げます。

    docker run -it  --name="test01" amazoncorretto:latest /bin/bash

コンテナが起動したら、シェルの表示が変わります。
![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/8138c5eb-c68e-30f1-8cea-a5f2b9954362.png)
この手順が完了すると、仮想サーバー内にコンテナが立ち上がり、そのコンテナ内のシェルの操作が可能となります。
このコンテナが、次のJavaプログラムをテストする環境ということになります。

## 【手順③】Javaプログラムの実装

### 1. プログラムの記述
まずは、Java環境がちゃんと整っているか確認します。
以下のコマンドでJavaのバージョン確認を行います。

    java -version
正常に返答があると、Javaコマンドが使えることになります。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/8d20214f-1422-7408-1f36-02d9c5d56fd3.png)
プログラムのソースコードを入れておくディレクトリを作成します。
`mkdir`コマンドでsrcディレクトリを作成し、`ls`コマンドで今の場所のディレクトリ群を表示しsrcフォルダがあることを確認します。

    mkdir src
    ls
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/b64d6022-ce8a-ef2d-96c8-667b6c00e9ae.png)
確認出来たら、`cd`コマンドでsrcディレクトリに移動します。
移動したら、Javaプログラムを記述するファイルを`touch`コマンドで作成します。
作成したら、`ls`コマンドで確認します。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/319b9f22-2676-6ee0-5aa0-db6ce3f4afc5.png)
ここでは、main.javaといったファイルを作成しました。
このファイルにJavaのソースコードを記述していきます。
ファイルの編集では、`vi`コマンドを使用します。
![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/5c2f8425-7897-cbce-fc53-8bec4ca35bde.png)
`vi`コマンドでmain.javaを指定すると、シェル画面が変わったかと思います。
これは、ファイル内を参照し、様々操作ができる状態となっています。
この画面で、Javaコードを書いていきます。
`i`を入力すると、Insertモードとなり、ターミナル上でコードが書けるようになります。
そしたら、以下のコードを記述します。
![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/a1660eae-3921-2de6-0872-42398691fee9.png)
今回は、Javaプログラムの動作の可否を確認したいので、2つの変数の掛け算といった超単純な処理内容としています。
記述し終わったら、`esc`キーを押しInsertモードを終了し、`:wq`で変更の保存・終了を実行します。

### 2. プログラムの実行
最初のターミナルに戻ってくるので、続いてJavaファイルのコンパイルを`javac`コマンドで実行します。
![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/6f911a9d-97c8-4f58-9463-80f723484ecf.png)
何事もなく終了するとコンパイルが完了したことになります。
エラーが発生したときは、どこかソースコードが間違っているかもしれないです。

コンパイルが完了したら、最後にプログラムを`java`コマンドで実行します。
![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/19887fa8-dcf0-1d4f-44b5-c5a825b87bde.png)
正常に実行出来たら、xとyの変数にテキトーな値を入力することで、解が出力されると思います。

これで、Javaプログラムのテストを行うことができました。

## 【おまけ】コンテナの削除とEC2インスタンスの終了
テストが終わったので、立ち上げたサービスをそれぞれ終了させていきます。
まずはDockerコンテナです。
`exit`コマンドを入力すると、コンテナのターミナルから出て、EC2のターミナルに移動します。
その後、`docker ps -a`とコマンドを入力すると、現在のプロセスの状況が表示されます。
今回作成したamazoncorrettoコンテナのstatusがExitedになっていることが確認出来たら、コンテナが停止していることになります。
![17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/9b20e8b9-ac73-1931-9752-72fa9e79999c.png)
作成したコンテナは、`docker rm`コマンドで削除することができます。
![18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/2c4e3c6f-fa9c-2bb3-0e9e-24823f541fa7.png)
そして最後に、EC2インスタンスを終了させます。
EC2のダッシュボードから「インスタンスの終了」を選択するとEC2が終了します。
![19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615436/929e1063-532b-df7a-fef8-62ebbed0f12d.png)

# 最後に
今回は、最小限の要素の組み合わせで、EC2、Dockerの基礎的な部分の機能を確認することができました。
やっとスタートラインに立てた感じです。ここから、膨大な技術へと応用が派生していくので、引き続き学習を進めていけたらと思います。

こんな感じで、実務で使いそうor話題に出てくるor関連してるような技術が出てきたら、それをテーマに記事を書いてアウトプットしていけたらと思います。
くじけず頑張ろう。

# 参考資料
[Tera Term で EC2 へ SSH 接続する](https://qiita.com/r18j21/items/6de4fefa8105356ca9ae)
[AWS EC2 でDocker環境を無料で試してみる](https://qiita.com/fkooo/items/bb921218313123c14358)