(最終更新日:2023年8月)
✔当記事は以下のような方に向けて書かれています
「Dockerfileが何をするものなのか詳しく知りたい」
「Dockerfileの書き方を学びたい」
「具体的なDockerfileの例を見て理解を深めたい」
✔当記事で得られる知識
- Dockerfileの基本的な概念
- Dockerfileの書き方とその適用法
- 具体的なDockerfileの例
当記事では、Dockerfileの基本から応用まで、各種の実例を交えて詳細にご解説します。
終始お読みいただくことにより、Dockerfileへの理解が一層深まるでしょう。
どうぞ最後までご覧ください。
✔手を動かして学びたい方へ
Dockerfileの基本について、動画で一から解説しています。
実際にDockerfileを作って、コンテナを起動するまでわずか30分でマスター
ぜひご覧ください。
Dockerfileとその魅力
こちらでは、「Dockerfile」とその魅力についてお伝えしていきます。
- Dockerfileの役割と魅力
- DockerfileによるDockerイメージ作成の手法
Dockerfileの役割と魅力
Dockerfileは、Dockerイメージを作成するためのスクリプトです。
簡単なテキストファイルですが、自動でDockerイメージを作れるのがその特徴。
たとえばOSの設定やアプリケーションのインストール、データのインポートなど、一貫した環境を構築する手間を大幅に軽減できます。
DockerfileによるDockerイメージ作成の手法
Dockerfileはいくつかの基本コマンドを組み合わせることで、Dockerイメージを作成します。
これらのコマンドは、FROMで始まるベースイメージの指定や、RUNでのコマンド実行など、一連の手順を定義することで環境を再現可能なイメージとして保存します。
以下はPythonベースのフレームワーク「Django」のサーバーを立ち上げるためのDockerイメージの例です。
FROM python:3.8
SHELL ["/bin/bash", "-c"]
WORKDIR /app
RUN ["apt-get", "update"]
COPY requirements.txt ./
RUN ["pip3", "install", "--no-cache-dir", "-r", "/app/requirements.txt"]
RUN pip freeze
COPY src ./src
EXPOSE 8000
CMD ["/app/src/manage.py", "runserver", "0.0.0.0:8000"]
Dockerfileの作成と活用
以下では、Dockerfileの作成方法とその活用方法について詳しく説明します。
- 初心者向け:Dockerfileの作成手順
- DockerfileでDockerイメージを作る方法
- イメージからコンテナを起動
初心者向け:Dockerfileの作成手順
Dockerfileの作成は非常に簡単です。
まずテキストファイルを作成し、その中にDockerfileという名前をつけます。
次に、そのファイルの中に必要なコマンドを順に書き加えていきます。
最初は「FROM」というコマンドから始め、ベースとなるイメージを指定します。
#ベースとなるイメージを宣言
FROM python:3.8
#シェルを指定
SHELL ["/bin/bash", "-c"]
#コンテナ内で使用するディレクトリを指定
WORKDIR /app
#ソフトウェアアップデート
RUN ["apt-get", "update"]
#PC上の「requirements.txt」を、WORKDIR上にコピー
COPY requirements.txt ./
#pipインストールの実行
RUN ["pip3", "install", "--no-cache-dir", "-r", "/app/requirements.txt"]
#build中に確認できるように表示
RUN pip freeze
#PC上のsrcファイルをWORKDIR内にコピー
COPY src ./src
#コンテナのポート8000を公開
EXPOSE 8000
#dockerコンテナ起動時に実行するコマンド
CMD ["/app/src/manage.py", "runserver", "0.0.0.0:8000"]
DockerfileでDockerイメージを作る方法
Dockerfileが作成されたら、’docker build’コマンドを使ってDockerイメージを作成します。
docker build -t djangoprj . --network host --progress plain --no-cache
ここでのポイントは、以下のとおり。
- ‘-t’オプションでイメージに名前を付ける「djangoprj」
- 「.」はカレントディレクトリにDockerファイルがあることを示す
- –network hostで、PCのネットワーク環境を使い、必要なアップデート等をおこなう
- –progressで進捗を確認
作成したイメージは’docker images’コマンドで確認できます。
作成したイメージからコンテナを起動
作成したイメージからコンテナを起動するには、以下のコマンドを入力します。
docker run -p 8000:8000 --name djangodockecontainer -d djangoprj
アクセスすると以下のとおりです。
Dockerfileのコマンド一覧と活用のポイント
Dockerfileについて、詳しく見ていきます。
数あるコマンドを使いこなすことで、より具体的なDockerイメージが作れるようになります。
- Dockerfileのコマンド一覧
- パフォーマンス向上No.1:キャッシュ活用
- パフォーマンス向上No.2:イメージ最適化
Dockerfileのコマンド一覧
Dockerfileでは、多数のコマンドを用いて、Dockerイメージを定義します。
各コマンドはそれぞれ異なる役割を持ち、一緒に組み合わせることで複雑なアプリケーション環境を再現できるのです。
コマンド | 説明 | 例 |
---|---|---|
FROM | ベースとなるイメージを指定します。 | FROM ubuntu:18.04 |
RUN | イメージのビルド時に実行するコマンドを指定します。 | RUN apt-get update |
CMD | コンテナの起動時に実行するコマンドを指定します。 | CMD ["python", "app.py"] |
EXPOSE | コンテナ内で公開するポートを指定します。 | EXPOSE 8080 |
ENV | 環境変数を設定します。 | ENV MY_VAR my_value |
ADD | ホストのファイル/ディレクトリをコンテナにコピーします。 | ADD . /app |
COPY | ADD と同様にコピーしますが、圧縮ファイルの解凍などの追加機能はありません。 | COPY . /app |
ENTRYPOINT | コンテナのデフォルト実行コマンドを設定します。 | ENTRYPOINT ["python", "app.py"] |
VOLUME | 永続的なデータボリュームをコンテナにマウントします。 | VOLUME ["/data"] |
WORKDIR | 作業ディレクトリを設定します。コマンドの実行パスとして使われます。 | WORKDIR /app |
LABEL | イメージにメタデータを追加します。 | LABEL version="1.0" |
ARG | ビルド時にパラメータを渡すことができる変数を定義します。 | ARG version |
USER | コンテナ内でコマンドを実行するユーザーを指定します。 | USER root |
HEALTHCHECK | コンテナのヘルスチェックを設定します。 | HEALTHCHECK CMD curl --fail http://localhost:80/ || exit 1 |
SHELL | シェルを変更する際に使用します。 | SHELL ["/bin/bash", "-c"] |
これらのコマンドはDockerfileの中で使われるもので、イメージのビルドプロセスを定義する際に使用します。
パフォーマンス向上No.1:キャッシュ活用
Dockerはイメージのビルドプロセス中に各手順ごとに中間イメージをキャッシュします。
このキャッシュ機構により、前回ビルドした際と同じ手順を再実行する必要がなくなり、大幅にビルド時間を削減できるのです。
以下、具体的な例とともに詳しく見てみましょう。
Dockerfileの例
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y python3 python3-pip
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
CMD ["python3", "app.py"]
このDockerfileでのビルドプロセスを考えます。
FROM
コマンド
ベースとなるイメージを指定。ここではubuntu:18.04
をベースとしています。RUN
コマンド (apt-get update)
パッケージリストを更新。このコマンドが実行されると、キャッシュが生成されます。RUN
コマンド (apt-get install)
必要なPythonのパッケージをインストールします。この手順もキャッシュされます。COPY
コマンド
ローカルのファイルをコンテナにコピーします。ここでコピーされるファイルに変更がない場合、この手順もキャッシュされます。WORKDIR
コマンド
作業ディレクトリを設定します。この設定もキャッシュされます。RUN
コマンド (pip3 install)
必要なPythonライブラリをインストールします。requirements.txt
が変更されない限り、この手順もキャッシュされます。CMD
コマンド
コンテナ起動時に実行するコマンドを指定します。
キャッシュの効果
このDockerfileで何度もビルドをおこなう場合、前回のビルドで実行した同じ手順はキャッシュから取得されます。
例えば、requirements.txt
の内容が変更されなければ、Pythonのライブラリのインストール手順はキャッシュから取得され、再実行されません。
キャッシュの効果により、ビルド時間を大幅に削減できるのです。
注意点
Dockerにおけるキャッシュについて、以下が注意点です。
- キャッシュは手順の実行結果を保存するため、その手順以前に変更がある場合、その手順以降のキャッシュは無効となります。
- キャッシュ機構をうまく活用するためには、変更が少ない手順をDockerfileの上部に配置すると効果的です。
Dockerのキャッシュ機構はビルドプロセスを効率的におこなう強力な機能で、よく理解して活用すると、開発の迅速化につながります。
パフォーマンス向上No.2:イメージ最適化
Dockerイメージのサイズ最適化は重要な要素であり、開発からデプロイメントにかけて多くの利点があります。
イメージサイズを小さくすると、ストレージの使用量を削減したり、イメージの転送やデプロイ時間を短縮したりが可能です。
以下は、イメージのサイズを最適化するための手法と具体例を含んでいます。
不要なファイルを削除する
イメージをビルドする過程で、一時的にしか使用しないファイルやパッケージがある場合、ビルド後にそれらを削除しましょう。
FROM ubuntu:18.04
RUN apt-get update && \
apt-get install -y gcc make && \
make /app/build && \
apt-get remove -y gcc make && \
rm -rf /var/lib/apt/lists/*
この例では、ビルドに必要なgcc
とmake
をインストールした後、使用が終わったら削除しています。
また、apt-get
の一時ファイルも削除しています。
一時ファイルを一時コンテナで処理する
一時ファイルをイメージに含めずに処理するために、マルチステージビルドを使用することができます。
# ビルドステージ
FROM ubuntu:18.04 as builder
RUN apt-get update && apt-get install -y gcc make
COPY . /app
WORKDIR /app
RUN make
# 実行ステージ
FROM ubuntu:18.04
COPY --from=builder /app/build /app
WORKDIR /app
この例では、ビルド専用の一時コンテナを使用しています。このステージで生成されたバイナリだけを最終イメージにコピーし、ビルドに使用したツールや一時ファイルは最終イメージには含めません。
Dockerfileの利点と活用法
ここでは、Dockerfileがもたらす利点とその活用方法について解説します。
- Infrastructure as Code(IaC):Dockerfile利点の理解
- Dockerfileを活用したDockerイメージの管理方法
Infrastructure as Code (IaC):Dockerfile利点の理解
Infrastructure as Code (IaC) とは、インフラストラクチャーの設定やプロビジョニングをコードで記述し、自動化する手法のことを指します。DockerfileはIaCの典型的な実践で、以下のような利点を提供します。
- 標準化と再現性
- オートメーションと効率化
標準化と再現性
Dockerfileを使用すると、環境の標準化と再現性が高まります。
なぜならコンテナの状態や構成を、明確にコード化できるからです。
同じDockerfileから生成されるイメージは、開発、テスト、本番環境間で一貫しているため、”動作しない状態”の問題が減少します。
オートメーションと効率化
Dockerfileにより、新しい環境のセットアップが迅速におこなえます。
手動でのインストールや設定が不要になるからです。
開発のサイクルが短縮され、効率が向上します。
Dockerfileを活用したDockerイメージの管理方法
Dockerfileを使用してイメージを管理するには、以下の基本的なプラクティスがあります。
- イメージのビルド
- イメージのバージョン管理
- 使い捨てのコンテナ
イメージのビルド
Dockerfileには、イメージの作成に必要な指示が含まれています。
docker build
コマンドを使用して、Dockerfileからイメージを作りましょう。
docker build -t my-image:latest .
イメージのバージョン管理
Dockerfileを使用してイメージをバージョン管理することで、特定のリリースや変更を容易に追跡できます。
変更があるたびに新しいタグを付け、そのタグ付きのイメージをリポジトリにプッシュすることが一般的です。
使い捨てのコンテナ
Dockerfileからビルドされたイメージは、使い捨てのコンテナとして使用されることが多いです。
これにより、環境のクリーンアップとリセットが容易になります。
Dockerfile操作コマンドと注意点
Dockerfileで使用するコマンドの細部と、それらを利用する際の注意点について解説します。
- FROM〜CMD:Dockerfile操作コマンド解説
- 非推奨からHEALTHCHECKまでDockerfile操作コマンド解説
- RUNとその判明している問題
- CMDとENTRYPOINTの連携理解
FROM〜CMD:Dockerfile操作コマンド解説
Dockerfileの操作には多くのコマンドが存在しますが、最も基本的なのは’FROM’と’CMD’です。
‘FROM’はベースとなるイメージを指定し、’CMD’はコンテナの実行時にデフォルトで実行されるコマンドを設定します。
詳しくは、前述の一覧をご覧ください。
非推奨からHEALTHCHECKまでDockerfile操作コマンド解説
Dockerfileには非推奨となったコマンドも存在します。
その中には’MAINTAINER’があります。現在では’LABEL’が推奨されています。
非推奨の理由は、イメージの作成者情報を定義するために使用されていましたものの、ラベルとしてのメタデータの管理がより一般的になったため、LABEL命令に置き換えられました。
# 非推奨
MAINTAINER example@example.com
# 推奨
LABEL maintainer="example@example.com"
また、’HEALTHCHECK’コマンドは、コンテナが正常に動作しているかを定期的に確認するためのコマンドです。
FROM nginx:latest
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
RUNとその判明している問題
‘RUN’コマンドはDockerイメージをビルドする際にコマンドを実行しますが、その実行結果は新たなレイヤとしてイメージに追加されます。
しかし不必要なファイルがレイヤに残ると、イメージが肥大化する問題があります。
CMDとENTRYPOINTの連携理解
‘CMD’と’ENTRYPOINT’は密接に連携します。
‘CMD’はデフォルトのコマンドを提供し、’ENTRYPOINT’はコンテナが実行するプログラムを定義します。
‘CMD’で指定したコマンドは、’ENTRYPOINT’で指定したプログラムのデフォルトの引数として機能します。
FROM ubuntu:latest
ENTRYPOINT ["/usr/bin/wc"]
CMD ["-l"]
Dockerfileの応用テクニック
次に、Dockerfileの応用テクニックについて解説します。
- ARGの利用方法とその広範囲な適用
- ボリューム指定に関する注意
- ONBUILD, STOPSIGNAL, HEALTHCHECK等の高度なコマンド解説
ARGの利用方法とその広範囲な適用
‘ARG’はビルド時に値を指定できるコマンドで、その活用範囲は広いです。
たとえば、バージョン番号や環境名など、ビルド時に変わる可能性がある値を指定するのに役立ちます。
FROM ubuntu:latest
ARG APP_VERSION=1.0
ARG ENV_NAME=production
RUN echo "Building application version: $APP_VERSION in environment: $ENV_NAME"
# ここに、アプリケーションのインストールなどの他のコマンドが続きます。
以下のようにARGの値を更新します。
docker build --build-arg APP_VERSION=2.0 --build-arg ENV_NAME=staging -t my-app .
ボリューム指定に関する注意
‘VOLUME’は、コンテナのファイルシステムをホストにマウントする際に使用するもの。
Dockerfile内で’VOLUME’を指定すると、そのイメージを使用するすべてのコンテナでボリュームが自動的に作成され。意図しないデータの永続化が発生する可能性があります。
FROM ubuntu:latest
VOLUME /data
# 何かのアプリケーションをインストールして設定するその他のコマンド
ONBUILD, STOPSIGNAL, HEALTHCHECK等の高度なコマンド解説
‘ONBUILD’はイメージが別のイメージのベースとして使用される際に実行されるトリガーを設定します。
FROM python:3.8
ONBUILD COPY requirements.txt /app/
ONBUILD RUN pip install -r /app/requirements.txt
‘STOPSIGNAL’はシステムがコンテナに送信する停止シグナルを設定します。
FROM nginx:latest
STOPSIGNAL SIGQUIT
そして前述した’HEALTHCHECK’はコンテナの健康状態をチェックします。
FROM nginx:latest
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
Dockerfileの実例と理解
ここでは、実際のDockerfileの例と、それを理解するための追加リソースについて説明します。
- 実際のDockerfileの例紹介
- Dockerfile理解のための追加リソース
実際のDockerfileの例紹介
ここでは、実際のDockerfileのサンプルをひとつ紹介します。
この例では、Python環境をセットアップし、アプリケーションを実行するシンプルなDockerfileを見ていきましょう。
このサンプルを元に、各コマンドの役割と効果を理解しましょう。
#ベースとなるイメージを宣言
FROM python:3.8
#シェルを指定
SHELL ["/bin/bash", "-c"]
#コンテナ内で使用するディレクトリを指定
WORKDIR /app
#ソフトウェアアップデート
RUN ["apt-get", "update"]
#PC上の「requirements.txt」を、WORKDIR上にコピー
COPY requirements.txt ./
#pipインストールの実行
RUN ["pip3", "install", "--no-cache-dir", "-r", "/app/requirements.txt"]
#build中に確認できるように表示
RUN pip freeze
#PC上のsrcファイルをWORKDIR内にコピー
COPY src ./src
#コンテナのポート8000を公開
EXPOSE 8000
#dockerコンテナ起動時に実行するコマンド
CMD ["/app/src/manage.py", "runserver", "0.0.0.0:8000"]
Dockerfile理解のための追加リソース
Dockerfileの深い理解には、実際に手を動かして試すことが不可欠です。
公式Dockerドキュメンテーションや、各種チュートリアル、コミュニティのフォーラムなど、多くの追加リソースがあります。
当サイトの記事も参考にしてください。
まとめ
DockerfileはDockerイメージを作成するための重要なツールです。
基本的な概念から詳細なコマンド、応用テクニックまでを学び、実際のDockerfileを読み書きできる能力を身につけました。
Dockerfileについての学習はここで終わりではありません。
多くの公式リソースやコミュニティが存在し、更に深い理解を得るための情報が溢れています。
ここで紹介したリンクやドキュメンテーションを活用し、Dockerfileのマスターを目指しましょう。