Windows11 WSL2 Ubuntu 24.04 LTS Docker
Dockerfile で Docker nginx 構築
ここまでで Docker を使用して Web サイトを表示することができるようになりました。
引き続き Dockerfile を使用して Docker nginx を構築して行きます。
基本の Docker イメージを元に自分独自の変更をしたくなります。
例えば、Docker イメージの中にあるコマンドを Docker 起動時に呼び出したい
起動と同時に特定のファイルをダウンロードしたい
といった要望に対応するために既存の Docker イメージをもとに独自の設定をする機能があります。
それが Dockerfile です。
Dockerfile は Docker イメージの設計書でテキストファイルとして作成します。
Dockerfile で Docker nginx 構築
Ubuntu の中に nginx ウェブサーバーをインストールしたコンテナを構築します。
もちろん、Docker nginx は docker compose で構築することもできます。
でも、Dockerfile での構築方法も知っていて損はありません。
理解しておきましょう。
Docker コンテナ nginx を作成するフォルダを作ります。
/home/yamada/ のフォルダの直下に
/doc-nginx (名前は適当です、分かりやすい名前をつけましょう)
のようなコンテナ名をつけてフォルダ
/home/yamada/doc-nginx
を作成し、
この中にコンテナ作成のための以下の設計書-ファイル類を作成し保存します。
例としては
/home/yamada/doc-nginx
L Dokerfile ① 今回はこれを作成します
L docker-compose.yml ② 今回は不要
L htdocs ③
L index.html
L css 今回は不要
L style.css
L img 今回は不要
L sample.png
のようにファイル類を作成します。
通常、①②③の三つのフォルダ/ファイル名は変えてはいけません。
もっと複雑になる時もあります。
これらはなくても何とかなりますが基本、作成することになります。
しかし今回は、シンプルなコンテナを作成しますので、①のファイルを作成し、コンテナを構築します。
htdocs の中の index.html は動作確認用のファイルです。
index.html の中でスタイル指定や画像表示する場合は css や img ファイルを作成します。
今回は htdocs がドキュメントルートとなり、Web サイトで外部に公開される HTML ファイルや画像データなど
を設置する場所になります。
Docker ngnix Dockerfile ファイル作成
Docker Compose や Docker コマンドを入力することでコンテナを立ち上げることも可能ですが、
Docker コマンドだけで対処するには大変です。
今回は Dokerfile という Docker 立ち上げ設定書の機能を利用して、コンテナを立ち上げます。
Dockerfile なるテキストファイルに起動に関する基本的なコマンドを入力してコンテナを作成します。
もし Ubuntu イメージを最初に規定するならば、コンテナ作成はただ単に Ubuntu に Ngnix をインストールする
のとその考え方はほぼ同じです。
内容(これを A とします)は以下の通りです。
FROM ubuntu:latest RUN apt-get update && apt-get install -y nginx # VOLUME /home/yamada/doc-ngnix/htdocs /var/www/html/ CMD [ "nginx", "-g", "daemon off;" ]
内容を分解して説明します。
- FROM ubuntu:latest
FROM の後には、通常 OS や又は環境がセットアップされたイメージファイル名を指定します。
今回は、
OS = ubuntu
バージョン = 最新版(latest)
を指定しています。 - RUN でコマンドを自動実行
Ubuntu のイメージ管理ソフトウェアの APT に対して apt-get update コマンドで最新版にし、 nginx というウェブサーバーをインストールコマンド
apt-get install -y nginx
を指定しました。
Linux 系の OS は && で繋ぐことにより一行でコマンドを実行できます。
さらに長いときは行末に \ を入れることにより、複数のコマンドを実行することができます。
RUN apt-get update \
apt-get install -y nginx
と書くこともできます。 - VOLUME 指定
Dockerによる環境構築をする際、ボリュームをマウントする方法は Dockerfile, Composeファイル, コマンドライン の三つがあります。
Dockerfile 内で VOLUME 命令を書く方法が良いと思ったのですが、
この命令では引数としてコンテナ側のディレクトリしか指定することはできません。
・・・ 以下は私の浅はかな考えでした。
VOLUMEコマンドは共有可能な永続ボリュームをマウントするコマンドです。
データベース・ストレージ領域、設定用ストレージ、Docker コンテナによって作成されるファイルや フォルダの公開のためにボリュームを指定します。
イメージにおいて変わりやすい作業スペースはユーザによって便利な保管場所として VOLUME を使用します。
永続ボリュームはホスト側のフォルダを指定します。
今回は、ホスト側の
/home/yamada/doc-nginx/htdocs
を使用します。
Ngnix の DocumentRoot ディレクトリのデフォルト値は /var/www/html/
に設定されているので、これをローカル側のディレクトリとしました。
VOLUME /home/yamada/doc-nginx/htdocs /var/www/html/
・・・ この考えは上手くいきません。
ホスト側の
/home/yamada/doc-nginx/htdocs
が指定できないのです。
よって、コマンドラインでボリュームをマウントします。
docker run で -v フラグを使い、ボリュームをマウントします。
詳細は後述します。 - CMD で ngnix 起動
CMD で ngnix を起動します。
書式は
CMD [ "イメージ名", "-g", "daemon off;" ]
なのですが、
"-g", "daemon off;"
がよくわかりません。
少し解説します。
Linux デーモン(daemon)は、バックグラウンドで動作し、特定のタスクを実行するプログラムです。
デーモンは通常、システムの起動時に開始され、ユーザーの直接の操作なしにサービスを提供し続けます。
デーモンの典型的動作には、ログファイルの監視、ネットワークサービスの提供、 システムメンテナンスタスクの実行などがあります。
もう少し追加説明すると、
① バックグラウンドで実行:
ユーザーの直接の操作なしに実行され、システムリソースを継続的に監視・管理します。
② 独立したプロセス:
デーモンはシステムの他のプロセスから独立して動作し、一般的にはルート(root)ユーザーによって管理されます。 - "-g", "daemon off;" の動作
docker ではコマンドを foreground で動かさないとコンテナが停止してしまいます。
nginx はデフォルトはデーモンとして動くので foreground で動くように設定する必要があります。
-g オプションは nginx コマンドラインから直接設定を追加または変更するためのものです。
このオプションに続けて、引用符で囲まれた設定ディレクティブを指定することができます。
daemon off; の設定は、nginx のデーモンプロセスを無効にするものです。
つまり、nginx はバックグラウンドで実行されず、代わりにフォアグラウンドで実行されます。 - ports 指定
仮想コンピュータと繋ぐポート番号を指定します。
Docker Compose では上手くいったのですが、Dockerfile ファイルでは上手く設定できません。
最初 EXPOSE 命令が使えると思ったのですが、
EXPOSE 命令では、実際にはポートを公開 publish してくれません。
これは、どのポートを公開する意図なのかという、イメージの作者とコンテナ実行者の両者に対し、
ある種のドキュメントとして機能します。
コンテナの実行時に実際にポートを公開するには docker run で -p フラグを使い、
公開用のポートと割当てる(マップ map する)ポートを指定します。
ここまでで Docker nginx Dockerfile ファイルの内容説明が完了しました。
引き続き、自分の PC Windows で TeraPad 等を使用して
Dockerfile ファイル(内容 A)
を作成しこれを保存します。