Dockerfileとは
Dockerfileとは、Dockerイメージを作成するための手順書を指します。ファイルはテキスト形式ですので、構文に従い手順を記述していきます。ここでは、概要からDockerイメージのビルドに必要な命令や構文を解説していきます。
【参考】:Docker ドキュメント日本語化プロジェクト 【参考】:Docker
Dockerの概要
Dockerとは、仮想化実行環境を実現するプラットフォームソリューションを指します。Dockerの特徴は、実行環境をイメージとして登録できることです。同一のイメージを利用することで、繰り返し行うシステム導入作業が自動化され、システムの複製や管理を効率的に行うことができます。
【参考】:Docker
Dockerfileの概要
Dockerfileは、Dockerイメージを作成するための手順書ですが、自動化のための設計図とも言えます。ファイルはテキスト形式ですので、作成や編集管理が簡単です。ファイルとして保存できるため、問題発生時の対処をスムーズに行うことができます。
Dockerfileはレイヤー化されており、ベースのイメージを用いて追記していくことが可能です。Dockerコンテナ全体から見ると、変更管理もしやすく自動化に適しています。バージョンアップにも対応可能ですので、作成方法を覚えておくのが良いでしょう。
Docker Composeとは
Docker Composeとは、複数のコンテナを定義し実行するツールを指します。YAML形式のファイルを用いて、アプリケーションサービスの生成や起動が効率的に行うことができます。
コマンド1つで、本番稼働のワークフローを効率化することが可能です。大規模で複雑な運用を行う場合に、効率的なワークフローを実現します。
Docker Composeに必要なのは、Dockerfileとdocker-compose.ymlです。Dockerfileとの直接的な違いは、YAMLファイルが追加で必要となる点です。それだけで、ライフサイクルで求められるサービスの生成から起動、管理まで対応します。
【参考】:Overview of Docker Compose
Dockerの運用までの手順
冒頭にDockerfileの役割を理解するために、Dockerの運用に関係する一連の流れを整理しておきます。次の図をご覧ください。
ここからは図の黄色いブロックで分類した処理を、左から順に3つの項目に分けて解説します。
リポジトリを利用する
図中の「リポジトリの参照と利用」をご覧ください。
Dockerでは、ゼロからイメージを作成することなく、Docker Hubなどの公式リポジトリからダウンロードして使用することができます。そのために、イメージの検索や格納のコマンドが用意されています(①②)。変更する必要がなければ、そのまま、Dockerで実行することが可能です。
Dockerfileを作成する
図中の「Dockerfileの作成と編集・イメージのビルド」をご覧ください。
Dockerのイメージを作成するには、設計図となるDockerfileが必要です。Dockerfileは拡張子を含みませんがテキストファイルとして作成、編集が可能です(③⑤)。ファイル中に記述する命令と用法が定義されています。Dockerfileの配置場所としては、任意の場所で作成からビルド・実行を行います。
ファイルにはベースイメージを指定することが可能です。基準となるイメージに命令を追加してカスタマイズすることができます(④)。すべてを新たに記述するよりは、Docker Hubに登録済みのイメージをカスタマイズすることで、短期間で高品質の実行環境を構築することが可能です。
イメージを利用する
図中の「イメージの利用と再利用」をご覧ください。
Dockerfileを作成した場合は、ビルドコマンドでイメージを生成します。イメージは、Dockerで実行することもできますし、リポジトリに公開して再利用を促すこともできます(⑥⑦)。同じ設定で多くのコンテナを起動したり、カスタマイズしたりします。バージョンアップも容易に行うことができます。
Dockerfileを作成する
Dockerfileを作成するには、最低限いくつかの命令(コマンド)を知っておくと良いでしょう。必要となる基本命令を、次の図に整理します。
それぞれの目的と使用方法は以下の通りです。具体的な書き方も、例として併せて紹介します。
・FROM ベースとなるDockerイメージを指定します。イメージビルド時の処理ステージを初期化するために使用します。この命令は、ARGを除いて最初に記述する必要があります。
例:FROM base:latest
・COPY 指定するファイルやディレクトリをコピーし、コンテナ内のパスに追加します。
例:COPY files /somedir/
・RUN コマンドを実行し、処理結果を次のステップで使用します。その後、ビルドイメージを確定します。命令の記述は、シェル実行形式、またはexec形式で記載します。
例:RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' RUN ["/bin/bash", "-c", "echo hello"]
・CMD コンテナ実行時のデフォルトの処理で、イメージが起動されたときに実行する命令です。設定するために、一つだけ記述します。複数ある場合は、最後の1つのみが実行されます。いくつか書式があり、シェル実行形式やENTRYPOINTのデフォルトパラメータ、exec形式で記載します。
例:CMD ["/bin/sh"]
【参考】:Dockerfile リファレンス
その他のDockerfileの命令
Dockerfileでは次のような命令(コマンド)も定義されています。要望に応じて記述することができます。
・LABEL イメージにメタデータを追加する命令で、<key>=<value>とキーバリュー形式で記述します。
例:LABEL version=”1.1”
・EXPOSE コンテナ実行時のネットワークのリッスンポートを指定できます。TCPかUDP、そしてポート番号を指定します。
例:EXPOSE 80/tcp
・ENV
環境変数に値を設定します。一度に複数の変数を指定できます。変数が1つの場合は”ENV
・ADD 指定するファイルやディレクトリ・リモートファイルのURLを指定のパスに追加します。
例:ADD files /somedir/
・ENTRYPOINT コンテナを実行モジュールのように実行する場合に設定します。シェル実行形式またはexec形式で記載します。exec形式が推奨される形式です。Dockerfileには、CMDまたはENTRYPOINTのいずれかが必要です。
・VOLUME 指定した名称でマウントポイントを生成します。
例:VOLUME ["/data"]
・USER ユーザ名と、必要に応じてユーザグループを指定し、実行することができます。
例:USER <ユーザ>[:<グループ>]
・WORKDIR RUN、CMD、ENTRYPOINTで用いるワークディレクトリを指定します。
例:WORKDIR /work
・ARG ビルド時にユーザーが渡す変数を宣言します。ARGはFROMの前に記述することもできます。
例:ARG VERSION=latest FROM base:${VERSION}
【参考】:Dockerfile リファレンス
Dockerfileの具体例
Dockerfileの書き方を理解するには、公式サイトのリファレンスやベスト・プラクティスを活用すると良いでしょう。具体例としてサンプルアプリケーションを動作させれば、より理解度が深まります。
【参考】:Dockerfile リファレンス 【参考】:Dockerfile のベスト・プラクティス 【参考】:Docker Get started サンプル・アプリケーション 【参考】:Docker サンプル アプリケーション
getting-startedを起動してみる
ここでは、Dockerのドキュメントに最初に登場するgetting-startedを起動してみます。Dockerのダウンロードとインストールが完了して、最初に実行するサンプルです。起動方法は、次の様に行います。
docker run -d -p 80:80 docker/getting-started
“-p 80:80”はコンテナ内のポート番号80とホストのポート番号80を指定していますが、必要に応じて変更して起動します。起動すると、コンソールアクセスやウェブアクセスが可能となります。例えば、Docker Desktopからは次の図のようにコンテナが表示されます(①)。
コンテナの「image」をクリックすると、イメージの情報が表示されます(②)。
イメージの表示画面の上部では、「image hierarchy」に参照しているFROM命令が順に表示されています。
getting-startedのコマンドを確認する
イメージの表示画面の下部には、次の図のようにDockerfileで記述した命令がレイヤー表示されています。右側に拡大して全体を表示しておきます。このように起動しているイメージの命令も確認することができます。
さらに次の図のように、該当する命令(コマンド)をクリックすると、右側「Command」欄に実際に記述した命令が表示されます(①②)。このように細かく動作を確認することもできます。
これらの情報は、コマンドラインで確認することができます。次の図をご覧ください。この図のように、”docker images”でイメージIDを取得し、”docker history イメージID”で詳細情報を確認します(①②)。
ここでは”<missing”と表示される項目がありますが、気にする必要がありません。レイヤが他のシステムにおいてビルドされていることを示すものです。
Dockerfileはシンプルで再利用しやすいことが分かります
Docker運用に必要な設計図はDockerfileを作成するだけです。Dockerの公式イメージを用いて最低限のカスタマイズのみで稼働させることもできます。このメリットを享受するためにも、この機会にDockerfileを作成してみてはいかがでしょうか。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから