Dockerfileを使用したDockerイメージの作成


 前回、CentOSの公式Dockerイメージに手動にてApache及びPHPをインストールし、最後に「docker commit」コマンドで新たなDockerイメージを作成する方法について書きました。
 この方法でもDockerイメージは作れますが、システム運用の観点からすると推奨されません。
 作業手順の正確性、手動によるオペレーションミス、問題が発生した際のデバッグ面、情報共有の利便性など、不利な点が多いです。
 但し、Dockerコンテナ作成を手動で構築するのは、初期段階の試行錯誤をするフェーズでは有効だと思います。

 今回は、Dockerfileを使用したDockerイメージの作成について書きたいと思います。

 

Dockerイメージの作成(Dockerfile編)

Dockerイメージの作成作業

 前回行った手動でのDockerイメージ作成時に行ったオペレーションを参考にDockerfileを作成し、Dockerイメージを作成したいと思います。

 前回行った手順は以下の通りです。

  • ベースイメージの取得
# docker pull centos
  • CentOSコンテナにApacheをインストール
# groupadd -g 2000 apache
# useradd -u 2000 -g 2000 -s /usr/sbin/nologin apache
# yum install -y httpd
  • CentOSコンテナにPHPをインストール
# yum -y install php php-common
  • PHPアプリケーションのインストール
# docker cp myapp.php <Apache+PHPコンテナのコンテナID>:/var/www/html/
  • Dockerコンテナの起動
# docker run -d -p 8080:80 my-httpd-php /usr/sbin/httpd -DFOREGROUND

 

 これをDockerfileの形式で記述すると、以下の通りになります。

FROM centos

RUN groupadd -g 2000 apache && \
 useradd -u 2000 -g 2000 -s /usr/sbin/nologin apache; \
 yum install -y httpd && yum clean all

RUN yum -y install php php-common && yum clean all

COPY myapp.php /var/www/html/

CMD ["/usr/sbin/httpd","-DFOREGROUND"]

※Dockerコンテナ起動時のポート指定は、後述してますが、起動時に指定します。

 

 Dockerホスト内の任意の空のディレクトリを作成し、上の内容のDockerfileを作成します。
ファイル名は「Dockerfile」です。

 また、前回作成したmyapp.phpも同じディレクトリに入れておきます。

 Dockerfileとmyapp.phpを置いたディレクトリをカレントディレクトリとして、その状態で以下のコマンドを実行します。

$ docker build --rm -t <dockerイメージ名> .

 

 前回のDockerイメージ名はmy-httpd-phpでしたので、今回はmy-httpd-php-2としましょう。

 以下のコマンドを実行します。

$ docker build --rm -t my-httpd-php-2 .

しばらくするとプロンプトが戻ってきます。
最後に「Successfully built xxxxxxxxxxxxx」のメッセージが出力されていれば正常です。
(xxxxxxxxxxxxxは任意の文字列です)

 「docker images」コマンドでDockerイメージが作成されているが確認しましょう。

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-httpd-php-2 latest 8b0756a1ea75 7 seconds ago 281.4 MB
my-httpd-php latest a2f69b374be4 6 hours ago 343.1 MB

「my-httpd-php-2」が作成されていることが確認できました。

■ 本記事の目次に戻る ■

 

Dockerコンテナの起動

では、作成したDockerイメージを実行します。
以下のコマンドを実行してください。

$ docker run -d -p 8080:80 my-httpd-php-2

Dockerホスト外のPCから、ブラウザで以下のURLにアクセスしてください。

 URL:http://<DockerホストのIPアドレス>:8080/myapp.php

 「Apache+PHPコンテナ」のホスト名とIPアドレスおよび接続元のIPアドレスとが表示されたと思います。

 

Dockerfileの構文について

 では、DockerfileとDockerイメージ作成コマンドについて詳しく見てみましょう。

 先ほどのDockerfileを再掲します。

FROM centos

RUN groupadd -g 2000 apache && \
 useradd -u 2000 -g 2000 -s /usr/sbin/nologin apache; \
 yum install -y httpd && yum clean all

RUN yum -y install php php-common && yum clean all

COPY myapp.php /var/www/html/

CMD ["/usr/sbin/httpd","-DFOREGROUND"]

 最初の「FROM」はベースイメージを指定する命令です。
 CentOSが指定されています。

 次の「RUN」は、ベースイメージ内で実行するコマンドを指定する命令です。
 前回手動で実行したコマンドが記載されてます。
 前回は省略しましたが、作成するDockerイメージ内のゴミ掃除として「yum clean all」を適時実行してます。

 1つ目の「RUN」がApacheのインストールで、2つ目の「RUN」がPHPのインストールになります。

 次の「COPY」は、カレントディレクトリにあるファイルを、作成するDockerイメージ内の所定のディレクトリにコピーします。

 最後の「CMD」は、「docker run」時にDockerコンテナ内で実行するコマンドを指定する命令です。
 Apacheのバイナリファイルを起動するように指定しています。起動時のオプションも合わせて指定しています。

 このように、最初にベースイメージを指定して、あとはそのDockerイメージを更新する処理を順番に指定していくようにDockerfileを作成していきます。

 今回使用した命令はほんの一部です。Dockerfileに関する詳しい説明は以下のWebページを参照してください。

■ 本記事の目次に戻る ■

Dockerイメージ作成コマンドのオプション

 次は、Dockerfileを使用してDockerイメージを作成するためのコマンドについて説明します。

 先ほどは以下のコマンドを実行しました。

$ docker build --rm -t my-httpd-php-2 .

 「--rm」は、Dockerイメージの作成処理の過程で生成されるテンポラリ的に作成される中間イメージファイルを、Dockerイメージ作成処理後、自動的に削除するオプションです。

 「-t」は、Dockerイメージ名を指定するオプションです。

 最後に、「.」が付いていますが、ここには読み込むDockerfileが存在するディレクトリを指定します。

 上記の場合、「.」はカレントディレクトリですので、カレントディレクトリに存在するDockerfileを読み込むための指定になります。
 Dockerfileのファイル名は、他の名前を指定することも可能ですが、デフォルトである「Dockerfile」を使用するようにしましょう。

 

Dockerコンテナの起動コマンドのオプション

 最後は、作成したDockerイメージを用いたDockerコンテナの起動です。

$ docker run -d -p 8080:80 my-httpd-php-2

 「-d」はデーモンモードで起動するオプションです。

 「-p」は起動したDockerコンテナの公開ネットワークポートの指定と、Dockerホストのネットワークポートの接続を指定するオプションです。

-p <Dockerホストポート>:<Dockerコンテナの公開ポート>

の形式で指定します。

■ 本記事の目次に戻る ■

DockerイメージとDockerfile

このようにDockerfileを作成してDockerイメージを作成することで、以下のような利点があります。

  • Dockerイメージが可視化される
  • イメージ作成やイメージメンテナンス時の労力・ミスの低減
  • Dockerイメージ配布の利便性

などなど。

 よって、「docker pull」コマンドでDockerイメージを取得することと、そのDockerイメージを作成した際に使用したDockerfileを入手し「docker build」コマンドでDockerイメージを自分で作成することは同じである、ということになります。

 例えば、誰かにDockerイメージを送る場合、Dockerfileをメールに添付するという方法もある、ということになります。

 バイナリファイル群であるDockerイメージとテキストファイルであるDockerfile。
 得意・不得意を見極めて使いこなして下さい。

 ちなみに、Dockerイメージをtar形式でファイルに出力することも可能です。

 最後までお読みいただきありがとうございました。

■ 本記事の目次に戻る ■


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください