Dockerfile を作ってみよう

今度は、Docker イメージの制作者になってみましょう。
DockerHub 等で自分の作成したイメージを配る側の立場になってみましょう。


前回と同じく、前提として、あなたは Ubuntu 14.04(192.168.0.1) を利用しているとします。


Dockerfile とは・・・簡単に言うと、OS のコマンドの羅列です。
今回は、nginx をインストールし、デフォルトの index.html をカスタマイズした Docker イメージを作成してみましょう。

次のような Dockerfile を作成してください(名前を Dockerfile にし、拡張子はつけない)

FROM ubuntu:14.04

RUN apt-get install -y nginx
ADD index.html /usr/share/nginx/html/index.html

CMD service nginx start && tail -F /var/log/nginx/access.log

簡単ですね。
Dockerfile には、まず FROM でどの OS を基にしてイメージを作るのかを書きます。
そして、RUN コマンドで、その OS に対するコマンドを列挙していきます。
(今回は RUN は一個だけですが・・・・)
ただただそれだけです。


前準備として、Ubuntu 14.04(192.168.0.1) に /root/index.html を作成してください。
このファイルは、Docker 実行時にカスタマイズされた index.html として表示される html になります。

ADD index.html /usr/share/nginx/html/index.html

というのは、Ubuntu 14.04(192.168.0.1) の index.html ファイル(後に Docker build を実行するカレントディレクトリに存在する index.html ファイル)を、仮想コンテナの /usr/share/nginx/html/index.html に配置する、という命令になります(仮想コンテナ側にファイルが存在する場合は上書きされます)
つまりこの Dockerfile は、nginx を apt-get でインストールした後、/usr/share/nginx/html/index.html をカスタマイズしたもので上書くものになります。


作成した Dockerfile を、/root/Dockerfile として作成したとします。

cd /root
docker build -t mynginx .

と入力してみてください。これは、. ディレクトリ (/root) の Dockerfile を build し、mynginx と名前を付ける、という命令になります。
Dockerfile 内に記述したコマンドの実行結果がコンソールに表示され、最後に

Successfully built 122decba5d6b

などと表示されれば成功です。
docker images
と実行してみましょう。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mynginx             latest              122decba5d6b        3 minutes ago       211.1 MB

と表示されると思います。
実行は、前回の記事と同様です。

docker run -it -p 192.168.0.1:81:80 mynginx

とします。

CMD service nginx start && tail -F /var/log/nginx/access.log

の説明がまだでした。
これは、docker run 時に実行されるコマンドです。
docker build 時には実行されません(docker build 時に実行されるのは、RUN コマンドです)

上記 docker run 実行時に、CMD に指定されているコマンド(nginx の起動、およびアクセスログの tail)が実行される、という仕組みです。
この mynginx コンテナを配布することにより、誰もがすぐにあなたがカスタマイズした nginx を実行することが可能になります。
(DockerHub やプライベートリポジトリへの配布方法は、他の方の記事を参考にしてください。色々方法がありますが、一番普通なのは mynginx の名前を変えて push する方法です)


いかがでしたでしょうか?
Dockerfile の作成にはまだまだ沢山の機能があるのですが、まずはとっかかりとして単純な例として本記事を書いてみました。
より詳しい応用へのとっかかりになると幸いです。