【図解】Dockerfileとは?概要や記述方法を詳しく解説!
thumb_dockerfile_01
【図解】Dockerfileとは?概要や記述方法を詳しく解説!
アンドエンジニア編集部
2023.03.26
この記事でわかること
Dockerは、イメージを実行するコンテナを管理するプラットフォームソリューションです
Dockerfileは、Dockerイメージを作成するための手順書です
テキスト形式のため編集が簡単で、ベースイメージを利用したカスタマイズが容易です

Dockerfileとは

img_dockerfile_01

Dockerfileとは、Dockerイメージを作成するための手順書を指します。ファイルはテキスト形式ですので、構文に従い手順を記述していきます。ここでは、概要から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の運用までの手順

img_dockerfile_02

冒頭にDockerfileの役割を理解するために、Dockerの運用に関係する一連の流れを整理しておきます。次の図をご覧ください。

img_dockerfile_03
【図】:Docker運用におけるイメージの格納から活用まで

ここからは図の黄色いブロックで分類した処理を、左から順に3つの項目に分けて解説します。

リポジトリを利用する

図中の「リポジトリの参照と利用」をご覧ください。

img_dockerfile_04
【図】:リポジトリを利用する

Dockerでは、ゼロからイメージを作成することなく、Docker Hubなどの公式リポジトリからダウンロードして使用することができます。そのために、イメージの検索や格納のコマンドが用意されています(①②)。変更する必要がなければ、そのまま、Dockerで実行することが可能です。

Dockerfileを作成する

図中の「Dockerfileの作成と編集・イメージのビルド」をご覧ください。

img_dockerfile_05
【図】:Dockerfileを作成する

Dockerのイメージを作成するには、設計図となるDockerfileが必要です。Dockerfileは拡張子を含みませんがテキストファイルとして作成、編集が可能です(③⑤)。ファイル中に記述する命令と用法が定義されています。Dockerfileの配置場所としては、任意の場所で作成からビルド・実行を行います。

ファイルにはベースイメージを指定することが可能です。基準となるイメージに命令を追加してカスタマイズすることができます(④)。すべてを新たに記述するよりは、Docker Hubに登録済みのイメージをカスタマイズすることで、短期間で高品質の実行環境を構築することが可能です。

イメージを利用する

図中の「イメージの利用と再利用」をご覧ください。

img_dockerfile_06
【図】:イメージを利用する

Dockerfileを作成した場合は、ビルドコマンドでイメージを生成します。イメージは、Dockerで実行することもできますし、リポジトリに公開して再利用を促すこともできます(⑥⑦)。同じ設定で多くのコンテナを起動したり、カスタマイズしたりします。バージョンアップも容易に行うことができます。

エンジニア初心者でも分かる!Dockerコンテナの超入門!

Dockerfileを作成する

img_dockerfile_07

Dockerfileを作成するには、最低限いくつかの命令(コマンド)を知っておくと良いでしょう。必要となる基本命令を、次の図に整理します。

img_dockerfile_08
【図】: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 ”とするか、”ENV =”で指定します。変数が複数の場合は、キーバリュー形式でまとめて記述することで1行で複数の指定が可能です。

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の具体例

img_dockerfile_09

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」をクリックすると、イメージの情報が表示されます(②)。

img_dockerfile_10
【図】:Docker Desktopでイメージを確認する

イメージの表示画面の上部では、「image hierarchy」に参照しているFROM命令が順に表示されています。

getting-startedのコマンドを確認する

イメージの表示画面の下部には、次の図のようにDockerfileで記述した命令がレイヤー表示されています。右側に拡大して全体を表示しておきます。このように起動しているイメージの命令も確認することができます。

img_dockerfile_11
【図】:イメージで用いるコマンドを確認する

さらに次の図のように、該当する命令(コマンド)をクリックすると、右側「Command」欄に実際に記述した命令が表示されます(①②)。このように細かく動作を確認することもできます。

img_dockerfile_12
【図】:イメージで用いるコマンドを確認する(続き)

これらの情報は、コマンドラインで確認することができます。次の図をご覧ください。この図のように、”docker images”でイメージIDを取得し、”docker history イメージID”で詳細情報を確認します(①②)。

ここでは”<missing”と表示される項目がありますが、気にする必要がありません。レイヤが他のシステムにおいてビルドされていることを示すものです。

img_dockerfile_13
【図】:イメージで用いるコマンドをコマンドラインで確認する

Dockerfileはシンプルで再利用しやすいことが分かります

img_dockerfile_14

Docker運用に必要な設計図はDockerfileを作成するだけです。Dockerの公式イメージを用いて最低限のカスタマイズのみで稼働させることもできます。このメリットを享受するためにも、この機会にDockerfileを作成してみてはいかがでしょうか。

Dockerのメリットを徹底解説!仮想マシンとは何が違う?
Dockerイメージとコンテナの違いとは?作成の流れ入門
気になる人のXをフォローしよう!
アンドエンジニア公式LINEでは
新着記事やエンジニアに役立つ情報をお届け!
日々のキャッチアップをお手伝いします!
マイナビITエージェント

編集部オススメコンテンツ

Sponsored
【無料個別転職相談会】アプリケーションエンジニア向け!リモート・在宅勤務で働きたい方へ
マイナビITエージェント
Sponsored

アンドエンジニアへの取材依頼、情報提供などはこちらから

お問い合わせ・情報提供
はじめて転職される方へ
SE・システムエンジニア(IT/通信/インターネット) 求人一覧

編集部おすすめコンテンツ

Sponsored
【無料個別転職相談会】アプリケーションエンジニア向け!リモート・在宅勤務で働きたい方へ
マイナビITエージェント
Sponsored

アンドエンジニアへの取材依頼、情報提供などはこちらから

Powered by マイナビ AGENT