Docker環境構築（Linux 8）とApache HTTP Serverコンテナの起動

#目的
AWS EC2上にDockerの稼働環境を構築し、Apache HTTP Serverコンテナを作成し、動作させる。コンテナの基本的な操作を理解する。（コンテナ内にログインした上で操作するパターンとDocker Fileを用いるパターンの二つを実施する。）

#環境条件
- Dockerサーバ
    - EC2：t2.micro
    - OS：Red Hat Enterprise Linux 8 (HVM), SSD Volume Type
    - Disk：汎用SSD（GP2） 10GB

セキュリティグループの設定等はいい感じに。

#構築手順

以下の流れで実施する。
1. EC2上にDockerの動作環境を構築する。
2. Docker HubからCentOSのイメージをダウンロードする。
3. ダウンロードしたイメージを起動し、コンテナにログインした上でApache HTTP Serverを動作させる。
4. 動作確認。
5. Docker Fileを用い、Apache HTTP Serverのコンテナを作成し、動作させる。
6. 動作確認。

##1. EC2上にDockerの動作環境を構築する。

Dockerサーバにec2-userでログイン

```
## rootユーザにスイッチ
sudo su - 
```

```
##各種ライブラリのアップデート
dnf -y update
```

```
##リポジトリの確認
dnf repolist
```
`repo id                      repo name
rhel-8-appstream-rhui-rpms   Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs)
rhel-8-baseos-rhui-rpms      Red Hat Enterprise Linux 8 for x86_64 - BaseOS from RHUI (RPMs)
rhui-client-config-server-8  Red Hat Update Infrastructure 3 Client Configuration Server 8
`

```
##Dockerリポジトリの追加
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```
`Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
`

```
##リポジトリが追加されたことを確認
dnf repolist
```

`repo id                      repo name
docker-ce-stable             Docker CE Stable - x86_64
rhel-8-appstream-rhui-rpms   Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs)
rhel-8-baseos-rhui-rpms      Red Hat Enterprise Linux 8 for x86_64 - BaseOS from RHUI (RPMs)
rhui-client-config-server-8  Red Hat Update Infrastructure 3 Client Configuration Server 8
`

```
##インストールするDockerライブラリの存在確認
dnf info docker-ce
```
`Last metadata expiration check: 0:00:54 ago on Tue 29 Dec 2020 12:15:56 AM UTC.
Available Packages
Name         : docker-ce
Epoch        : 3
Version      : 20.10.1
Release      : 3.el8
Architecture : x86_64
Size         : 27 M
Source       : docker-ce-20.10.1-3.el8.src.rpm
Repository   : docker-ce-stable
Summary      : The open-source application container engine
URL          : https://www.docker.com
License      : ASL 2.0
Description  : Docker is a product for you to build, ship and run any application as a
             : lightweight container.
             : 
             : Docker containers are both hardware-agnostic and platform-agnostic. This means
             : they can run anywhere, from your laptop to the largest cloud compute instance and
             : everything in between - and they don't require you to use a particular
             : language, framework or packaging system. That makes them great building blocks
             : for deploying and scaling web apps, databases, and backend services without
             : depending on a particular stack or provider.
`

```
dnf info docker-ce-cli
```
`Last metadata expiration check: 0:01:00 ago on Tue 29 Dec 2020 12:15:56 AM UTC.
Available Packages
Name         : docker-ce-cli
Epoch        : 1
Version      : 20.10.1
Release      : 3.el8
Architecture : x86_64
Size         : 33 M
Source       : docker-ce-cli-20.10.1-3.el8.src.rpm
Repository   : docker-ce-stable
Summary      : The open-source application container engine
URL          : https://www.docker.com
License      : ASL 2.0
Description  : Docker is is a product for you to build, ship and run any application as a
             : lightweight container.
             : 
             : Docker containers are both hardware-agnostic and platform-agnostic. This means
             : they can run anywhere, from your laptop to the largest cloud compute instance and
             : everything in between - and they don't require you to use a particular
             : language, framework or packaging system. That makes them great building blocks
             : for deploying and scaling web apps, databases, and backend services without
             : depending on a particular stack or provider.
`

