【Docker】dockerfileを利用してEC2にApacheコンテナを構築

##目標
dockerfileを利用してEC2インスタンスにApacheコンテナを構築する。

##はじめに
Docker学習の備忘録メモです。
基本的には以下のサイト（※）の内容を参考に構築しており、
基本的なコンテナやDockerの概念も分かりやすく記載してあるため、こちらを参考にした方がよいかと思います。

※参考サイト（特に「その3:Dockerfileってなに？」を本記事では主に利用しております。）
[【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに？ 〜](https://tech-lab.sios.jp/archives/18811)
[【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その2:Dockerってなに？ 〜](https://tech-lab.sios.jp/archives/19073)
[【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その3:Dockerfileってなに？ 〜](https://tech-lab.sios.jp/archives/19191)

##前提
・EC2インスタンス（Amazon Linux 2 AMI (HVM), SSD Volume Type利用）（※）が構築済みであること。

※セキュリティグループで**TCP8080番ポート**を空けること。

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [Dockerデーモン起動](#1dockerデーモン起動) |
| 2 | [Dockerイメージの作成](#2dockerイメージの作成)|
| 3 | [Dockerコンテナの起動](#3dockerコンテナの起動)|
| 4 | [接続検証](#4接続検証)|


##手順
###1.Dockerデーモン起動
**①Dockerのインストール**
EC2インスタンスにOSログイン後、Dockerをインストールします。

```
sudo yum install -y docker
```

**②Dockerデーモン起動及び自動起動の有効化**

```
sudo systemctl start docker
sudo systemctl status docker
sudo systemctl enable docker
sudo systemctl is-enabled docker
```

**③ec2-userをdockerグループに所属させる**

```
sudo usermod -a -G docker ec2-user
cat /etc/group | grep docker
```

一旦ログアウト後（※）、`docker info`でDockerのシステム情報が表示されることを確認します。
※ログアウトしないとdocker info実行時パーミッションエラーとなる。

```
[ec2-user@ip-172-31-32-204 ~]$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.13-ce
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: c623d1b36f09f8ef6536a057bd658b3aa8632828
 runc version: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 init version: de40ad0 (expected: fec3683)
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.14.209-160.339.amzn2.x86_64
 Operating System: Amazon Linux 2
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 983.3MiB
 Name: ip-172-31-32-204.ap-northeast-1.compute.internal
 ID: RKGH:NETA:2FJW:FP7Q:X52F:F2DG:NSPR:YCQD:RYG2:XN54:ATEO:CLYY
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
```

###2.Dockerイメージの作成
**①コンテナ配備用PHPファイル作成**
作成するコンテナに配備するためのPHPファイルを作成します。

```
vi test.php
```

```bash:test.php
<?php
  echo "hoge";
?>
```

**②dockerfileの作成**
Dockerhubから取得したCentOSイメージをベースとして（`FROM`）、httpd及びphpをインストール（`RUN`）、かつ先ほど作成したtest.phpを/var/www/html配下にコピー（`COPY`）し組み込み、更にコンテナ起動時にはhttpd起動コマンドを実行する（`CMD`）Dockerイメージを新規作成…といったフローを実行するための`dockerfile`を作成します（※）。

※RUN及びCOPYはDockerイメージ新規作成時に実行し、イメージ内に組み込まれる。それに対し、CMDはコンテナ起動時に実行するコマンドを指定する。

```
vi dockerfile
```

```bash:dockerfile
FROM centos:centos7

RUN yum -y install httpd php

COPY test.php /var/www/html/

CMD ["/usr/sbin/httpd","-DFOREGROUND"]
```

**③Dockerイメージの作成**
`docker build`を利用してdockerfile内のフローを適用したdockerイメージを作成します。
カレントディレクトリ内に存在するdockerfileを利用して、testphpという名前のdockerイメージを作成するという趣旨のコマンドです。

```bash
# Successfully tagged testphp:latestと最終行に出力されればOK
docker build -t testphp .
```

`docker images`でdockerイメージ一覧を確認します。
ベースとしたCentOSとそこからカスタマイズしたtestphp（※）のDockerイメージの作成が確認出来ます。

※Dockerイメージ作成時、タグ名を指定しないと自動的にタグ名は`latest`となる。

```
[ec2-user@ip-172-31-32-204 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
testphp             latest              f5e7748e4f37        2 minutes ago       348MB
centos              centos7             8652b9f0cb4c        6 weeks ago         204MB
```

###3.Dockerコンテナの起動
作成したDockerイメージから、`docker run`でdockerコンテナtestwebを起動します。
`-d`でバックグラウンド起動（フォアグラウンドで起動した場合コンソール操作が以降不可となるので基本的にはこのオプションはつける）、`-p 8080:80`でローカルホスト8080番ポート→コンテナ80番ポートへフォワーディングする設定とします。

```
docker run -d -p 8080:80 --name testweb testphp:latest
```

`docker ps`でコンテナ一覧を確認し、testwebという名前のコンテナが確認できます。

```
[ec2-user@ip-172-31-32-204 ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
216b216e14bf        testphp:latest      "/usr/sbin/httpd -DF…"   4 minutes ago       Up 4 minutes        0.0.0.0:8080->80/tcp   testweb
```

###4.接続検証
ブラウザから`<EC2のグローバルIPアドレス>:8080/test.php`でアクセスをかけ、hogeと表示されるページが表示されればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/6be0da27-1c75-8c79-6dd1-628a0251c68c.png)