アプリ導入手順をDockerfileに記述する
次に、2行目の「RUN」と書かれた行では、ウェブサーバを実現するソフトウェア(httpdパッケージ)をDockerイメージにインストールしています。すなわち、出来上がったDockerイメージは、CentOS 6.8のOS環境の雛形に、httpdパッケージが追加されたものになります。
ここで重要な点は、アプリのインストール処理は、あくまで、これから生成するDockerイメージに対して行っているものであり、Dockerエンジンが稼働しているホストOSの環境にインストールしているわけではないという点です。
ホストOSに含まれるアプリ構成などを一切汚すことなく、さまざまな種類のLinux OSのアプリをDockerイメージとして作成できることを意味しています。さまざまな種類のLinux OSや、バージョンの異なるアプリ環境を必要とする開発者にとっては、自分のホストOS(開発環境)を汚されずにさまざまな開発環境を構築できるため、非常に便利です。
入手した雛形のDockerイメージにアプリをインストールする処理をDockerfileに記述する
3行目の「COPY」で始まる行では、Dockerエンジンが稼働するサーバ上に事前に用意したウェブコンテンツ(今回は、test.html)をDockerイメージにコピーしています。以上で、Dockerイメージへのウェブサーバのインストールやウェブコンテンツの格納が終了したことになります。
ウェブコンテンツをDockerイメージ内に格納
最後に、4行目のCMD行は、先ほどの3行とは意味が異なります。1行目から3行目までは、Dockerイメージを作る際の命令を書き連ねていましたが、このCMD行は、Dockerコンテナが起動する際に自動的に実行してほしいアプリケーションやコマンドを記述します。ここでは、ウェブサーバを提供する「httpd」という実行ファイルを指定しています。これにより、Dockerコンテナが起動すると、自動的にWebサービスのhttpdが稼働する、すなわち、「Webサービスが稼働するDockerコンテナ」を実現できるわけです。
ここで注意しなければならない点があります。それは、アプリケーション(今回の場合は、httpd)の起動方法が従来の物理システムや仮想マシンの場合とは、大きく異なる点です。従来の物理マシンやハイパーバイザー型の仮想化環境における仮想マシンでは、アプリケーションのパッケージにあらかじめ含まれている起動・停止用のスクリプトとOSのサービス管理機能を使ってアプリケーション自体の起動や停止を行っていました。
しかし、コンテナの場合は、直接アプリケーションの実行ファイル(今回の場合は、/usr/sbin/httpdという実行ファイル)を直接指定する方法がほとんどです。ここでは詳しく触れませんが、Dockerでは、物理サーバや仮想マシンのゲストOS上で設定していた従来のアプリケーションの起動方法と異なる場合が少なくないということを知っておく必要があります。
(※)従来のアプリケーションの起動方法と同様の方法をDockerコンテナで実現する方法も存在しますが、一般に、Docker環境の多くは、コンテナ側で稼働するプロセスを極力減らし、軽量化するというポリシーから、アプリケーションの実行ファイルを直接指定する方法が採用されています。
CMD行は、Dockerコンテナが起動する際に、自動的に実行してほしいアプリケーションやコマンドを記述できる
たった4行のDockerfileですが、これだけで、「CentOS 6.8という無償OS環境で稼働するWebサービスを提供するDockerコンテナ」を実現するDockerイメージが実現できます。