第9回 Dockerfileで“インフラストラクチャ・アズ・コード”を体験古賀政純の「攻めのITのためのDocker塾」(2/4 ページ)

» 2015年09月30日 08時00分 公開

Dockerfileを使ってDockerイメージを生成

 では、このDockerfileを使ってDockerイメージを生成してみましょう。今回のDockerfileでは、インターネットに接続されている必要があります。また、インターネットへの接続にプロキシサーバを利用していない場合は、上記のDockerfile中のhttp_proxyとhttps_proxyの設定の2行は不要ですので削除してください。今回作成するDockerイメージの名前は「c66apache0002」とします。Dockerfileが存在する作業用の/root/c66apacheディレクトリで、以下のように入力します。

# docker build -t centos:c66apache0002 .

 これでApache Webサーバ入りのDockerイメージc66apache0002が生成されました。簡単にオプションを解説しておくと、docker buildでDockerイメージをビルドするという意味になります。-tオプションは、Dockerイメージに付与するタグです。生成するDockerイメージの名前と思って差し支えありません。最後のドット「.」は、このディレクトリに存在するDockerfileをロードし、ビルドを行うためのディレクトリパスの設定です。Dockerイメージが作成されているかをホストOS上で確認してみましょう。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              c66apache0002       f69ee32d2ffe        4 minutes ago       232.6 MB
centos              centos6.6           8b44529354f3        4 months ago        202.6 MB

 Dockerイメージcentos:centos6.6がCentOS 6.6のOSイメージ、centos:c66apacehe0002が今ビルドしたApache Webサーバ入りのDockerイメージです。他の開発者や構築担当者は、このDockerイメージを再利用することで、すぐにWebサーバを構築・利用することができます。Apache Webサーバー入りのDockerコンテナweb0001を起動させてみましょう。

# docker run -i -t -d --name web0001 centos:c66apache0002

ホストOSから、docker execにより、起動したDockerコンテナweb0001のIPアドレスを調べ、curlコマンドでWebコンテンツtest.htmlにアクセスできるか確認してください。

# docker exec -i -t web0001 ip a |grep inet
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    inet 172.17.0.23/16 scope global eth0
    inet6 fe80::42:acff:fe11:9/64 scope link
# curl http://172.17.0.23/test.html
Hello Apache.

ビルド時間が短縮されていることを実感する

 先述のDockerfileが完成し、無事Webサーバ入りのDockerコンテナが起動できました。続いて、別のDockerイメージをビルドしてみましょう。Dockerfileが含まれる作業用ディレクトリ/root/c66apacheを別の名前でコピーしておきます。

# cp -a /root/c66apache /root/c66apache02

 新しく作った作業ディレクトリ/root/c66apache02で、Dockerfileを以下のように編集します。

 先程のDockerfileに、「RUN echo "Hello Docker." >> /var/www/html/test.html」を追加します。ただし、それ以外の行は、一切編集しないで下さい。追加する行以外で、スペースを入れることや、タブを入れるなどの編集もしないでください。

# cd /root/c66apache02
# vi Dockerfile
FROM centos:centos6.6
MAINTAINER Masazumi Koga
ENV container docker
ENV http_proxy http://proxy.your.site.com:8080
ENV https_proxy http://proxy.your.site.com:8080
RUN yum update -y && yum clean all
RUN yum install -y httpd && yum clean all
RUN echo "Hello Apache." > /var/www/html/test.html
RUN echo "Hello Docker." >> /var/www/html/test.html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/httpd","-DFOREGROUND"]

 Dockerfileを作成したら、Dockerイメージ「centos:c66apache0003」をビルドしてみます。

# docker build -t centos:c66apache0003 .
...

 今度は、先程と比べて非常に短い時間でビルドされたと思います。Dockerfileでは、既存のDockerイメージのキャッシュを使って、編集が行われた行以降が実行されるようになっているため、ビルド時間を大幅に短縮できるのです。逆に、既存のDockerイメージのキャッシュを使わずに、Dockerfileのはじめからビルドしたいという場合は、以下のように、--no-cache=trueを付与してください。

# docker build -t centos:c66apache0003 --no-cache=true .

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