🎯 ゴール:自分だけのイメージを作ろう!
このセクションでは、自分だけのDockerイメージを作成します。
📄 Dockerfileというファイルを作ります。例
FROM nginx:1.28-alpine
# 環境変数
ENV APP_NAME="My Docker App"
# パッケージインストール
RUN apk add --no-cache curl
# HTMLファイルをコピー
COPY index.html /usr/share/nginx/html/
# 起動コマンド
CMD ["nginx", "-g", "daemon off;"]
各命令を1つずつ学んでいきます!
📦 イメージを取得する2つの方法
| 方法 | 説明 |
|---|---|
| Docker Hub | 既存のイメージをそのまま使う。そのまま使うことはほぼない |
| Dockerfile | 既存イメージを土台に、自分の設定を追加してカスタマイズ。本番の製品ではこちらを使う |
⚠️ コンテナの中で設定しても残らない!
コンテナ内でパッケージをインストールしたり設定を変更しても、
コンテナを削除すると全て消えてしまいます。
- • チームメンバーに共有できない
- • 本番環境に持っていけない
- • 毎回同じ設定を手作業でやり直す必要がある
→ Dockerfileに書いておけば、いつでも同じ環境を再現できます!
→ 実はここから環境をコードで管理するというDockerの本質の学習に辿り着きました。
❌ コンテナ内で設定
✅ Dockerfileで設定
❓ なぜDockerfileを学ぶのか
実際の開発では、Docker Hubのイメージをそのまま使うことはほとんどありません。
必ず自分のアプリや設定を追加する必要があるからです。
Dockerfileを理解しておくと:
- • Docker Hubのイメージをカスタマイズできる
- • チームで同じ環境を共有できる
- • docker-compose.yml の build 設定が理解できる
📝 Dockerfileとは
Dockerfile = 「Dockerイメージの設計図」
🏠 リフォームに例えると...
- • ベースイメージ(FROM) = 既存の家(土台)
- • Dockerfile = リフォームの設計図
- • docker image build = リフォーム工事を実行
- • 完成したイメージ = リフォーム済みの家
📋 Dockerfileの特徴
- ✅ ファイル名は
Dockerfile(拡張子なし) - ✅ テキストファイルなのでGit管理できる
- ✅ 誰でも同じイメージを再現できる
- ✅ 1行ごとにレイヤーが作られる
では、コマンドを1つずつ学びながらDockerfileを書いていきましょう!
📁 作業フォルダを準備
まずは作業用のフォルダを作成し、必要なファイルを準備します。
1作業フォルダを作成
2HTMLファイルを作成
表示させたいHTMLファイルを作成します:
💡 シンプルなHTMLで十分です。凝ったデザインは後からでOK!
3ファイルを確認
✅ index.html が作成されました!
🎯 現在のフォルダ構成
dockerfile-practice/ └── index.html
🏗️ FROM:ベースイメージを指定
すべてのDockerfileは FROM から始まります。
どのイメージを土台にするかを指定します。
1Dockerfileを作成
まずは FROM だけのシンプルなDockerfileを作ります:
ファイル名は必ず Dockerfile(拡張子なし、大文字D)
📝 FROM を分解すると
FROM
nginx
1.28-alpine
→ Docker Hubの nginx:1.28-alpine イメージを土台にする
⚠️ タグは必ず指定する
nginx や nginx:latest ではなく、具体的なバージョンを指定しましょう。
FROM nginxFROM nginx:latest
バージョンが変わると動作が変わる可能性
FROM nginx:1.28-alpine
いつでも同じ環境を再現できる
🎯 現在のフォルダ構成
dockerfile-practice/ ├── Dockerfile ← NEW! └── index.html
🔨 docker image build:イメージをビルド
Dockerfileからイメージを作成します。これを「ビルド」と呼びます。
🆕 新しいコマンド: docker image build
docker image build は、Dockerfileからイメージを作成するコマンドです。
🏷️ -t オプション(タグ付け)
-t は --tag の省略形で、イメージに名前を付けます。
| コマンド | 結果 |
|---|---|
-t my-web |
my-web:latest(タグ省略時はlatest) |
-t my-web:v1 |
my-web:v1 |
-t my-web:production |
my-web:production |
1イメージをビルド
ビルドコンテキストが送信され、Dockerfileの各命令が順番に実行されています。
📝 コマンドを分解すると
docker image
build
-t my-web
.
docker image- イメージを操作build- Dockerfileからビルド-t my-web- 「my-web」という名前を付ける.- 現在のディレクトリをビルドコンテキストとして使う
2作成されたイメージを確認
✅ 「my-web」イメージが作成されました!
📦 ビルドコンテキストとは?
コマンドの最後にパスを指定すると、そのディレクトリが「ビルドコンテキスト」になります。
今回は .(現在のディレクトリ)を指定しています。
ビルドコンテキスト = Dockerデーモンに送るファイル一式
📄 index.html
デーモン
💡 . は現在のディレクトリを意味します
🎯 学んだこと
docker image build -t 名前 .でイメージをビルド.はビルドコンテキスト(Dockerデーモンに送るファイル一式)-tでイメージに名前(タグ)を付ける
🚀 動作確認:コンテナを起動
作成したイメージからコンテナを起動してみましょう!
1コンテナを起動
👀 何が表示される?
「Welcome to nginx!」というnginxのデフォルトページが表示されます。
まだ自分のHTMLをコピーしていないので、nginxの初期ページが表示されています。
3確認したら停止・削除
🎯 ここまでの成果
FROM だけのDockerfileでイメージを作成・起動できました!
次は COPY を追加して、自分のHTMLを表示させましょう。
📋 COPY:ファイルをコピー
COPY でホスト(あなたのPC)のファイルをイメージ内にコピーできます。
1Dockerfileに COPY を追加
💡 >> は追記です(上書きではない)
2Dockerfileを確認
📝 COPY を分解すると
COPY
index.html
/usr/share/nginx/html/
→ 作成した index.html を、nginxの公開ディレクトリにコピー
3再ビルド
4コンテナを起動して確認
ブラウザで http://localhost:8080 を開いてください。
🎊 成功!
「Hello from my Dockerfile」が表示されれば成功です!
自分で作ったHTMLが表示されています!
5確認したら停止・削除
💡 COPY と -v の違い
(イメージの一部になる)
(イメージには含まれない)
🎯 学んだこと
COPY コピー元 コピー先でファイルをコピー- Dockerfileを変更したら再ビルドが必要
📦 ビルドコンテキストを理解する
COPY でエラーが出ることがあります。
わざとエラーを起こして、ビルドコンテキストの仕組みを理解しましょう。
1親ディレクトリにファイルを作成
作業フォルダの外にファイルを作ります:
2親ディレクトリからCOPYしてみる
Dockerfileを作成して、親ディレクトリのファイルをコピーしようとします:
3ビルドしてみる(エラーになる)
❌ なぜエラー?
COPY ../secret.txt はビルドコンテキストの外なのでアクセスできません。
📁 今回の状況を図で確認
~/
├── secret.txt ← ビルドコンテキストの外(アクセス不可)
│
└── dockerfile-practice/ ← ビルドコンテキスト(. で指定)
├── Dockerfile
├── Dockerfile.test
└── index.html ← ビルドコンテキストの中(アクセス可能)
💡 セキュリティのため、ビルドコンテキスト外のファイルにはアクセスできません
4正しい方法:ファイルをビルドコンテキスト内に置く
コピーしたいファイルは、ビルドコンテキスト内に配置します:
5再度ビルド(成功する)
✅ ビルド成功!
📄 -f オプションとは?
デフォルトでは Dockerfile という名前のファイルを探しますが、
-f で別のファイルを指定できます。
docker image build -t my-web .
→ Dockerfile を使用
docker image build -f Dockerfile.test -t my-web .
→ Dockerfile.test を使用
💡 開発用・本番用でDockerfileを分けたい場合に便利!
6後片付け
🎯 学んだこと
COPYはビルドコンテキスト内のファイルのみコピー可能- ビルドコンテキスト =
docker image buildの最後の引数(.) -fオプションで別のDockerfileを指定できる
📚 補足:柔軟な指定が可能
ビルドコンテキストは . 以外も指定できます。
💡 Dockerfile はビルドコンテキスト外に置いてもOK(-f で指定)
💡 COPY できるのはビルドコンテキスト内のファイルのみ
📚 補足:Dockerfileの名前
Dockerfile という名前でなくてもOKです。-f で指定すればどんな名前でもビルドできます。
💡 -f を省略すると Dockerfile という名前を探す
💡 慣習として Dockerfile を使うことが多い
🔧 RUN:コマンドを実行
RUN を使って、ビルド時にコマンドを実行できます。
🆕 RUN とは?
イメージのビルド時にコマンドを実行します。
パッケージのインストール、ファイルの作成などに使います。
1まずはシンプルに書いてみる
最初は RUN を複数行で書いてOKです。何回ビルドしても大丈夫!
💡 apt-get update はパッケージリストを取得します(最初に必須)
💡 -y は確認なしでYes(Dockerfileでは必須)
2もう一度ビルドしてみる(キャッシュ体験)
同じコマンドをもう一度実行してください:
⚡ 一瞬で終わる!すべて「CACHED」と表示されます。
3途中を変更してビルド(キャッシュが無効になる)
2行目を変更してみましょう:
⚠️ 変更した行以降はすべてキャッシュが無効になります
⚡ キャッシュの仕組み
- Dockerは各RUNの結果をキャッシュします
- 同じ命令なら「CACHED」でスキップ → 高速
- 変更があると、その行以降すべて再実行
4後片付け
🛠️ 実際のDockerfileの作り方(実践的なワークフロー)
実務では、いきなり完璧なDockerfileを書くのではなく、試行錯誤しながら作っていきます。
📝 ポイント1:RUNは1つにまとめない(開発段階)
開発・学習段階では、RUNを分けて書いた方がデバッグしやすいです:
• エラー箇所がわかりやすい
• レイヤー単位でキャッシュ(下記参照↓)
• レイヤーが減る
• イメージサイズが小さくなる
📝 ポイント2:コンテナ内で試す → 成功したらDockerfileに追記
「何をインストールすればいいか」は、まずコンテナ内で試してから確定させます:
docker container run -it php:8.3-fpm bash
← コンテナに入る
apt-get update && apt-get install -y curl
← 試す
curl --version
← 動作確認 → 成功!
RUN apt-get install -y curl を追記
⚠️ 重要:コンテナ内の変更は消える!
コンテナ内でインストールした内容は、exitしてコンテナを削除すると消えます。
だからこそ、うまくいったコマンドは必ずDockerfileに追記してください!
💡 この「試す → 成功したら追記」のサイクルを繰り返して、Dockerfileを完成させていきます。
🧱 レイヤーとは?
Dockerイメージは「レイヤー」の積み重ねで構成されています。
各命令(FROM、RUN、COPYなど)が1つのレイヤーを作ります。
⚡ キャッシュはレイヤー単位で保存されます。
だからRUNを分けておくと、変更していないレイヤーはスキップされてビルドが速くなります。
RUN apt-get install -y curl
Layer 4
RUN apt-get install -y git
Layer 3
RUN apt-get update
Layer 2
FROM php:8.3-fpm
Layer 1(ベース)
docker image history でレイヤーを確認できます:
💡 レイヤーを意識するのはどんな時?
- イメージサイズを小さくしたい → RUNをまとめてレイヤーを減らす
- ビルドを速くしたい → 変更が多い命令は後ろに置く(キャッシュが効きやすい)
※ ML(機械学習)系の巨大イメージでは重要ですが、Web開発では意識しなくても問題ないことが多いです
5慣れたら1つにまとめる(実務向け)
実務ではイメージサイズを小さくするため、1つのRUNにまとめます:
\
&&
-y
git→ Composer用curl→ API通信libzip-dev→ Excel操作(PhpSpreadsheet)pdo_mysql→ DB接続apt-get clean→ キャッシュ削除で軽量化
6ビルド
RUNが1つにまとまっているので、レイヤーも1つになります。
7curlがインストールされたか確認
✅ curlがインストールされています!
🎯 学んだこと
RUNはビルド時にコマンドを実行- パッケージのインストールなどに使う
- 各
RUNがイメージのレイヤーになる
▶️ CMD:起動コマンド
CMD はコンテナ起動時に実行されるデフォルトコマンドを設定します。
🆕 CMD とは?
コンテナ起動時に実行されるデフォルトのコマンドを設定します。
⚠️ RUN と CMD の違い
ビルド時に実行
パッケージインストールなど
コンテナ起動時に実行
アプリの起動など
1Dockerfileを更新
CMDを追加します(nginxはデフォルトでCMDを持っていますが、明示的に書きます):
📝 CMD を分解すると
CMD
"ls"
"-la"
💡 JSON配列形式で書きます。ダブルクォート " を使うこと!
2再ビルド
💡 CMD は上書きできる
docker container run でコマンドを指定すると、CMDが上書きされます:
🎯 学んだこと
CMDはコンテナ起動時のデフォルトコマンドRUN(ビルド時)とCMD(起動時)の違いCMDはdocker container runで上書きできる
🌍 ENV:環境変数
ENV でコンテナ内で使える環境変数を設定できます。
🆕 ENV とは?
コンテナ内で使える環境変数を設定します。
1Dockerfileを更新
環境変数を追加します:
2再ビルド
3環境変数を確認
✅ 環境変数が設定されています!
💡 ENV の使用例
ENV NODE_ENV=production
# タイムゾーン
ENV TZ=Asia/Tokyo
# 言語設定
ENV LANG=ja_JP.UTF-8
💡 docker run で上書きできる
📚 上級者向け参考:ARG
ENV と似た命令に ARG があります。
ARGはビルド時にだけ使える変数で、完成したイメージには残りません。
Dockerfileの例:
FROM node:${NODE_VERSION}-alpine
ビルド時に値を変更:
💡 この講座では ENV だけ覚えればOKです。
ARG はCI/CDパイプラインやマルチステージビルドで使われます。
🎯 学んだこと
ENVでコンテナ内の環境変数を設定docker container run -eで上書き可能- 設定値の外部化に便利
⚠️ ENVに機密情報を書かない!
ENVに書いた値はイメージに残るため、誰でも見れてしまいます。
• APIキー・シークレット
• 認証トークン
📂 WORKDIR:作業ディレクトリ
WORKDIR で作業ディレクトリを設定できます。
🆕 WORKDIR とは?
以降の RUN, CMD, COPY などの作業ディレクトリを設定します。
cd コマンドのようなものです。ディレクトリが存在しない場合は自動作成されます。
⚠️ WORKDIRを指定しないと / (ルート)になる
WORKDIRを指定しない場合、作業ディレクトリは /(ルートディレクトリ)になります。
コンテナに入った時のプロンプトが /# になっているのはこのためです。
1WORKDIRなしでファイルを作成
まずWORKDIRを指定せずにファイルを作ってみます:
2ファイルがどこにあるか確認
→ ルート / に作成されました。
3WORKDIRを指定してファイルを作成
今度はWORKDIRを指定します:
4ファイルの場所を確認
→ /app に作成されました!
5プロンプトの違いを確認
コンテナに入った時のプロンプトも変わります:
🎯 学んだこと
WORKDIRで作業ディレクトリを設定- 指定しないとルート
/になる - 以降の
RUN,COPY,CMDに影響 - ディレクトリが存在しない場合は自動作成
🚫 .dockerignore:除外ファイル
.dockerignore ファイルを使うと、COPYでコピーされないファイルを指定できます。
🆕 .dockerignore とは?
COPY でコピーしたくないファイルやフォルダを指定するファイルです。
.gitignore と同じような書き方ができます。
⚠️ なぜ必要?
- • node_modules → コンテナ内で
npm installするので不要。ホスト(Mac)とコンテナ(Linux)でOSが違うと動かないパッケージもある - • .env など機密情報 → セキュリティリスク
- • .git など不要なファイル → 無駄なコピー
1テスト用ファイルを作成
まず、コピーされるファイルとされないファイルを用意します:
2.dockerignoreなしでビルド
まず .dockerignore なしで試します:
3両方のファイルがコピーされたか確認
⚠️ secret.txt もコピーされています!
4.dockerignore を作成
secret.txt を除外するように設定します:
5再ビルド
6除外されたか確認
✅ secret.txt がコピーされていません!
📝 よく使う .dockerignore の内容
💡 .dockerignore を見直すタイミング
- • ビルドに時間がかかる
- • イメージサイズが大きい(1GB超えたら要チェック)
💡 docker image ls でイメージサイズを確認できます
🎯 学んだこと
.dockerignoreでCOPYから除外するファイルを指定- 機密情報や不要なファイルをイメージに含めない
.gitignoreと同じ書き方が使える
📋 Dockerfile命令まとめ
🎯 よく使う命令一覧
| 命令 | 説明 | 例 |
|---|---|---|
FROM |
ベースイメージを指定 | FROM nginx:1.28-alpine |
COPY |
ファイルをコピー | COPY . /app |
RUN |
コマンドを実行 | RUN npm install |
WORKDIR |
作業ディレクトリ | WORKDIR /app |
CMD |
デフォルトコマンド | CMD ["node", "app.js"] |
ENV |
環境変数を設定 | ENV PORT=3000 |
EXPOSE |
ポートを明示(書いても書かなくても動作は同じ。「このコンテナは何番ポートを使うか」を明示するドキュメント用。実際にポートを開けるのは -p) |
EXPOSE 80 |
🧹 後片付け
作成したリソースを削除
⚠️ prune は使っていないもの全てを削除します。他のプロジェクトのイメージも消える可能性があるので注意。
📝 このセクションのまとめ
✅ 学んだこと
- Dockerfileはイメージの設計図
docker image build -t 名前 .でイメージをビルド- ビルドコンテキスト(
.)がDockerデーモンに送られる - FROMでベースイメージを指定
- COPYでファイルをコピー(ビルドコンテキスト内のみ)
- RUNでビルド時にコマンドを実行
- CMDでコンテナ起動時のコマンドを設定
- ENVで環境変数を設定
- WORKDIRで作業ディレクトリを設定
- .dockerignoreで不要なファイルを除外
🎉 おめでとうございます!
自分だけのDockerイメージを作成できるようになりました!
🎯 次のステップ
次のセクションではDocker Hubについて学びます。
今作ったDockerfileの命令が、Docker Hubでレイヤーとして表示されることを確認しましょう!