#目的
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
セキュリティグループの設定等はいい感じに。
#構築手順
以下の流れで実施する。
- EC2上にDockerの動作環境を構築する。
- Docker HubからCentOSのイメージをダウンロードする。
- ダウンロードしたイメージを起動し、コンテナにログインした上でApache HTTP Serverを動作させる。
- 動作確認。
- Docker Fileを用い、Apache HTTP Serverのコンテナを作成し、動作させる。
- 動作確認。
##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:
- The Docker client contacted the Docker daemon.
- The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64) - The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading. - 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の8080ポートをコンテナの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
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