最終更新
リンドくん
たなべ先生、Dockerfileって何なんですか?
なんだか難しそうで...
たなべ
Dockerfileは、アプリケーションの実行環境を自動的に作るためのレシピのようなものなんだ。
一度書いておけば、誰でも同じ環境を簡単に再現できるようになるんだよ。
プログラミングを学んでいると、「自分のパソコンでは動くのに、他の人の環境では動かない...」という経験をしたことがある方も多いのではないでしょうか?
そんな環境の違いによる問題を解決してくれるのがDockerです。
そして、そのDockerの動作を定義するのが「Dockerfile」なのです。
この記事では、プログラミング初心者の方でも理解できるよう、Dockerfileの基本的な書き方から実践的な使い方まで、丁寧に解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
でも先生、そもそもなぜDockerfileが必要なんですか?
普通にアプリケーションをインストールすればいいんじゃ...
たなべ
確かにそう思うよね。でも、プロジェクトが大きくなると、必要なソフトウェアやライブラリがたくさんになるんだ。
それを毎回手作業でインストールするのは大変だし、ミスも起きやすいよね。
Dockerfileは、Dockerイメージを作成するための設計図です。
簡単に言えば、「どんなソフトウェアをどの順番でインストールするか」を記述したテキストファイルなのです。
Dockerfileの真の価値は以下の点にあります。
現代のソフトウェア開発では、以下のような問題に直面することがあります。
Dockerfileを使うことで、これらの問題を一気に解決できます。
実際、多くの企業やオープンソースプロジェクトでDockerが標準的に使われているのは、こうした理由からなのです。
リンドくん
実際にDockerfileってどう書くんですか?難しそうですね...
たなべ
心配しないで!基本的な命令は数個だけ覚えればいいんだよ。
まずは最もシンプルなDockerfileから見ていこう。
まず、最も基本的なDockerfileの例を見てみましょう。
このDockerfileは、Ubuntuをベースに、テキストファイルを表示するだけのシンプルな例です。
これだけでも、Dockerfileの基本的な構造が理解できるのではないでしょうか。
Dockerfileでよく使う基本的な命令を見ていきましょう。
FROMは、Dockerイメージの土台となるベースイメージを指定します。
これは必ず最初に書く命令で、既存のイメージの上に自分のアプリケーション環境を構築していきます。
よく使われるベースイメージには以下のようなものがあります。
ubuntu:24.04
- Ubuntu Linuxnode:20
- Node.js環境python:3.14
- Python環境nginx:alpine
- 軽量なNginxサーバWORKDIRは、以降の命令を実行するディレクトリを指定します。
指定したディレクトリが存在しない場合は自動的に作成されます。
COPYは、ホストマシン(自分のPC)からDockerイメージへファイルをコピーします。
アプリケーションのソースコードや設定ファイルをイメージに含める際に使用します。
RUNは、イメージ作成時にコマンドを実行します。
パッケージのインストールや環境設定など、イメージを構築する際の処理を記述します。
CMDは、コンテナが起動したときに実行されるデフォルトのコマンドを指定します。
アプリケーションの起動コマンドを記述するのが一般的です。
では、実際のアプリケーション開発でよく使われる、Node.jsアプリケーション用のDockerfileを見てみましょう。
このDockerfileは、Node.jsアプリケーションを動かすために必要な環境を自動的に構築します。
一度このファイルを作成すれば、誰でも同じ環境でアプリケーションを実行できるようになるのです。
リンドくん
基本的な書き方はわかりました!でも、もっと効率的な書き方とかあるんですか?
たなべ
Dockerfileにはビルドを速くしたり、イメージを小さくしたりするテクニックがたくさんあるんだ。
実務でも役立つコツを教えるよ。
Dockerは、Dockerfileの各命令ごとにレイヤーと呼ばれる層を作成します。
変更されていないレイヤーは再利用される(キャッシュされる)ため、ビルド時間を大幅に短縮できます。
この書き方だと、ソースコードが少しでも変更されると、npm install
も毎回実行されてしまいます。
この書き方なら、ソースコードを変更してもpackage.json
が変わっていなければ、npm install
はキャッシュから実行されます。
これにより、ビルド時間が数分から数秒に短縮されることもあります!
マルチステージビルドを使うと、ビルド時にのみ必要なツールを最終イメージから除外できます。
この例では、ビルド用と実行用で別々のステージを使っています。
最終的なイメージには実行に必要なファイルだけが含まれるため、イメージサイズを大幅に削減できます。
RUN命令は、可能な限りまとめて実行することでレイヤー数を減らせます。
悪い例
良い例
まとめて実行することで、レイヤー数が減り、イメージサイズも小さくなります。
また、不要なキャッシュファイルも削除しているため、さらに軽量化されています。
Dockerfileと同じディレクトリに.dockerignore
ファイルを作成すると、イメージに含めたくないファイルを除外できます。
これにより、不要なファイルがイメージに含まれなくなり、ビルド時間とイメージサイズの両方を削減できます。
リンドくん
Dockerfileを書いてみたんですけど、エラーが出ちゃって...
初心者がよくハマるポイントってありますか?
たなべ
あるある!実は初心者の方が陥りやすい問題にはパターンがあるんだ。
よくあるトラブルと解決法を見ていこう。
症状: COPY failed: file not found
というエラーが出る
原因: COPYやADDで指定したファイルが見つからない
解決法:
.dockerignore
で除外されていないか確認症状: コンテナ内でファイルの読み書きができない
原因: ファイルやディレクトリの所有者・権限が適切でない
解決法:
USER
命令で適切なユーザーを指定RUN chown
で所有者を変更症状: Dockerイメージのビルドに時間がかかりすぎる
原因: キャッシュが効いていない、または不要なファイルをコピーしている
解決法:
.dockerignore
で不要なファイルを除外症状: 作成したイメージが数GBになってしまう
原因: 不要なファイルやビルドツールが含まれている
解決法:
リンドくん
これから本格的にDockerを使っていきたいんですけど、気をつけるべきことってありますか?
たなべ
もちろん!プロの開発現場で使われているベストプラクティスを押さえておくと、チーム開発でも役立つよ。
rootユーザーで実行しない
機密情報をイメージに含めない
.env
ファイルをイメージに含めない不要なファイルを削除する
軽量なベースイメージを使用
悪い例
良い例
これらのベストプラクティスを守ることで、保守しやすく、安全で、効率的なDockerfileを作成できます。
リンドくん
Dockerfileについていろいろ学べました!思ったよりシンプルで、使いこなせそうな気がしてきました!
たなべ
その意気だね!最初は基本的な使い方から始めて、徐々に高度なテクニックを取り入れていけばいいんだよ。
まずは自分のプロジェクトで試してみることが大切だね。
この記事では、Dockerfileの基本的な書き方から実践的なテクニックまで解説してきました。
重要なポイントをおさらいしましょう。
Dockerfileを使いこなせるようになると、以下のようなメリットが得られます。
現代のソフトウェア開発では、Dockerは必須のスキルとなっています。
最初は難しく感じるかもしれませんが、基本を押さえて実際に手を動かしていけば、必ず使いこなせるようになります。
ぜひ今日学んだことを活かして、自分のプロジェクトでDockerfileを作成してみてください。
小さなプロジェクトから始めて、徐々に複雑な構成に挑戦していくのがおすすめです。