このドキュメントで説明されているソフトウェアはサポートされていないか、拡張サポートが提供されています。
現在サポートされているリリースにアップグレードすることをお薦めします。

4.4 DockerfileからのDockerイメージの作成

Dockerfileに含まれている定義からDockerfileイメージを作成するには、docker buildコマンドを使用します。

次の例は、oraclelinux:6イメージをベースとするタグv2の付いたmymod/httpdという名前のイメージをビルドして、Apache HTTPサーバーが実行できるようにする方法を示しています。

DockerfileからDockerイメージを作成する手順:

  1. 次のようにして、Dockerfileの生成先ディレクトリを作成します。

    # mkdir -p /var/docker_projects/mymod/httpd
    注意

    イメージから作成するコンテナのデプロイ先と同じシステムにDockerfileを作成する必要はありません。 唯一の要件は、Docker EngineがDockerfileファイルにアクセスできることです。

  2. 新しいディレクトリに、通常はDockerfileという名前が付けられるDockerfileを作成します。 次のDockerfileのコンテンツは、この例専用です。

    # Dockerfile that modifies oraclelinux:6 to include an Apache HTTP server
    FROM oraclelinux:6
    MAINTAINER A N Other <another@example.com>
    RUN sed -i -e '/^\[main\]/aproxy=http://proxy.example.com:80' /etc/yum.conf
    RUN yum -y install httpd
    RUN echo "HTTP server running on guest" > /var/www/html/index.html
    EXPOSE 80
    ENTRYPOINT /usr/sbin/httpd -D FOREGROUND

    先頭行の#接頭辞は、その行がコメントであることを示します。 その他の行は次の命令キーワードで始まり、Dockerによるイメージの作成方法を定義します。

    ENTRYPOINT

    イメージから作成されたコンテナが常に実行するコマンドを指定します。 この例では、/usr/sbin/httpd -D FOREGROUNDがコマンドで、HTTPサーバー・プロセスを開始します。

    EXPOSE

    指定されたポートが着信リクエストに対応できることを示します。 docker run-pオプションまたは-Pオプションを使用すると、このポートをホストの別のポートにマップできます。 または、docker run--linkオプションを使用すると、別のコンテナがDockerの内部ネットワーク経由でポートにアクセスできます(4.6項「Dockerコンテナ間の通信」を参照)。

    FROM

    Dockerが新しいイメージのベースとして使用するイメージを定義します。

    MAINTAINER

    Dockerfileの管理者を定義します。

    RUN

    新しいイメージを変更する際にDockerが実行するコマンドを定義します。 この例では、RUN行でWebプロキシを設定し、httpdパッケージをインストールして、サーバー用の簡易ホーム・ページを作成します。

    Dockerfileで使用できるその他の指示の詳細については、https://docs.docker.com/engine/reference/builder/を参照してください。

  3. docker buildコマンドを使用してイメージを作成します。

    # docker build --tag="mymod/httpd:v2" /var/docker_projects/mymod/httpd/
    Sending build context to Docker daemon 2.048 kB
    Step 1 : FROM oraclelinux:6
     ---> 768a3d7b605a
    Step 2 : MAINTAINER A N Other <another@example.com>
     ---> Running in bc28c7b6babf
     ---> 0eb554ad6a7b
    Removing intermediate container bc28c7b6babf
    Step 3 : RUN sed -i -e '/^\[main\]/aproxy=http://proxy.example.com:80' /etc/yum.conf
     ---> Running in 4bd1305ab0fc
     ---> 328ff7b80dc0
    Removing intermediate container 4bd1305ab0fc 
    Step 4 : RUN yum -y install httpd
     ---> Running in 991bcace0d34
    Loaded plugins: security, ulninfo
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package httpd.x86_64 0:2.2.15-53.0.1.el6 will be installed
    --> Processing Dependency: httpd-tools = 2.2.15-53.0.1.el6 for package: httpd-2.2.15-53.0.1.el6.x86_64
    .
    .
    .
    Installed:
      httpd.x86_64 0:2.2.15-53.0.1.el6                                              
    
    Dependency Installed:
      apr.x86_64 0:1.3.9-5.el6_2             apr-util.x86_64 0:1.3.9-3.el6_0.1     
      apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 httpd-tools.x86_64 0:2.2.15-53.0.1.el6
      mailcap.noarch 0:2.1.31-2.el6         
    
    Complete!
     ---> 153b5fa6ba92
    Removing intermediate container 991bcace0d34
    Step 5 : RUN echo "HTTP server running on guest" > /var/www/html/index.html
     ---> Running in 0a9d54558627
     ---> 6409e3ae11e1
    Removing intermediate container 0a9d54558627
    Step 6 : EXPOSE 80
     ---> Running in da51ae63fbe0
     ---> d16342a6b776
    Removing intermediate container da51ae63fbe0
    Step 7 : ENTRYPOINT /usr/sbin/httpd -D FOREGROUND
     ---> Running in 221988caab1c
     ---> 6df513b1c3d1
    Removing intermediate container 221988caab1c
    Successfully built 6df513b1c3d1

イメージがビルドされたら、newguest2という名前のコンテナ・インスタンスを作成してテストできます。

[root@host ~]# docker run -d --name newguest2 -P mymod/httpd:v2
31b334b9933cfbec71d7bc4f723c352c8de842823505b6f11a08bf960e0398e7
注意

/usr/sbin/httpd -D FOREGROUNDはコンテナに組み込まれているので、このコマンドを指定する必要はありません。

-Pオプションは、Dockerがゲストによって公開されたポートをホストの49000から49900までの範囲にある使用可能なポートにマップする必要があることを指定します。

docker inspectを使用すると、DockerがTCPポート80にマップするホスト・ポートが返されます。

[root@host ~]# docker inspect --format='{{ .NetworkSettings.Ports }}' newguest2
map[80/tcp:[map[HostIp:0.0.0.0 HostPort:49153]]]

この例では、ゲストのTCPポート80はホストのTCPポート49153にマップされています。

ゲストが提供しているWebコンテンツを表示するには、ブラウザがホストのポート49153を参照するように指定します。 別のシステムからコンテンツにアクセスする場合は、ホストのポートに対する着信接続の許可が必要になる可能性があります。

たとえば、iptablesルールを作成してポートを開くことができます:

[root@host ~]# iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 49153 -j ACCEPT
[root@host ~]# service iptables save

curlを使用して、サーバーが機能していることをテストすることも可能です。

[root@host ~]# curl http://localhost:49153
HTTP server running on guest
[root@host ~]# ssh auser@10.0.0.23
auser@10.0.0.23's password: password
Last login: Fri Aug 29 13:48:58 2014 from 192.168.0.1
[auser@10.0.0.23 ~]$ curl 192.168.0.2:49153
HTTP server running on guest