おつかれさまです。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ファイルをシェル等で自動で生成出来るようにしたりするとあとはビルドして起動させるだけで済むので幸せになれるかもしれません。