【Docker入門】Dockerfileの構造②

 ここでは、「Webサーバーをビルドする①」で作成したDockerfileの記述内容を詳しく解説していきます。

Webサーバーをビルドする①」では以下の内容を定義しました。

# Step1 : Ubuntuイメージの作成
FROM ubuntu:latest

# Step2 : Nginxのインストール
RUN apt-get update && apt-get install -y -q nginx

# Step3 : htmlファイルのコピー
COPY index.html /var/www/html

# Step4 ... 80番ポートの公開
EXPOSE 80

# Step5 : コマンドの実行(Nginxの開始)
CMD ["nginx","-g","daemon off;"]

Dockerfileの解説

このDockerfileは、以下の手順でイメージを構築し、コンテナを起動します。

Step1: Ubuntuイメージの作成

 「FROM ubuntu:latest」命令は、ベースとなるDockerイメージを指定します。ここでは、最新のUbuntuイメージを使用しています。

FROMコマンド

 FROMコマンドは、Dockerfile内で使用される命令の一つであり、コンテナのベースとなるイメージを指定します。このコマンドを使用することで、構築するイメージの基盤となるOSやソフトウェア環境を定義することができます。

書式
FROM <イメージ名>:<タグ>
  • <イメージ名>: 使用するイメージの名前を指定します。
  • <タグ>: イメージのバージョンやリビジョンを示すタグを指定します。この部分は省略することもありますが、省略した場合はデフォルトで「latest」が使用されます。
使用例

以下は、FROMコマンドの使用例です

FROM ubuntu:latest

 この例では、Ubuntuの最新版をベースイメージに設定しています。つまり、構築するDockerイメージのベースとなるOSはUbuntuであり、その最新版が使用されます。

Step2: Nginxのインストール

 「RUN apt-get update && apt-get install -y -q nginx」命令は、Dockerコンテナ内で実行されるコマンドを指定します。この場合、「apt-get update」でパッケージリストを更新し、「apt-get install」でNginxをインストールしています。

RUNコマンド

 RUNコマンドは、Dockerfile内で使用される命令の一つであり、指定されたコマンドを実行します。主にDockerイメージのビルド時に、イメージ内で実行したい処理を指定する際に使用されます。

書式

RUNコマンドには2つの書式があります。

  • Exec形式[コマンド]を配列形式で指定します。これにより、コマンドと引数が正確に解釈されます。
  • Shell形式[コマンド]を文字列として指定します。シェルが起動され、その中でコマンドが実行されます。
使用例

以下は、RUNコマンドの使用例です。

Exec形式
RUN ["apt-get", "install", "-y", "nginx"]

 この例では、「apt-get install -y nginx」コマンドが実行されます。Exec形式では、コマンドと引数が配列形式で指定され、そのまま実行されます。

Shell形式
RUN apt-get install -y nginx

 この例でも同じく、「apt-get install -y nginx」コマンドが実行されます。Shell形式では、コマンドと引数が文字列として指定され、シェルが起動されてからコマンドが実行されます。

 これらの例では、nginxをインストールするためにapt-getを使用しています。これにより、Dockerイメージ内にNginxがインストールされ、その後のコンテナの設定に利用できるようになります。

Step3: htmlファイルのコピー

 「COPY index.html /var/www/html」命令は、ローカルの「index.html」ファイルをDockerコンテナ内の「/var/www/html」ディレクトリにコピーします。これにより、Nginxが提供するウェブサーバーのルートディレクトリに「index.html」ファイルが配置されます。

COPYコマンド

 COPYコマンドは、Dockerfile内で使用される命令の一つであり、ホスト上のファイルやディレクトリをDockerイメージ内にコピーします。主にアプリケーションのソースコードや設定ファイルなどをイメージに含める際に使用されます。

書式
COPY <ホストのファイルパス> <イメージのファイルパス>
  • <ホストのファイルパス>: ホスト上のファイルやディレクトリのパスを指定します。
  • <イメージのファイルパス>: イメージ内のファイルやディレクトリのパスを指定します。このパスは絶対パスまたは相対パスで指定することができます。
使用例
COPY index.html /var/www/html

 この例では、ホスト上の「index.html」ファイルをDockerイメージ内の「/var/www/html」ディレクトリにコピーしています。つまり、Dockerコンテナ内のウェブサーバーのルートディレクトリに「index.html」ファイルが配置されることになります。これにより、コンテナ内に静的なウェブページやアプリケーションのファイルを含めることができます。

