dockerファイルからオリジナルイメージを作成してみた

D
2023-10-31
2023-10-31

 

おつかれさまです。Dです。

前回立てたdockerコンテナは既存の公開されているイメージをそのまま流用したものだったので、今回はDockerファイルからAlmaLinux9でnginxがインストールされているイメージを作成して、サイト表示まで出来ればいいなってことでやってみます。

あとせっかくなので、nginxのドキュメントルートをデフォルトから任意のパスに変更し、自作したhtml(めっちゃ簡単なやつ)ファイルを表示させていくのも併せてやっていきたいと思います。

内容

サーバー環境は前回同様のEC2の「AlmaLinux9」で実施します。

# cat /etc/os-release 
NAME="AlmaLinux"
VERSION="9.2 (Turquoise Kodkod)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.2"
PLATFORM_ID="platform:el9"
PRETTY_NAME="AlmaLinux 9.2 (Turquoise Kodkod)"
ANSI_COLOR="0;34"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:almalinux:almalinux:9::baseos"
HOME_URL="https://almalinux.org/"
DOCUMENTATION_URL="https://wiki.almalinux.org/"
BUG_REPORT_URL="https://bugs.almalinux.org/"

ALMALINUX_MANTISBT_PROJECT="AlmaLinux-9"
ALMALINUX_MANTISBT_PROJECT_VERSION="9.2"
REDHAT_SUPPORT_PRODUCT="AlmaLinux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.2"

まずはdockerイメージをビルドするために必要なファイルを用意します。ファイルを保存するディレクトリについてはカレントディレクトリで実行する予定なので、どこでもOKです。肝心のdockerファイルから中身を見ていきます。

.
-Dockerfile
-index.html
-
nginx.conf

なんとなくファイルの中身を見てもらえれば、何をしようとしてるかは想像が出来そうな気がしますね。
1つずつ項目を確認していきましょう。

「FROM」    :ベースイメージの設定になります。今回はAlmaLinux9のコンテナを元にオリジナルのイメージを作成していきたいため、「almalinux:9」を指定しています。


「RUN」     :これから作成するdockerイメージ内で実行されるコマンドになります。今回はAlmaLinux9にnginxをインストールした状態のイメージを作りたいのでdnfコマンドでnginxをインストールし、変更したドキュメントルート用のディレクトリを作成しています。


「COPY」    :dockerを動かしているベースサーバー内にあるファイルをコンテナ内にコピーするコマンドになります。今回だとnginxのドキュメントルートをデフォルトから変更したいので、予めベースサーバー内にドキュメントルートを変更したコンフィグファイルを設置してコンテナ内部にコピーしています。あと自作のhtmlファイルもコンテナ内部にコピーしています。


「EXPOSE」   :作成しようとしているコンテナイメージのポート開放コマンドになります。今回はnginxでWebサーバーなので80番ポートを解放しています。


「ENTRYPOINT」:コンテナが起動した時に実行されるコマンドでメインプロセスになります。また、dockerコンテナの挙動としてコンテナのメインプロセスがバックグラウンドになるとコンテナ自体も終了してしまうことがあります。そのため、オプションに「daemon off」を付与してフォアグラウンドでnginxを実行するように設定しています。

# Alma Linux 9をベースとして使用
FROM almalinux:9

# パッケージリストを更新し、Nginxをインストール
RUN dnf -y update && dnf -y install nginx

# nginxのドキュメントルート用ディレクトリ作成
RUN mkdir -p /var/www/html/

# ローカルに配置したNginxの設定ファイルをコピー
COPY nginx.conf /etc/nginx/nginx.conf

# ローカルに配置したindex.htmlのファイルをコピー
COPY index.html /var/www/html/index.html

# ポート80を公開
EXPOSE 80

# Nginxをフォアグラウンドで実行
ENTRYPOINT ["nginx", "-g", "daemon off;"]

自作した「index.html」はこんな感じです。
めちゃくちゃ簡素です。

<html>
<head>
<meta charset="utf-8">
<title>docker-nginx</title>
</head>
<body>
my nginx image
</body>
</html>

nginxのコンフィグファイルは長いので変更点だけ記載します。以下の項目を変更してドキュメントルートを変更しています。

root         /usr/share/nginx/html;

root         /var/www/html/;

ファイルを用意できたので、いざイメージをビルドしてみます。ビルドするコマンドは「docker build -t my-nginx-image .」になります。「-t」コマンドで分かりやすいタグ名を付けて作成することが出来ます。また最後の「.」ですがカレントディレクトリを意味するものになります。ビルドする前と後でイメージ一覧を確認して、作成されているかを確認しています。

# docker image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

