(最終更新日:2023年8月)
✔当記事はこのような方のための記事です
「docker buildコマンドの機能がよく理解できない」
「docker buildのコマンドライン入力に自信がない」
「docker buildの活用事例を見てみたい」
✔当記事で明らかにすること
- docker buildコマンドの基礎知識
- docker buildのコマンドラインの入力とその応用
- docker buildの具体的な使用例
当記事ではdocker buildコマンドの基本から応用的な使い方まで、実際の例を交えて詳細に解説します。
ぜひ最後までご覧ください。
Dockerとの基本
こちらでは、Dockerとその基本的な用語について説明していきます。
基本をおさえたうえで、先へ進みましょう。
- Dockerとは
- Docker Buildとは
Dockerとは
Dockerとは、コンテナ型の仮想化技術を用いたオープンソースソフトウェアのひとつ。
コンテナとは、必要なソフトウェアやライブラリ、設定等をまとめて、どの環境でも同じ動作をするようにする技術のことです。
例えば、Dockerを使えば、あるアプリケーションがMacOS, Windows, Linuxなど、異なるOSで均一に動作するよう設定できます。
Docker Buildの概要
Docker Buildは、DockerfileというテキストファイルからDockerイメージを作成するコマンドです。
Dockerfileには、イメージ作成の手順が記述されており、その手順に従ってDockerイメージが作成されます。
このDockerイメージを元に、コンテナが生成され、アプリケーションが実行されます。
Dockerファイルの作成
こちらでは、Dockerfileの作成方法について詳しく解説していきます。
- Dockerfileの要素と作成方法
- Dockerfileの詳細な説明
Dockerfileの要素と作成方法
Dockerfileはテキストファイルで、その中にはイメージ作成の手順が記述されています。
各行にひとつの命令が書かれており、基本的には上から順に実行されます。
命令には、以下のようなさまざまなものがあります。
- ベースとなるイメージの指定を行う
FROM
- コマンドの実行を行う
RUN
- ポートの開放を行う
EXPOSE
Dockerfileの詳細な説明
それでは具体的なDockerfileの例を見てみましょう。
以下は、PythonのWebフレームワークであるFlaskを動かすDockerfileの一例です。
# Pythonの公式イメージをベースにする
FROM python:3.8
# カレントディレクトリを設定
WORKDIR /app
# 必要なパッケージをインストール
COPY requirements.txt ./
RUN pip install -r requirements.txt
# アプリケーションのコードをコピー
COPY . .
# 8080番ポートを公開
EXPOSE 8080
# アプリケーションを起動
CMD ["python", "app.py"]
このようにDockerfileを作成することで、任意の環境で同じ設定のコンテナを作成し、アプリケーションを動かすことができます。
Dockerイメージのビルド
Dockerイメージのビルド方法について、詳しく見ていきましょう。
以下の3つの観点から学んでいきます。
- 一般的なビルドプロセス
- Gitリポジトリとビルド
- tarボールでのビルド
一般的なビルドプロセス
Dockerイメージのビルドは、基本的にはdocker build
コマンドを用いておこないます。
docker buit -t イメージ名 Dockerファイルの場所
以下がその方法です。
docker build -t your-image-name .
上記コマンドでは、現在のディレクトリ.
のDockerfileを元にyour-image-name
という名前のDockerイメージをビルドします。
-t
オプション:イメージに名前をつける- 「.」ドット:カレントディレクトリを意味する
Gitリポジトリとビルド
Dockerは、Gitリポジトリから直接イメージをビルドすることも可能です。
以下のように使用します。
docker build -t your-image-name git://github.com/your-username/your-repo.git
上記コマンドでは、指定したGitリポジトリからソースコードをクローンし、その中のDockerfileを元にイメージをビルドします。
tarボールでのビルド
tarボールからDockerイメージのビルドも可能。
tarボールは、複数のファイルやディレクトリをひとつのファイルにまとめるための形式です。
以下のように使用します。
docker build -t your-image-name - < context.tar.gz
上記コマンドでは、標準入力-
からtarボールを読み込み、その中のDockerfileを元にイメージをビルドします。
Docker Buildオプションの解説
こちらでは、Docker buildのオプションについて解説します。
- Docker buildの基本オプション
- ビルドの詳細オプション
Docker buildの基本オプション
Docker buildには多数のオプションが存在します。
その中から基本的なものをいくつか紹介します。
-t
,--tag
: ビルドするイメージに名前(タグ)をつけます。
形式はname:tag
で、タグを省略すると名前はlatest
です。-f
,--file
: ビルドに使用するDockerfileの名前やパスを指定します。
省略した場合はデフォルトのDockerfile
が使用されます。--no-cache
: 以前のビルドからキャッシュを使わずにビルドします。
常に新しいイメージをビルドしたいときに使える方法です。
ビルドの詳細オプション
詳細なビルドオプションもいくつか存在します。
ここでは2つだけ紹介します。
--build-arg
: ビルド時にDockerfile内で使用される変数を設定します。
例】docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .
--network
: ビルド中のDockerデーモンが使用するネットワークを指定します。
Docker buildのオプションは多岐にわたりますので、詳しくは公式ドキュメンテーションを参照することをおすすめします。
networkは、自身でカスタマイズしたものや、ホスト環境のネットワークを使う方法を選べます。
詳しくは以下の記事をご覧ください。
Docker Buildの実際の使用例
こちらでは、Docker Buildを実際に使用する具体的な例を紹介します。
以下の観点から見ていきましょう。
- 基本的なビルド方法
- テキストファイルとビルド
- .dockerignoreの活用
基本的なビルド方法
ここでは、簡単なNode.jsアプリケーションのDockerイメージをビルドする例を紹介します。
以下のようなDockerfile
とserver.js
ファイルがあるとします。
Dockerfile
FROM node:12
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
server.js
const http = require('http');
const requestListener = function (req, res) {
res.writeHead(200);
res.end('Hello, Docker!');
}
const server = http.createServer(requestListener);
server.listen(8080);
これらのファイルがあるディレクトリで以下のコマンドを実行すると、Dockerイメージがビルドされます。
docker build -t node-app .
テキストファイルとビルド
テキストファイルを使用してイメージをビルドできます。
このサブセクションでは、PATHとURLを使用したビルド方法について見ていきましょう。
- PATHを使用した構築
- URLを使用した構築
PATHを使用した構築
docker build
コマンドの最後のパラメータは、ビルドコンテキストのPATHを指定します。
以下のコマンドは現在のディレクトリ(.
)をビルドコンテキストとしたものです。
docker build -t node-app .
URLを使用した構築
ビルドコンテキストは、GitHubなどのリモートリポジトリのURLも指定できます。
以下のコマンドは、GitHubのリポジトリをビルドコンテキストとして指定したものです。
docker build -t node-app git://github.com/user/repo.git#branch
.dockerignoreの活用
.dockerignoreファイルを使用することで、ビルドコンテキストから特定のファイルやディレクトリを除外も可能。
これにより、ビルドの時間を短縮し、不要なファイルがイメージに含まれるのを防ぐことができます。
例えば、以下のような.dockerignoreファイルは、node_modules
ディレクトリと.DS_Store
ファイルを無視します。
node_modules
.DS_Store
.dockerignoreファイルには、各行に一つずつ無視するパターンを書いてください。
上記の設定があると、node_modules
ディレクトリと.DS_Store
ファイルはDockerイメージに含まれず、またCOPY
命令の影響を受けません。
Docker Buildの応用範囲と最適化
Docker Buildの応用範囲と最適化の方法について学びましょう。
以下の3つの観点から進めていきます。
- Dockerイメージのタグ設定
- Dockerfileの指定方法
- セキュリティオプションについて
Dockerイメージのタグ設定
Dockerイメージにはタグを付けられます。
特定のバージョンのイメージを容易に識別し、利用可能です。
タグは-t
オプションと共に、docker build
コマンドで指定します。
docker build -t node-app:1.0.0 .
このコマンドは、node-app
という名前のイメージをビルドし、そのイメージに1.0.0
というタグを付けます。
Dockerfileの指定方法
通常、Dockerfile
はビルドコンテキストのルートに配置され、デフォルトの名前Dockerfile
が使用されます。
しかし、異なる名前やパスのDockerfile
を使用することも可能です。
これには-f
または--file
オプションを使用します。
docker build -t node-app -f Dockerfiles/NodeAppDockerfile .
Dockerfiles/NodeAppDockerfile
というパスのDockerfile
を使用して、node-app
イメージをビルドします。
セキュリティオプションについて
Docker Buildプロセスは、ビルド環境内で任意のコードを実行する能力を持っています。
そのため、ビルドプロセスは潜在的なセキュリティリスクともいえるでしょう。
幸いなことに、Dockerはこのリスクを軽減するためのいくつかのセキュリティオプションを提供しています。
例えば、--no-cache
オプションは、ビルドプロセスでキャッシュを使用するのを防ぎます。
前のビルドプロセスから秘密情報がキャッシュに残らないようにするために役立ちます。
docker build --no-cache -t node-app .
Dockerでの隔離技術の紹介
こちらでは、Dockerが提供する隔離技術について深く探ります。
- コンテナの隔離技術の指定方法
- コンテナのホストファイルへのエントリ追加
コンテナの隔離技術の指定方法
Dockerは、Linuxカーネルのさまざまな機能を活用して、コンテナ間の隔離を提供します。
機能として主なものは以下のとおり。
- ネームスペース
- cgroups
- カーネルの機能強化
これらの隔離レベルを調整することで、セキュリティとパフォーマンスのバランスを整えます。
例えば--isolation
オプションを使って、コンテナの隔離レベルを指定も可能です。
docker run --isolation=hyperv busybox
このコマンドは、Windowsで、Hyper-Vを使用して高い隔離レベルを提供する新しいコンテナを作成します。
コンテナのホストファイルへのエントリ追加
Dockerコンテナの/etc/hosts
ファイルは、デフォルトではコンテナ内部からしかアクセスできません。
--add-host
オプションを使って、ホスト名とIPアドレスの組を/etc/hosts
に追加が可能です。
これにより、コンテナ内から特定のホスト名で、ほかのネットワークリソースにアクセスできるようになります。
docker run --add-host database:10.0.0.1 busybox
このコマンドは、database
というホスト名と10.0.0.1
というIPアドレスの組を新しいコンテナの/etc/hosts
に追加します。
テクニカルなDocker Buildオプション
最後に、よりテクニカルなDocker Buildのオプションについて学びましょう。
以下の観点から見ていきます。
- ビルドステージの対象指定
- 構築時の変数指定
- 外部キャッシュソースの指定
- イメージレイヤのスカッシュ(実験的機能)
ビルドステージの対象指定
Dockerfile内で複数のビルドステージを定義した場合、特定のステージをターゲットとしてビルドできます。
これには--target
オプションを使いましょう。
docker build --target test -t node-app .
このコマンドは、Dockerfile
内でtest
と名付けられたビルドステージをターゲットとしてビルドをおこなうものです。
構築時の変数指定
ビルド時に変数を指定して、それをDockerfile
内で使用できます。
これには--build-arg
オプションを使いましょう。
このオプションはARG
命令と共に使用され、Dockerfile
内の特定の箇所でのみ有効です。
docker build --build-arg VERSION=1.0.0 -t node-app .
このコマンドは、ビルド時の変数VERSION
を1.0.0
として設定します。
これにより、Dockerfile
内でARG VERSION
と指定されている部分でこの値を使用できるのです。
外部キャッシュソースの指定
ビルド高速化のために、Dockerはビルドキャッシュを使用します。
デフォルトでは、Dockerはローカルのビルドキャッシュを使用しますが、--cache-from
オプションを使用することで外部のキャッシュソースの指定も可能。
例えばCI/CDパイプラインでビルドをおこなう際などに有効です。
docker build --cache-from node-app:latest -t node-app .
このコマンドは、node-app:latest
イメージのビルドキャッシュを使用して新しいビルドをおこないます。
イメージレイヤのスカッシュ(実験的機能)
Dockerイメージにある複数のレイヤーを、ひとつにまとめる(スカッシュする)ことで、イメージのサイズを削減できます。
これは実験的な機能であり、Dockerの実験的機能を有効にした上で--squash
オプションを利用してください。
docker build --squash -t node-app .
このコマンドは、ビルドによって生成されたすべてのレイヤーをスカッシュ(統合)して、新しいイメージを生成します。
Docker Buildのトラブルシューティングと助けになるリソース
こちらでは、一般的なトラブルシューティングのヒントと、さらなる学習に役立つリソースを提供します。
Docker Buildは強力で柔軟性の高いツールですが、それに伴って複雑になってくるからです。
- トラブルシューティング
- Dockerコミュニティとリソース
トラブルシューティング
Dockerビルドが失敗した場合、まずはエラーメッセージをよく読みましょう。
エラーメッセージは通常、問題が発生した場所とその原因を示しているからです。
またビルドのログを詳しく見るためには、docker build
コマンドで、-t
フラグを使用することが役立ちます。
また、Dockerイメージが予想以上に大きくなった場合は、以下の
コマンドを使用して、イメージの各レイヤーがどれだけのディスクスペースを消費しているかを確認しましょう。
docker history <イメージ名>
Dockerコミュニティとリソース
Dockerは非常に活発なコミュニティを持っています。
公式のDockerフォーラムやStack Overflowでは、ほかのユーザーからの助けを求められます。
また、GitHubのDockerリポジトリでは、Dockerの最新の開発を追跡したり、バグ報告やフィーチャーリクエストを提出したりが可能です。
まとめ
Docker Buildは、Dockerfileと呼ばれるテキストファイルを読み取り、その指示に基づいてDockerイメージを作成するコマンド。
Dockerイメージは、ソフトウェアのランタイム環境を含む、パッケージ化されたバイナリです。
これを基に、Dockerコンテナという独立した実行環境を作成します。
これからもDockerについて学び続けるためには、実際に自分でDockerfileを作成し、Dockerイメージをビルドしてみることが一番の方法です。
また、Dockerの公式ドキュメンテーションは非常に詳しく、新しい機能や詳細なオプションについて学ぶのに役立ちます。