前回の「ついに1.0がリリース! Dockerのインストールと主なコマンドの使い方」では、Docker EngineのインストールからDockerコンテナーを作成し、Dockerイメージに保存するところまでを紹介しました。
Dockerは開発のスピードが速く、7月3日にはバージョン1.1.0がリリースされています。詳細はブログ「ANNOUNCING DOCKER 1.1.0」を参照してください。
今回は、Dockerコンテナーの構成とDockerイメージの作成を一括で行う、「Dockerfile」ファイルと「docker build」コマンドの利用方法を紹介します。
前回はDockerコンテナーを「docker run」コマンドで起動し、コンテナー内でソフトウェアのインストールやサービス起動など自由に構成できることを紹介しましたが、その構成を他のコンテナーに流用するためには、「docker commit」コマンドでDockerコンテナーから新しいDockerイメージを作成する必要がありました。
この方法だと、構成内容をドキュメントに残しておく必要がありますし、汎用的なイメージや本番環境のイメージを手作業で構成することでミスを誘発する原因にもなるでしょう。
そこで、Docker EngineにはDockerコンテナーの構成をまとめて記述する「Dockerfile」ファイルと、それを適用しDockerイメージを作成する「docker build」コマンドがあります。
「Dockerfile」ファイルは、プログラムのビルドでよく利用されるmakeツールの「Makefile」ファイルと同様に、Dockerコンテナーの構成内容をまとめて記述するシンプルなテキスト形式のファイルです。
1行につき1つの操作を{命令}と{引数}でスペース区切りで記述します。「#」から始まる行はコメントとして処理されます。「docker build」コマンドでは、「Dockerfile」ファイルの上から順番に処理が実行されます。
# コメント {命令} {引数}
{命令}は、大文字/小文字を区別しませんが、識別しやすいよう大文字にするのが推奨です。主な{命令}と用途を以下に示します。
| {命令} | 用途 | 
|---|---|
| FROM | 元となるDockerイメージの指定 | 
| MAINTAINER | 作成者の情報 | 
| RUN | コマンドの実行 | 
| ADD | ファイル/ディレクトリの追加 | 
| CMD | コンテナーの実行コマンド 1 | 
| ENTRYPOINT | コンテナーの実行コマンド 2 | 
| WORKDIR | 作業ディレクトリの指定 | 
| ENV | 環境変数の指定 | 
| USER | 実行ユーザーの指定 | 
| EXPOSE | ポートのエクスポート | 
| VOLUME | ボリュームのマウント | 
「FROM」のみでも動作しますが、主に「RUN」と「ADD」を記述し、必要に応じて他の命令を追加していきます。
ここからは、前回行ったnginxのインストールとサンプルのコンテンツファイルの追加を行ってみます。
~$ mkdir nginx1 ~$ cd nginx1 ~/nginx1$ vim Dockerfile # 以下の内容でDockerfileを作成 FROM ubuntu MAINTAINER takipone <xxxx@gmail.com> RUN apt-get install -y nginx ADD index.html /usr/share/nginx/html/ ~/nginx1$ echo 'Hello!' > index.html ~/nginx1$ ls Dockerfile index.html ~/nginx1$
「Dockerfile」ファイルが作成できたら、「docker build」コマンドでDockerコンテナーの起動、構成、Dockerイメージの作成まで一気に実行します。
docker build [ -t {イメージ名} [ :{タグ名} ] ] {Dockerfileのあるディレクトリ}
「-t」オプションは作成するDockerイメージのイメージ名およびタグ名を指定します。
ここでは、{イメージ名}を「takipone/nginx」、{タグ名}を「1.0」でイメージを作成します。
~/nginx1$ docker build -t takipone/nginx:1.0 .
Uploading context 4.608 kB
Uploading context
Step 0 : FROM ubuntu
 ---> ef83896b7fb9
Step 1 : MAINTAINER takipone <xxxx@gmail.com>
 ---> Running in be0311cf74a3
 ---> be3872d590eb
Step 2 : RUN apt-get install -y nginx
 ---> Running in 561103f0a3c3
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  fontconfig-config fonts-dejavu-core geoip-database libfontconfig1
  libfreetype6 libgd3 libgeoip1 libjbig0 libjpeg-turbo8 
    : 
  libxslt1.1 nginx nginx-common nginx-core sgml-base xml-core
0 upgraded, 25 newly installed, 0 to remove and 0 not upgraded.
Need to get 5612 kB of archives.
After this operation, 19.8 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main libgeoip1 amd64 1.6.0-1 [71.0 kB]
  : 
Setting up nginx (1.4.6-1ubuntu3) ...
Processing triggers for libc-bin (2.19-0ubuntu6) ...
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
 ---> 79d5a21b37ac
Step 3 : ADD index.html /usr/share/nginx/html/
 ---> b1aa19f1ad91
Successfully built b1aa19f1ad91
Removing intermediate container be0311cf74a3
Removing intermediate container 561103f0a3c3
Removing intermediate container 39c67c809b4f
$
完了したら、「docker images」コマンドでDockerイメージ一覧を確認します。
~/nginx1$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE takipone/nginx 1.0 fb37319fbfc5 About a minute ago 210.8 MB ubuntu latest ef83896b7fb9 10 days ago 192.7 MB ~/nginx1$
Dockerイメージができていますね。前回と同様に、作成した「takipone/nginx」イメージからDockerコンテナーを起動します。
~/nginx1$ docker run -d -p 80:80 --name nginx1 takipone/nginx:1.0 /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf da3cd466de22ca06d68a00ae183bf30cb6becfe434323f7f3b07f117ebb34ae8 ~/nginx1$ curl localhost Hello! ~/nginx1$
コンテナーが正常に動作していることが確認できました。いったん、コンテナーを削除しましょう。
~/nginx1$ docker stop nginx1 nginx1 ~/nginx1$ docker rm nginx1 nginx1 ~/nginx1$
Copyright© 2014 ITmedia, Inc. All Rights Reserved.