【AWS】Docker内のコンテナにアクセスしたい

### はじめに

### 1. EC2インスタンスの起動
　EC2 で「インスタンスの起動」を選択します。最低限、以下の設定を行ってください。
今回は8080 -> 80 へポートフォワーディングするので、8080番ポートを許可しておきます。 
　マシンイメージ：Ubuntu Server 20.04 LTS (HVM), SSD Volume Type
　セキュリティグループ：22番ポート(SSH)と8080番ポートを許可
![http_security.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/15e320e8-dde8-68d8-f898-b7324411f95b.png)

### 2. コンテナのインストール
　インスタンスが起動したらログインしましょう。初期ユーザは「ubuntu」です。
以下のコマンドでコンテナをインストールしましょう。

```text
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
```

インストールしたらバージョンを確認しておきましょう。

```text
ubuntu@ip-<ipaddr>:~$ sudo docker version
Client: Docker Engine - Community
 Version:           20.10.2
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        2291f61
 Built:             Mon Dec 28 16:17:43 2020
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
～省略～
```

### 3. 必要なファイルの準備
　Dockerfileなどを格納したディレクトリを作成しましょう。(今回はweb_docker)。
ディレクトリには、Dockerfileとwebサイトに表示するファイル(index.html)を格納します。

```text
ubuntu@ip-<ipaddr>:~$ ll web_docker/
total 16
drwxrwxr-x 2 ubuntu ubuntu 4096 Jan 25 16:02 ./
drwxr-xr-x 5 ubuntu ubuntu 4096 Jan 25 16:02 ../
-rw-rw-r-- 1 ubuntu ubuntu  146 Jan 25 16:01 Dockerfile
-rw-rw-r-- 1 ubuntu ubuntu   13 Jan 25 16:02 index.html
```

（1）Dockerfile
コンテナの作成手順書のようなものです。CentOSで起動してhttpdをインストールします。

```text
FROM centos:centos7
RUN yum install -y httpd && systemctl enable httpd
ENTRYPOINT ["/sbin/init"]
COPY ./index.html /var/www/html/index.html
```

（2）index.html
webサイトに表示する内容なので適当に書いておきましょう。

```text
this is test
```

### 4. docker buildコマンドの実行
　前の手順で作成したファイルを使って、docker buildコマンドを実行しましょう。

```text
sudo docker build -t httpd:test ./web_docker
```

実行したら、コンテナイメージが作成できたことを確認しましょう。

```text
ubuntu@ip-<ipaddr>:~$ sudo docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
httpd        test      57a73a9dba95   29 seconds ago   331MB    # 想定通り作成された
centos       centos7   8652b9f0cb4c   2 months ago     204MB
```

### 5. docker runコマンドの実行
 今回は、8080 -> 80 へポートフォワーディングさせます。

```text
sudo docker run --privileged -d -p 8080:80 --name webserver httpd:test /sbin/init
```
オプションは以下です。

|オプション  |意味  |
|---|---|
|-d  |バックグラウンドで実行  |
|-p  |ポートフォワーディング  |
|--name  |コンテナ名  |
|--privileged  |特権モードにする  |

なお、以下のサイトにあるように、オプションとして--privilegedを付けて
/sbin/initで起動実行させないと、systemctlが使えません。
[CentOS7のDockerコンテナでsystemctlを使えるようにする](https://qiita.com/mikene_koko/items/4c71c969f55e3fe24190)



### 6. コンテナの状態確認
 コンテナを起動させたら状態確認をしましょう。
まずは「sudo docker ps -a」でコンテナの状態を確認します。
　STATUS ：Upになっていることを確認
　PORTS：ポートフォワーディングの設定が入っていることを確認

```text
ubuntu@ip-<ipaddr>:~$ sudo docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                  NAMES
1a57b4836ead   httpd:test   "/sbin/init /sbin/in…"   11 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp   webserver
```

次に、httpdの状態を確認します。
systemctlでActiveであることが確認できました。

```text
ubuntu@ip-<ipaddr>:~$ sudo docker exec -it webserver /bin/bash
[root@1a57b4836ead /]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2021-01-26 10:21:56 UTC; 3min 55s ago
     Docs: man:httpd(8)
           man:apachectl(8)
```

### 7. webサイトの確認
 最後に、実際にアクセスしてみましょう。

```text
http://<EC2インスタンスのグローバルIP>:8080
```

想定通り、webサイトにアクセス出来ることが確認できました。
![web.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/c9a7aabd-1418-594c-e8da-2f6025c9d4ad.png)

### 参考資料
[docker docs](https://docs.docker.com/engine/install/centos/#install-using-the-convenience-script)