# docker build -t my-nginx-image .
[+] Building 26.5s (10/10) FINISHED                                                                                                                                                                                           docker:default
 => [internal] load .dockerignore                                                                                                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                                                                                                         0.0s
 => [internal] load build definition from Dockerfile                                                                                                                                                                                    0.0s
 => => transferring dockerfile: 692B                                                                                                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/almalinux:9                                                                                                                                                                          2.0s
 => [1/5] FROM docker.io/library/almalinux:9@sha256:0dd49216789d0d410fdd7e785ebe7e5e52f8ed3435b3989f9d551294fea514a3                                                                                                                    4.9s
 => => resolve docker.io/library/almalinux:9@sha256:0dd49216789d0d410fdd7e785ebe7e5e52f8ed3435b3989f9d551294fea514a3                                                                                                                    0.0s
 => => sha256:0dd49216789d0d410fdd7e785ebe7e5e52f8ed3435b3989f9d551294fea514a3 975B / 975B                                                                                                                                              0.0s
 => => sha256:e78278ef22f8227423532e9694e9ed5c362f3e81067c7986f05f38f2968bb438 529B / 529B                                                                                                                                              0.0s
 => => sha256:1851aa77ac58181083ae0e68711dc38e434bec08ad53ef6f42c66cb1d100a6ef 1.48kB / 1.48kB                                                                                                                                          0.0s
 => => sha256:92cbf8f6375271a4008121ff3ad96dbd0c10df3c4bc4a8951ba206dd0ffa17e2 68.21MB / 68.21MB                                                                                                                                        0.9s
 => => extracting sha256:92cbf8f6375271a4008121ff3ad96dbd0c10df3c4bc4a8951ba206dd0ffa17e2                                                                                                                                               3.8s
 => [internal] load build context                                                                                                                                                                                                       0.0s
 => => transferring context: 2.63kB                                                                                                                                                                                                     0.0s
 => [2/5] RUN dnf -y update && dnf -y install nginx                                                                                                                                                                                    17.9s
 => [3/5] RUN mkdir -p /var/www/html/                                                                                                                                                                                                   0.3s
 => [4/5] COPY nginx.conf /etc/nginx/nginx.conf                                                                                                                                                                                         0.0s
 => [5/5] COPY index.html /var/www/html/index.html                                                                                                                                                                                      0.0s
 => exporting to image                                                                                                                                                                                                                  1.1s
 => => exporting layers                                                                                                                                                                                                                 1.1s
 => => writing image sha256:7ccd299dd4d3743b80f6104e7c245bddb5d16637c3640ad845169defffa1ed32                                                                                                                                            0.0s
 => => naming to docker.io/library/my-nginx-image

# docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
my-nginx-image   latest    ff5e32f9c973   3 minutes ago   312MB

無事に「my-nginx-image」のイメージが作成できていますね。と言いたいところなんですが、タグ名をつけ忘れて実行してしまいました。。。

作り直すために先ほど作成したイメージを以下のコマンドで削除します。rmの後にIMAGEIDを指定することで削除が可能になります。

# docker image rm ff5e32f9c973
Untagged: my-nginx-image:latest
Deleted: sha256:ff5e32f9c9736761b3e6cc42525a0c6c7f60e832be5c4335bbd77783c5b42d15

気を取り直して「docker build -t my-nginx-image:custom-nginx .」再実行します。

# docker build -t my-nginx-image:custom-nginx .
[+] Building 1.4s (10/10) FINISHED                                                                                                                                                                                            docker:default
 => [internal] load .dockerignore                                                                                                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                                                                                                         0.0s
 => [internal] load build definition from Dockerfile                                                                                                                                                                                    0.0s
 => => transferring dockerfile: 699B                                                                                                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/almalinux:9                                                                                                                                                                          1.3s
 => [internal] load build context                                                                                                                                                                                                       0.0s
 => => transferring context: 179B                                                                                                                                                                                                       0.0s
 => [1/5] FROM docker.io/library/almalinux:9@sha256:0dd49216789d0d410fdd7e785ebe7e5e52f8ed3435b3989f9d551294fea514a3                                                                                                                    0.0s
 => CACHED [2/5] RUN dnf -y update && dnf -y install nginx                                                                                                                                                                              0.0s
 => CACHED [3/5] RUN mkdir -p /var/www/html/                                                                                                                                                                                            0.0s
 => CACHED [4/5] COPY nginx.conf /etc/nginx/nginx.conf                                                                                                                                                                                  0.0s
 => CACHED [5/5] COPY index.html /var/www/html/index.html                                                                                                                                                                               0.0s
 => exporting to image                                                                                                                                                                                                                  0.0s
 => => exporting layers                                                                                                                                                                                                                 0.0s
 => => writing image sha256:ff5e32f9c9736761b3e6cc42525a0c6c7f60e832be5c4335bbd77783c5b42d15                                                                                                                                            0.0s
 => => naming to docker.io/library/my-nginx-image:custom-nginx                                                                                                                                                                          0.0s
# docker image ls
REPOSITORY       TAG            IMAGE ID       CREATED             SIZE
my-nginx-image   custom-nginx   ff5e32f9c973   About an hour ago   312MB

今度こそ、想定通りのイメージが作成できていますね。このイメージを利用してコンテナを立ち上げましょう。実行するコマンドは以下になります。

※もしコマンドの詳細が知りたい人は前回の「Almalinux9にdockerをインストールしてサイト表示させてみた。」を見ていただけると嬉しいです。今回は割愛させていただきます。

docker run -d -p 1234:80 my-nginx-image:custom-nginx

docker ps コマンドで確認すると無事に立ち上がっているのが確認出来ます。

# docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                                   NAMES
59fad5afade2   my-nginx-image:custom-nginx   "nginx -g 'daemon of…"   16 seconds ago   Up 16 seconds   0.0.0.0:1234->80/tcp, :::1234->80/tcp   infallible_wozniak

それではサイト表示が想定通り出来ているか確認してみましょう。

http://[EC2のパブリック IPv4 DNS]:1234
※EC2で立てているのでドメイン名は「パブリック IPv4 DNS」を指定しています。念のためDNS名は伏せています。

成功ですね!!事前に作成していたファイルで表示が出来ています。

【まとめ】

ベースサーバー内のファイルを利用してオリジナルのdockerイメージが作成出来ることを確認しました。複雑な構成になると、dockerファイルをシェル等で自動で生成出来るようにしたりするとあとはビルドして起動させるだけで済むので幸せになれるかもしれません。