docker buildコマンドの基本からオプションまでを徹底解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年8月)

✔当記事はこのような方のための記事です

「docker buildコマンドの機能がよく理解できない」
「docker buildのコマンドライン入力に自信がない」
「docker buildの活用事例を見てみたい」

✔当記事で明らかにすること

  • docker buildコマンドの基礎知識
  • docker buildのコマンドラインの入力とその応用
  • docker buildの具体的な使用例

当記事ではdocker buildコマンドの基本から応用的な使い方まで、実際の例を交えて詳細に解説します。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

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イメージをビルドする例を紹介します。

以下のようなDockerfileserver.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 .

このコマンドは、ビルド時の変数VERSION1.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の公式ドキュメンテーションは非常に詳しく、新しい機能や詳細なオプションについて学ぶのに役立ちます。

参考リソース

  1. Docker公式ドキュメンテーション
  2. Dockerfileリファレンス
  3. Docker Buildコマンドリファレンス
  4. Dockerフォーラム
  5. Stack OverflowのDockerタグ
  6. GitHubのDockerリポジトリ
  7. 当記事のDocker記事まとめ
タイトルとURLをコピーしました