🎯 ゴール:自分だけのイメージを作ろう!

このセクションでは、自分だけの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の本質の学習に辿り着きました。

❌ コンテナ内で設定
コンテナ
curl インストール済み
⬇️
コンテナ削除
curl 消えた...
共有できない
✅ Dockerfileで設定
Dockerfile
RUN apk add curl
⬇️
自分
チーム
本番
全員同じ環境!

❓ なぜ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作業フォルダを作成

mkdir -p ~/dockerfile-practice
cd ~/dockerfile-practice

2HTMLファイルを作成

表示させたいHTMLファイルを作成します:

echo '<h1>Hello from my Dockerfile</h1>' > index.html

💡 シンプルなHTMLで十分です。凝ったデザインは後からでOK!

3ファイルを確認

ls -la
total 8 drwxr-xr-x 3 user staff 96 Jan 15 10:00 . drwxr-xr-x 5 user staff 160 Jan 15 10:00 .. -rw-r--r-- 1 user staff 612 Jan 15 10:00 index.html

✅ index.html が作成されました!

🎯 現在のフォルダ構成

dockerfile-practice/
└── index.html

🏗️ FROM:ベースイメージを指定

すべてのDockerfileは FROM から始まります。
どのイメージを土台にするかを指定します。

1Dockerfileを作成

まずは FROM だけのシンプルなDockerfileを作ります:

echo 'FROM nginx:1.28-alpine' > Dockerfile

ファイル名は必ず Dockerfile(拡張子なし、大文字D)

📝 FROM を分解すると

命令
FROM
イメージ名
nginx
:
タグ(バージョン)
1.28-alpine

→ Docker Hubの nginx:1.28-alpine イメージを土台にする

⚠️ タグは必ず指定する

nginxnginx:latest ではなく、具体的なバージョンを指定しましょう。

❌ 避ける
FROM nginx
FROM nginx:latest

バージョンが変わると動作が変わる可能性

✅ 推奨
FROM nginx:1.28-alpine

いつでも同じ環境を再現できる

🎯 現在のフォルダ構成

dockerfile-practice/
├── Dockerfile     ← NEW!
└── index.html

🔨 docker image build:イメージをビルド

Dockerfileからイメージを作成します。これを「ビルド」と呼びます。

🆕 新しいコマンド: docker image build

docker image build は、Dockerfileからイメージを作成するコマンドです。

docker image build -t イメージ名:タグ パス

🏷️ -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イメージをビルド

docker image build -t my-web .
[+] Building 2.3s (6/6) FINISHED => [internal] load build definition from Dockerfile => [internal] load .dockerignore => [internal] load metadata for docker.io/library/nginx:1.28-alpine => [1/1] FROM docker.io/library/nginx:1.28-alpine => exporting to image => => naming to docker.io/library/my-web

ビルドコンテキストが送信され、Dockerfileの各命令が順番に実行されています。

📝 コマンドを分解すると

対象
docker image
操作
build
オプション
-t my-web
ビルドコンテキスト
.
  • docker image - イメージを操作
  • build - Dockerfileからビルド
  • -t my-web - 「my-web」という名前を付ける
  • . - 現在のディレクトリをビルドコンテキストとして使う

2作成されたイメージを確認

docker image ls my-web
REPOSITORY TAG IMAGE ID CREATED SIZE my-web latest abc123def456 10 seconds ago 43.2MB

✅ 「my-web」イメージが作成されました!

📦 ビルドコンテキストとは?

コマンドの最後にパスを指定すると、そのディレクトリが「ビルドコンテキスト」になります。
今回は .(現在のディレクトリ)を指定しています。

ビルドコンテキスト = Dockerデーモンに送るファイル一式

ビルドコンテキスト(.)
📄 Dockerfile
📄 index.html
Docker
デーモン
イメージ
📦 my-web

💡 . は現在のディレクトリを意味します

🎯 学んだこと

  • docker image build -t 名前 . でイメージをビルド
  • . はビルドコンテキスト(Dockerデーモンに送るファイル一式)
  • -t でイメージに名前(タグ)を付ける