```
dnf info containerd.io
```
`Last metadata expiration check: 0:01:04 ago on Tue 29 Dec 2020 12:15:56 AM UTC.
Available Packages
Name         : containerd.io
Version      : 1.4.3
Release      : 3.1.el8
Architecture : x86_64
Size         : 33 M
Source       : containerd.io-1.4.3-3.1.el8.src.rpm
Repository   : docker-ce-stable
Summary      : An industry-standard container runtime
URL          : https://containerd.io
License      : ASL 2.0
Description  : containerd is an industry-standard container runtime with an emphasis on
             : simplicity, robustness and portability. It is available as a daemon for Linux
             : and Windows, which can manage the complete container lifecycle of its host
             : system: image transfer and storage, container execution and supervision,
             : low-level storage and network attachments, etc.
`

```
## Dockerライブラリのインストール
dnf -y install docker-ce docker-ce-cli containerd.io
```

```
##Dockerサービスの登録
systemctl enable docker
```
`Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
`

```
##Dockerの起動
systemctl start docker
```

```
##Dockerの起動確認
systemctl status docker
```
`● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2020-12-29 00:19:07 UTC; 9s ago
     Docs: https://docs.docker.com
 Main PID: 58369 (dockerd)
    Tasks: 8
   Memory: 59.2M
   CGroup: /system.slice/docker.service
           └─58369 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
`

```
##Dockerのバージョン確認
docker --version
```
`Docker version 20.10.1, build 831ebea
`

```
##Hello Worldの実行
docker run hello-world
```
`Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/get-started/
`

##2. Docker HubからCentOSのイメージをダウンロードする。

```
##Dockerイメージの確認
docker images
```
`REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB
`

```
##Docker HubからCentOS8のイメージをダウンロード
docker pull centos:centos8
```
`centos8: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:centos8
docker.io/library/centos:centos8
`

```
##Dockerイメージが追加されていることを
docker images
```
`REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB
centos        centos8   300e315adb2f   3 weeks ago      209MB
`

##3. ダウンロードしたイメージを起動し、コンテナにログインした上でApache HTTP Serverを動作させる。

```
##CentOSコンテナの起動（OSの８０８０ポートをコンテナの80ポートとマッピング）
docker run --detach --name test --privileged --publish=8080:80 centos:centos8 /sbin/init
```
`b25e9ef1d672f5e802eaa03983457c9730c9a5805a7d1abddb4ad9056ec15a01
`

```
##8080ポートがDockerコンテナでLISTENしていることを確認
netstat -nap | grep 8080
```
`tcp6       0      0 :::8080                 :::*                    LISTEN      58798/docker-proxy  
`

```
##起動したコンテナのプロセス状態確認
docker ps -a
```
`CONTAINER ID   IMAGE            COMMAND        CREATED         STATUS                     PORTS                  NAMES
b25e9ef1d672   centos:centos8   "/sbin/init"   2 minutes ago   Up 2 minutes               0.0.0.0:8080->80/tcp   test
28a9e2902746   hello-world      "/hello"       9 minutes ago   Exited (0) 9 minutes ago                          nervous_wilbur
`

```
コンテナにログイン
# docker exec -it test bash
```

以下、コンテナにログインした状態で実施

```
##コンテナのOS確認
cat /etc/os-release 
```
`NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
`

```
##コンテナのカーネルを確認
uname -a
```
`Linux b25e9ef1d672 4.18.0-240.1.1.el8_3.x86_64 #1 SMP Fri Oct 16 13:36:46 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux
`

```
## コンテナにApache HTTP Serverをインストール
dnf install -y httpd
```

```
## インストールされたApache HTTP Serverのバージョン確認
httpd -v
```
`Server version: Apache/2.4.37 (centos)
Server built:   Nov  4 2020 03:20:37
`

```
##Apache HTTP Serverのサービス登録
systemctl enable httpd
```
`Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
`

```
##Apache HTTP Serverの起動
systemctl start httpd
```

```
##Apache HTTP Serverの起動状態確認
systemctl status httpd
```

```
##index.htmlの作成
vi /var/www/html/index.html
```

```
cat /var/www/html/index.html 
```
```
<html>
<body>
Test Container HTML File
</body>
</html>
```