Step4: 80番ポートの公開

 「EXPOSE 80」命令は、コンテナが外部と通信する際に使用するポートを公開します。ここでは、NginxのデフォルトのHTTPポートであるポート80が公開されています。

EXPOSEコマンド

 EXPOSEコマンドは、Dockerfile内で使用される命令の一つであり、コンテナが公開するポート番号を指定します。つまり、このポート番号を外部のホストや他のコンテナからアクセス可能にします。

書式
EXPOSE <ポート番号>
  • <ポート番号>: 公開するポート番号を指定します。複数のポートを公開する場合は、複数のEXPOSEコマンドを使用する必要があります。
使用例
EXPOSE 80

 この例では、Dockerコンテナがポート80を公開することを指定しています。つまり、コンテナ内のアプリケーションがポート80でリクエストを待ち受け、外部からのHTTPアクセスを可能にします。ただし、このコマンドを使用しても、実際にポートをホストマシンに公開するには、コンテナを実行する際に「-p」オプションを使用する必要があります。

Step5: コマンドの実行(Nginxの開始)

 CMD ["nginx", "-g", "daemon off;"]命令は、コンテナが起動したときに実行されるデフォルトのコマンドを指定します。ここでは、Nginxをバックグラウンドで実行するためのコマンドが指定されています。これにより、Nginxがコンテナ内で常駐し、HTTPリクエストを処理できるようになります。

CMDコマンド

 CMDコマンドは、Dockerfile内で使用される命令の一つであり、コンテナが起動した際に実行されるデフォルトのコマンドを指定します。主にデーモンやアプリケーションの起動に使用されます。CMDコマンドは、Exec形式とShell形式の2つの書式があります。

書式

CMDコマンドの書式は以下の通りです。

  • Exec形式[コマンド]を配列形式で指定します。これにより、コマンドと引数が正確に解釈されます。
  • Shell形式[コマンド]を文字列として指定します。シェルが起動され、その中でコマンドが実行されます。
使用例

以下は、CMDコマンドの使用例です。

Exec形式
CMD ["nginx", "-g", "daemon off;"]

 この例では、nginx -g 'daemon off;'コマンドが実行されます。Exec形式では、コマンドと引数が配列形式で指定され、そのまま実行されます。

Shell形式
CMD nginx -g 'daemon off;'

 この例でも同様に、nginx -g 'daemon off;'コマンドが実行されます。Shell形式では、コマンドと引数が文字列として指定され、シェルが起動されてからコマンドが実行されます。

 これらの例では、nginxをデーモンとして起動するためのコマンドが指定されています。コンテナが起動すると、このCMDコマンドで指定されたコマンドが実行され、nginxがバックグラウンドで動作します。

まとめ

 このDockerfileは、UbuntuベースのDockerイメージを作成し、その上にNginxをインストールして、ローカルのindex.htmlファイルをコンテナに配置し、Nginxを起動しています。これにより、単純な静的ウェブサイトをDockerコンテナ内でホストすることができます。

パッケージ管理システム

 ここで、RUNコマンドで指定した「 RUN ["apt-get", "install", "-y", "nginx"] 」のコマンドの意味を補足します。

 パッケージ管理システムは、Linuxシステムでソフトウェアパッケージのインストール、アップグレード、削除などの操作を行うためのツールです。以下では、代表的なパッケージ管理システムであるYUMとAPTについて解説します。

YUM(Yellowdog Updater Modified)

 YUMは、CentOSやFedoraなどのRedHat系のLinuxディストリビューションで使用されるパッケージ管理システムです。YUMはリポジトリからパッケージをダウンロードしてインストールしたり、依存関係を解決したりする機能を持ち、システム管理者がパッケージの管理を容易にします。

 YUMコマンドを使用してパッケージの操作を行います。一般的な操作としては、「yum install」でパッケージをインストールしたり、「yum update」でシステムのパッケージをアップグレードしたりします。また、最近のバージョンではDNF(Dandified Yum)が後継として使われることが多くなっています。

APT(Advanced Packaging Tool)

 APTは、DebianやUbuntuなどのDebian系のLinuxディストリビューションで使用されるパッケージ管理システムです。APTは、リポジトリからパッケージをダウンロードしてインストールしたり、依存関係を解決したりする機能を持ちます。

 aptコマンドを使用してパッケージの操作を行います。例えば、「apt-get install」でパッケージをインストールし、「apt-get upgrade」でシステムのパッケージをアップグレードします。また、apt-cache searchを使用してパッケージを検索することもできます。

まとめ

 これらのパッケージ管理システムを使うことで、Linuxシステムでのソフトウェアの管理や更新が容易になります。