🚀 動作確認:コンテナを起動

作成したイメージからコンテナを起動してみましょう!

1コンテナを起動

docker container run -d --name my-web-container -p 8080:80 my-web
a1b2c3d4e5f6...

2ブラウザでアクセス

ブラウザで以下にアクセスしてください:

👀 何が表示される?

「Welcome to nginx!」というnginxのデフォルトページが表示されます。

まだ自分のHTMLをコピーしていないので、nginxの初期ページが表示されています。

3確認したら停止・削除

docker container rm -f my-web-container

🎯 ここまでの成果

FROM だけのDockerfileでイメージを作成・起動できました!

次は COPY を追加して、自分のHTMLを表示させましょう。

📋 COPY:ファイルをコピー

COPY でホスト(あなたのPC)のファイルをイメージ内にコピーできます。

1Dockerfileに COPY を追加

echo 'COPY index.html /usr/share/nginx/html/' >> Dockerfile

💡 >> は追記です(上書きではない)

2Dockerfileを確認

cat Dockerfile
FROM nginx:1.28-alpine COPY index.html /usr/share/nginx/html/

📝 COPY を分解すると

命令
COPY
コピー元(ホスト)
index.html
コピー先(コンテナ)
/usr/share/nginx/html/

→ 作成した index.html を、nginxの公開ディレクトリにコピー

3再ビルド

docker image build -t my-web .

4コンテナを起動して確認

docker container run -d --name my-web-container -p 8080:80 my-web

ブラウザで http://localhost:8080 を開いてください。

🎊 成功!

「Hello from my Dockerfile」が表示されれば成功です!

自分で作ったHTMLが表示されています!

5確認したら停止・削除

docker container rm -f my-web-container

💡 COPY と -v の違い

COPY
ビルド時にイメージ内にコピー
(イメージの一部になる)
-v(バインドマウント)
実行時にホストのファイルをマウント
(イメージには含まれない)

🎯 学んだこと

  • COPY コピー元 コピー先 でファイルをコピー
  • Dockerfileを変更したら再ビルドが必要

📦 ビルドコンテキストを理解する

COPY でエラーが出ることがあります。
わざとエラーを起こして、ビルドコンテキストの仕組みを理解しましょう。

1親ディレクトリにファイルを作成

作業フォルダのにファイルを作ります:

echo 'secret data' > ~/secret.txt

2親ディレクトリからCOPYしてみる

Dockerfileを作成して、親ディレクトリのファイルをコピーしようとします:

echo 'FROM nginx:1.28-alpine' > Dockerfile.test
echo 'COPY ../secret.txt /app/' >> Dockerfile.test

3ビルドしてみる(エラーになる)

docker image build -f Dockerfile.test -t test .
ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref: "/secret.txt": not found

❌ なぜエラー?

COPY ../secret.txtビルドコンテキストの外なのでアクセスできません。

📁 今回の状況を図で確認

~/
├── secret.txt           ← ビルドコンテキストの(アクセス不可)
│
└── dockerfile-practice/  ← ビルドコンテキスト(. で指定)
    ├── Dockerfile
    ├── Dockerfile.test
    └── index.html        ← ビルドコンテキストの(アクセス可能)

💡 セキュリティのため、ビルドコンテキスト外のファイルにはアクセスできません

4正しい方法:ファイルをビルドコンテキスト内に置く

コピーしたいファイルは、ビルドコンテキスト内に配置します:

# ファイルをビルドコンテキスト内にコピー
cp ~/secret.txt ./secret.txt
# Dockerfileを修正
echo 'FROM nginx:1.28-alpine' > Dockerfile.test
echo 'COPY secret.txt /app/' >> Dockerfile.test

5再度ビルド(成功する)

docker image build -f Dockerfile.test -t my-web:test .
[+] Building 0.5s (7/7) FINISHED => [1/2] FROM docker.io/library/nginx:1.28-alpine => [2/2] COPY secret.txt /app/ => exporting to image => => naming to docker.io/library/my-web:test