##4. 動作確認。

```
##コンテナ内でApache HTTP Serverの動作確認
curl -i http://localhost/
```
`HTTP/1.1 200 OK
Date: Tue, 29 Dec 2020 00:38:51 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Tue, 29 Dec 2020 00:37:43 GMT
ETag: "37-5b78f99486ca0"
Accept-Ranges: bytes
Content-Length: 55
Content-Type: text/html; charset=UTF-8
<html>
<body>
Test Container HTML File
</body>
</html>
`

control + dでコンテナからexit（Macなので）


PCのブラウザから以下、URLにアクセスし、
「このページは動作していませんec2-13-114-50-13.ap-northeast-1.compute.amazonaws.com からデータが送信されませんでした。ERR_EMPTY_RESPONSE」が表示されることを確認
http://<パブリック DNS>:80

PCのブラウザから以下、URLにアクセスし、
Test Container HTML Fileが表示されることを確認
http://<パブリック DNS>:8080

```
##コンテナの停止
docker stop b25e9ef1d672
```
`b25e9ef1d672
`

```
##コンテナプロセスの削除
docker rm b25e9ef1d672
```
`b25e9ef1d672
`

##5. Docker Fileを用い、Apache HTTP Serverのコンテナを作成し、動作させる。
```
##Docker File用ディレクトリの作成
mkdir -p docker/httpd
```
```
cd docker/httpd/
```
```
##Docker Fileの作成（Apache HTTP Serverをインストールし、コンテナ起動時にhttpdプロセスを起動する設定。index.htmlも作成。）
vi DockerFile
```
```
cat Dockerfile 
```
```
# setting base image
FROM centos:centos8
# Auther
MAINTAINER MARTOON
# install Apache httpd server
RUN dnf install -y httpd
# create index.html
RUN echo "sample httpd container" > /var/www/html/index.html
# enable httpd
RUN systemctl enable httpd
# start httpd
CMD systemctl start httpd
```

```
##Docker FileからDocker Imageのビルド
docker build -t sample_httpd:0.1 .
```

```
##ビルドしたコンテナイメージの存在確認
docker images
```
`REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
sample_httpd   0.1       6892219088b3   24 seconds ago   250MB
centos         centos8   300e315adb2f   3 weeks ago      209MB
hello-world    latest    bf756fb1ae65   12 months ago    13.3kB
`

```
##ビルドしたコンテナイメージの起動
docker run --detach --name sample_httpd --privileged --publish=8080:80 sample_httpd:0.1 /sbin/init
```
`d7bd77d61494b97fa00c5664aed59d9080c0b1d210581b2c3a7732f1ab47c94b
`

##6. 動作確認。

PCのブラウザから以下、URLにアクセスし、
「このページは動作していませんec2-13-114-50-13.ap-northeast-1.compute.amazonaws.com からデータが送信されませんでした。ERR_EMPTY_RESPONSE」が表示されることを確認
http://<パブリック DNS>:80

PCのブラウザから以下、URLにアクセスし、
sample httpd containerが表示されることを確認
http://<パブリック DNS>:8080

```
##Dockerプロセスの確認
docker ps -a
```
`CONTAINER ID   IMAGE              COMMAND        CREATED              STATUS              PORTS                  NAMES
d7bd77d61494   sample_httpd:0.1   "/sbin/init"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   sample_httpd
`

```
##起動したコンテナの停止
docker stop d7bd77d61494
```
`d7bd77d61494
`

```
##起動したコンテナの削除
docker rm d7bd77d61494
```
`d7bd77d61494
`

```
##コンテナイメージの確認
docker images
```
`REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
sample_httpd   0.1       8d1a1edebfdf   3 minutes ago    250MB
centos         centos8   300e315adb2f   3 weeks ago      209MB
hello-world    latest    bf756fb1ae65   12 months ago    13.3kB
`

```
##ビルドしたコンテナイメージの削除
docker rmi 8d1a1edebfdf
```

```
##コンテナイメージが削除されたことを確認
docker images
```
`REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
centos        centos8   300e315adb2f   3 weeks ago      209MB
hello-world   latest    bf756fb1ae65   12 months ago    13.3kB
`