読者です 読者をやめる 読者になる 読者になる

Dockerfile を作ってみよう

Docker

今度は、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 の作成にはまだまだ沢山の機能があるのですが、まずはとっかかりとして単純な例として本記事を書いてみました。
より詳しい応用へのとっかかりになると幸いです。