Dockerfileでイメージ作成を自動化

新規イメージを作成する作業を自動化するなら、その内容をDockerfileにまとめて、docker buildコマンドを使う。


Dockerfile

ファイル名はここではデフォルトのままDockerfileとする。Dockerfileは「指令 引数」という単純な書式のテキストファイル。これを含むディレクトリでdocker build --tag 新イメージ名:タグ .とすると、自動的にビルドして新イメージができる。「指令」の種類は15個程度。


.dockerignore

上記のようにdocker buildするとき、そのカレントディレクトリがDockerサーバに送られるため、/(ルートディレクトリ)とかではビルドしないこと。

通常は空のディレクトリにDockerfileを作り、ビルドに必要なものだけ入れる。特に除外したいものがあれば.dockerignoreという名前のファイルにそのパターン(パス)を記述する。

.dockerignore

#から始まればコメント
.git
temp*

# こうするとDockerサーバには送信されるが、COPY・ADD指令では除外
Dockerfile
.dockerignore

httpdを起動するDockerfileの例

以下ではcentos:7イメージをベースにhttpdをインストールし、デフォルトでhttpd -D FOREGROUNDが実行されるイメージ「myhttpd」を作成する。

専用ディレクトリを作る

mkdir myhttpd; cd myhttpd
touch Dockerfile

# index.htmlを作る
echo 'Hello, Dockerfile!' > index.html

Dockerfile

#から始まる行はコメント、空行は無視される
# \で改行をエスケープ(なかったことに)できる

# ベースとなるCentOS7イメージ
FROM centos:7

# アップデートするなら
# RUN yum --assumeyes update

# httpdをインストール
RUN yum --assumeyes install httpd

# コンテナへコピー: ホストパス コンテナパス
COPY index.html /var/www/html/index.html

# デフォルトのコマンド: コンテナ起動時に実行する
CMD httpd -D FOREGROUND

ビルド

# 末尾の.を忘れずに
docker build --tag myhttpd:latest .

(中略)
Successfully built dccddcea6cb8
Successfully tagged myhttpd:latest

上記のビルドが初めての場合はインストールなど実行で時間がかかるが、ビルドはデフォルトでキャッシュを利用し差分管理なので、次回からは速い。タグ名を変えて再度ビルドしてみると、

docker build --tag myhttpd:temp .

(中略)
Step 2/4 : RUN yum --assumeyes install httpd
 ---> Using cache

# すぐ完了

コンテナ実行

docker run --rm -dit --name test --publish 80:80 myhttpd

# 動作確認
curl localhost
Hello, Dockerfile!

# コンテナ停止
docker stop test