✅ ビルド成功!

📄 -f オプションとは?

デフォルトでは Dockerfile という名前のファイルを探しますが、 -f で別のファイルを指定できます。

デフォルト
docker image build -t my-web .

→ Dockerfile を使用

-f で指定
docker image build -f Dockerfile.test -t my-web .

→ Dockerfile.test を使用

💡 開発用・本番用でDockerfileを分けたい場合に便利!

6後片付け

docker image rm my-web:test
rm Dockerfile.test secret.txt ~/secret.txt

🎯 学んだこと

  • COPY はビルドコンテキスト内のファイルのみコピー可能
  • ビルドコンテキスト = docker image build の最後の引数(.
  • -f オプションで別のDockerfileを指定できる

📚 補足:柔軟な指定が可能

ビルドコンテキストは . 以外も指定できます。

# サブディレクトリを指定
docker image build -t my-web ./app
# 絶対パスで指定
docker image build -t my-web /path/to/project
# Dockerfileとビルドコンテキストを別々に指定
docker image build -f ../Dockerfile -t my-web ./app

💡 Dockerfile はビルドコンテキスト外に置いてもOK(-f で指定)
💡 COPY できるのはビルドコンテキスト内のファイルのみ

📚 補足:Dockerfileの名前

Dockerfile という名前でなくてもOKです。-f で指定すればどんな名前でもビルドできます。

docker image build -f MyDockerfile -t my-web .
docker image build -f Dockerfile.prod -t my-web:prod .
docker image build -f docker/web.dockerfile -t my-web .

💡 -f を省略すると Dockerfile という名前を探す
💡 慣習として Dockerfile を使うことが多い

🔧 RUN:コマンドを実行

RUN を使って、ビルド時にコマンドを実行できます。

🆕 RUN とは?

イメージのビルド時にコマンドを実行します。
パッケージのインストール、ファイルの作成などに使います。

RUN コマンド

1まずはシンプルに書いてみる

最初は RUN を複数行で書いてOKです。何回ビルドしても大丈夫!

FROM php:8.3-fpm RUN apt-get update RUN apt-get install -y git RUN apt-get install -y curl

💡 apt-get update はパッケージリストを取得します(最初に必須)
💡 -y は確認なしでYes(Dockerfileでは必須)

docker image build -t php:test .

2もう一度ビルドしてみる(キャッシュ体験)

同じコマンドをもう一度実行してください:

docker image build -t php:test2 .
[+] Building 0.5s (7/7) FINISHED => CACHED [2/4] RUN apt-get update => CACHED [3/4] RUN apt-get install -y git => CACHED [4/4] RUN apt-get install -y curl

⚡ 一瞬で終わる!すべて「CACHED」と表示されます。

3途中を変更してビルド(キャッシュが無効になる)

2行目を変更してみましょう:

FROM php:8.3-fpm RUN apt-get update RUN apt-get install -y git vim ← 変更! RUN apt-get install -y curl
docker image build -t php:test3 .
=> CACHED [2/4] RUN apt-get update => [3/4] RUN apt-get install -y git vim ← 再実行 => [4/4] RUN apt-get install -y curl ← これも再実行

⚠️ 変更した行以降はすべてキャッシュが無効になります

⚡ キャッシュの仕組み

  • Dockerは各RUNの結果をキャッシュします
  • 同じ命令なら「CACHED」でスキップ → 高速
  • 変更があると、その行以降すべて再実行

4後片付け

docker image rm php:test

🛠️ 実際のDockerfileの作り方(実践的なワークフロー)

実務では、いきなり完璧なDockerfileを書くのではなく、試行錯誤しながら作っていきます

📝 ポイント1:RUNは1つにまとめない(開発段階)

開発・学習段階では、RUNを分けて書いた方がデバッグしやすいです:

✅ 開発中はこう書く
RUN apt-get update RUN apt-get install -y git RUN apt-get install -y curl

• エラー箇所がわかりやすい
• レイヤー単位でキャッシュ(下記参照↓)

⚡ 必要なものが決まったらまとめる
RUN apt-get update && \ apt-get install -y git curl

• レイヤーが減る
• イメージサイズが小さくなる

📝 ポイント2:コンテナ内で試す → 成功したらDockerfileに追記

「何をインストールすればいいか」は、まずコンテナ内で試してから確定させます:

1
docker container run -it php:8.3-fpm bash ← コンテナに入る
2
apt-get update && apt-get install -y curl ← 試す
3
curl --version ← 動作確認 → 成功!
4
Dockerfileに 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 でレイヤーを確認できます:

docker image history php:test
IMAGE CREATED SIZE CREATED BY abc123 2 min ago 5MB RUN apt-get install -y curl def456 2 min ago 50MB RUN apt-get install -y git ghi789 2 min ago 25MB RUN apt-get update ...

💡 レイヤーを意識するのはどんな時?

  • イメージサイズを小さくしたい → RUNをまとめてレイヤーを減らす
  • ビルドを速くしたい → 変更が多い命令は後ろに置く(キャッシュが効きやすい)

※ ML(機械学習)系の巨大イメージでは重要ですが、Web開発では意識しなくても問題ないことが多いです

5慣れたら1つにまとめる(実務向け)

実務ではイメージサイズを小さくするため、1つのRUNにまとめます:

FROM php:8.3-fpm RUN apt-get update && apt-get install -y \ git \ curl \ libzip-dev \ && docker-php-ext-install zip pdo_mysql \ && apt-get clean
\
行を継続
&&
成功したら次へ
-y
確認なしでYes
パッケージの役割:
  • git → Composer用
  • curl → API通信
  • libzip-dev → Excel操作(PhpSpreadsheet)
  • pdo_mysql → DB接続
  • apt-get clean → キャッシュ削除で軽量化

6ビルド

docker image build -t my-web:v2 .
[+] Building 16.1s (6/6) FINISHED => [1/2] FROM docker.io/library/php:8.3-fpm => [2/2] RUN apt-get update && apt-get install -y git curl libzip-dev ... => exporting to image => => naming to docker.io/library/my-web:v2

RUNが1つにまとまっているので、レイヤーも1つになります。

7curlがインストールされたか確認

docker container run --rm my-web:v2 curl --version
curl 8.5.0 (x86_64-alpine-linux-musl) libcurl/8.5.0 ...

✅ curlがインストールされています!

🎯 学んだこと

  • RUN はビルド時にコマンドを実行
  • パッケージのインストールなどに使う
  • RUN がイメージのレイヤーになる

▶️ CMD:起動コマンド

CMD はコンテナ起動時に実行されるデフォルトコマンドを設定します。

🆕 CMD とは?

コンテナ起動時に実行されるデフォルトのコマンドを設定します。

CMD ["コマンド", "引数1", "引数2"]

⚠️ RUN と CMD の違い

RUN

ビルド時に実行

パッケージインストールなど

CMD

コンテナ起動時に実行

アプリの起動など

1Dockerfileを更新

CMDを追加します(nginxはデフォルトでCMDを持っていますが、明示的に書きます):

echo 'FROM nginx:1.28-alpine' > Dockerfile
echo 'RUN apk add --no-cache curl' >> Dockerfile
echo 'COPY index.html /usr/share/nginx/html/' >> Dockerfile
echo 'CMD ["ls", "-la"]' >> Dockerfile

📝 CMD を分解すると

命令
CMD
コマンド
"ls"
引数
"-la"

💡 JSON配列形式で書きます。ダブルクォート " を使うこと!

2再ビルド

docker image build -t my-web:v3 .

💡 CMD は上書きできる

docker container run でコマンドを指定すると、CMDが上書きされます:

# デフォルトのCMD(nginx)を実行
docker container run my-web:v3
# CMDを上書きしてシェルを起動
docker container run -it my-web:v3 /bin/sh

🎯 学んだこと

  • CMD はコンテナ起動時のデフォルトコマンド
  • RUN(ビルド時)と CMD(起動時)の違い
  • CMDdocker container run で上書きできる

🌍 ENV:環境変数

ENV でコンテナ内で使える環境変数を設定できます。

🆕 ENV とは?

コンテナ内で使える環境変数を設定します。

ENV 変数名=値

1Dockerfileを更新

環境変数を追加します:

echo 'FROM nginx:1.28-alpine' > Dockerfile
echo 'ENV APP_NAME="My Docker App"' >> Dockerfile
echo 'ENV APP_VERSION="1.0"' >> Dockerfile
echo 'ENV TZ=Asia/Tokyo' >> Dockerfile
echo 'ENV LANG=ja_JP.UTF-8' >> Dockerfile
echo 'RUN apk add --no-cache curl' >> Dockerfile
echo 'COPY index.html /usr/share/nginx/html/' >> Dockerfile
echo 'CMD ["nginx", "-g", "daemon off;"]' >> Dockerfile

2再ビルド

docker image build -t my-web:v4 .

3環境変数を確認

docker container run --rm my-web:v4 env | grep -E "APP|TZ|LANG"
APP_NAME=My Docker App APP_VERSION=1.0 TZ=Asia/Tokyo LANG=ja_JP.UTF-8

✅ 環境変数が設定されています!

💡 ENV の使用例

# 本番/開発の切り替え
ENV NODE_ENV=production

# タイムゾーン
ENV TZ=Asia/Tokyo

# 言語設定
ENV LANG=ja_JP.UTF-8

💡 docker run で上書きできる

# -e オプションで環境変数を上書き
docker container run -e APP_VERSION="2.0" my-web:v4

📚 上級者向け参考:ARG

ENV と似た命令に ARG があります。
ARGはビルド時にだけ使える変数で、完成したイメージには残りません。

Dockerfileの例:

ARG NODE_VERSION=20
FROM node:${NODE_VERSION}-alpine

ビルド時に値を変更:

# デフォルト(node:20)でビルド
docker image build -t myapp .
# node:18 でビルド
docker image build --build-arg NODE_VERSION=18 -t myapp .

💡 この講座では ENV だけ覚えればOKです。
ARG はCI/CDパイプラインやマルチステージビルドで使われます。

🎯 学んだこと

  • ENV でコンテナ内の環境変数を設定
  • docker container run -e で上書き可能
  • 設定値の外部化に便利

⚠️ ENVに機密情報を書かない!

ENVに書いた値はイメージに残るため、誰でも見れてしまいます。

# イメージの環境変数を確認できる
docker image inspect my-web:v4 | grep -A 10 '"Env"'
❌ Dockerfileに書かない
• DBパスワード
• APIキー・シークレット
• 認証トークン
✅ 実行時に渡す
docker container run -e DB_PASSWORD="secret" ...

📂 WORKDIR:作業ディレクトリ

WORKDIR で作業ディレクトリを設定できます。

🆕 WORKDIR とは?

以降の RUN, CMD, COPY などの作業ディレクトリを設定します。
cd コマンドのようなものです。ディレクトリが存在しない場合は自動作成されます。

WORKDIR /app

⚠️ WORKDIRを指定しないと / (ルート)になる

WORKDIRを指定しない場合、作業ディレクトリは /(ルートディレクトリ)になります。
コンテナに入った時のプロンプトが /# になっているのはこのためです。

1WORKDIRなしでファイルを作成

まずWORKDIRを指定せずにファイルを作ってみます:

echo 'FROM nginx:1.28-alpine' > Dockerfile
echo 'RUN touch test.txt' >> Dockerfile
docker image build -t workdir-test:v1 .

2ファイルがどこにあるか確認

docker container run --rm workdir-test:v1 ls -la /test.txt
-rw-r--r-- 1 root root 0 Jan 15 10:00 /test.txt

→ ルート / に作成されました。

3WORKDIRを指定してファイルを作成

今度はWORKDIRを指定します:

echo 'FROM nginx:1.28-alpine' > Dockerfile
echo 'WORKDIR /app' >> Dockerfile
echo 'RUN touch test.txt' >> Dockerfile
docker image build -t workdir-test:v2 .

4ファイルの場所を確認

docker container run --rm workdir-test:v2 ls -la /app/test.txt
-rw-r--r-- 1 root root 0 Jan 15 10:00 /app/test.txt

/app に作成されました!

5プロンプトの違いを確認

コンテナに入った時のプロンプトも変わります:

# WORKDIRなし → プロンプトは /#
docker container run --rm -it workdir-test:v1 /bin/sh
/ #
# WORKDIRあり → プロンプトは /app #
docker container run --rm -it workdir-test:v2 /bin/sh
/app #

🎯 学んだこと

  • WORKDIR で作業ディレクトリを設定
  • 指定しないとルート / になる
  • 以降の RUN, COPY, CMD に影響
  • ディレクトリが存在しない場合は自動作成

🚫 .dockerignore:除外ファイル

.dockerignore ファイルを使うと、COPYでコピーされないファイルを指定できます。

🆕 .dockerignore とは?

COPY でコピーしたくないファイルやフォルダを指定するファイルです。
.gitignore と同じような書き方ができます。

⚠️ なぜ必要?

  • node_modules → コンテナ内で npm install するので不要。ホスト(Mac)とコンテナ(Linux)でOSが違うと動かないパッケージもある
  • .env など機密情報 → セキュリティリスク
  • .git など不要なファイル → 無駄なコピー

1テスト用ファイルを作成

まず、コピーされるファイルとされないファイルを用意します:

echo 'これはコピーされる' > copy-me.txt
echo 'これはコピーされない' > secret.txt

2.dockerignoreなしでビルド

まず .dockerignore なしで試します:

rm -f .dockerignore
echo 'FROM nginx:1.28-alpine' > Dockerfile
echo 'COPY . /data/' >> Dockerfile
docker image build -t ignore-test:v1 .

3両方のファイルがコピーされたか確認

docker container run --rm ignore-test:v1 ls /data/
Dockerfile copy-me.txt index.html secret.txt

⚠️ secret.txt もコピーされています!

4.dockerignore を作成

secret.txt を除外するように設定します:

echo 'secret.txt' > .dockerignore

5再ビルド

docker image build -t ignore-test:v2 .

6除外されたか確認

docker container run --rm ignore-test:v2 ls /data/
Dockerfile copy-me.txt index.html

secret.txt がコピーされていません!

📝 よく使う .dockerignore の内容

# 依存関係(コンテナ内で再インストールする) node_modules vendor # 機密情報 .env *.pem # Git関連 .git .gitignore # ログ・一時ファイル *.log *.tmp

💡 .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

🧹 後片付け

作成したリソースを削除

# 停止しているコンテナをまとめて削除
docker container prune
# 使っていないイメージをまとめて削除
docker image prune -a
# 作業フォルダを削除(任意)
rm -rf ~/dockerfile-practice

⚠️ prune は使っていないもの全てを削除します。他のプロジェクトのイメージも消える可能性があるので注意。

📝 このセクションのまとめ

✅ 学んだこと

  • Dockerfileはイメージの設計図
  • docker image build -t 名前 . でイメージをビルド
  • ビルドコンテキスト.)がDockerデーモンに送られる
  • FROMでベースイメージを指定
  • COPYでファイルをコピー(ビルドコンテキスト内のみ)
  • RUNでビルド時にコマンドを実行
  • CMDでコンテナ起動時のコマンドを設定
  • ENVで環境変数を設定
  • WORKDIRで作業ディレクトリを設定
  • .dockerignoreで不要なファイルを除外

🎉 おめでとうございます!

自分だけのDockerイメージを作成できるようになりました!

🎯 次のステップ

次のセクションではDocker Hubについて学びます。

今作ったDockerfileの命令が、Docker Hubでレイヤーとして表示されることを確認しましょう!