05
SECTION

Dockerfile を読む

この章で学ぶこと
1Dockerfile の役割と、docker build でイメージを作る流れ
2ビルド時に動く命令(FROM・WORKDIR・COPY・RUN)をコンテナの中で確かめる
3起動時・メタデータの命令(CMD・ENTRYPOINT・EXPOSE・ENV)の読み方
TOPIC

Dockerfile とは

Dockerfile
自分専用のイメージを作るための手順書
既製と自作の違い
既製イメージはそのまま使えるが、自分のアプリには専用のイメージが必要
テキストファイル
1 行 1 命令、上から順に処理されて 1 つのイメージが完成する
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

サンプル Dockerfile の全体

この章の題材:Node.js アプリ向けの最小 Dockerfile(8 つの命令)

src/5/node-app/Dockerfile
FROM node:20-alpine WORKDIR /app COPY package.json package-lock.json ./RUN npm ci COPY . . ENV NODE_ENV=production EXPOSE 3000 CMD ["node", "server.js"]
まず全体を眺めて、読解は動かした後で 1 命令ずつ
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

server.js — 応答を返すアプリ本体

Express 製の最小 Web サーバ
アクセスに「Hello from Docker (chapter 5 sample)」を返す
src/5/node-app/server.js
お手元のエディタでお開きください
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
DEMO

ビルドして起動して動作確認

目的サンプルをビルドし、起動して、ブラウザで動作を確認する
実行する
コマンド
$ cd src/5/node-app$ docker build -t chapter5-node-app .$ docker run --rm -d -p 3000:3000 --name ch5-app chapter5-node-app
その後: ブラウザで http://localhost:3000 → エディタで server.js → docker images chapter5-node-app
確認する
ポイント
ビルド出力に [1/5]〜[5/5] が順に流れる / ブラウザに Hello from Docker が表示される / docker images の一覧にイメージが登録される
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

イメージの入手経路 — pull と build

pull(既製)と build(自作)— 2 つの経路が手元のイメージ一覧に合流する

Docker Hub
既製イメージの配布元
Dockerfile+コンテキスト
src/5/node-app/ のファイル一式
docker pull
docker build
既製イメージ
nginx・postgres など
自作イメージ
chapter5-node-app
docker images(手元のイメージ一覧)
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

docker build の引数を読む

$ docker build -t chapter5-node-app .
-t <名前>出来上がるイメージに付けるタグ(名前)
.(末尾)ビルドコンテキスト= Docker に送るディレクトリの指定
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
DEMO

docker exec でコンテナの中に入る

目的ここからの確認をすべて「起動中のコンテナの中」から行うため、シェルで入る
実行する
コマンド
$ docker exec -it ch5-app sh
確認する
ポイント
プロンプトが /app # に変わる(# は root シェル、/app がカレントディレクトリ)
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

FROM — ベースイメージの指定

FROM node:20-alpine — コロンで分解するイメージ名とタグの読み方

FROM node:20-alpine
Dockerfile の該当行そのまま
コロンの左
コロンの右
node
イメージ名(環境の種類)
20-alpine
タグ(バージョン+OS)
20-alpine / 20-slim / 20-bookworm
同じ Node.js 20 でも OS が違う
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
DEMO

FROM の効果を中で確かめる

目的土台が「Alpine Linux 上の Node.js 20」になっていることを中から確認する
実行する
コマンド
/app # node --version/app # cat /etc/os-release | head -2
確認する
ポイント
バージョンが v20 系である / OS 名が Alpine Linux である
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
TOPIC

WORKDIR — 作業場所の設定

WORKDIR /app
作業場所の設定
以降の RUN・COPY・CMD のカレントディレクトリになる
自動作成
指定先のディレクトリが存在しなければ作られる
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
DEMO

WORKDIR の効果を中で確かめる

目的作業場所が /app に設定されていることを確認する
実行する
コマンド
/app # pwd
確認する
ポイント
docker exec で入った直後のカレントディレクトリが /app になっている
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
TOPIC

COPY — ビルドコンテキストから取り込む

COPY package.json package-lock.json ./COPY . .
COPY src dst
ホスト側のファイルをイメージの中に取り込む
src の基準
ビルドコンテキスト(docker build で指定したディレクトリ)
package.json
アプリが必要とする外部ライブラリ(依存関係)の定義ファイル
2 行に分ける理由
依存定義を先にコピーし、全体は後から(次スライドで解説)
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

COPY を 2 段に分ける理由 — レイヤーキャッシュ

2 段構成と一括構成 — コード変更時の再ビルド速度の違い

2 段構成
本サンプル
COPY package.json package-lock.json ./
キャッシュ再利用
RUN npm ci
キャッシュ再利用
COPY . .
ここだけ再実行
一括構成
 
COPY . .
毎回再実行
RUN npm ci
毎回再実行
コードだけ変えた再ビルドでは、2 段構成の方が npm ci を飛ばせて速い
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

.dockerignore — COPY から除外する

COPY . . の取り込み対象から外したいパスを列挙するファイル(書き方は .gitignore と同じ)

src/5/node-app/.dockerignore
# 5-1 で扱う `.dockerignore` の例。# `COPY . .` でビルドコンテキストから除外したいパスを列挙する。# 書き方は `.gitignore` と同じ。node_modules.git
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
DEMO

COPY の結果を中で確かめる

目的2 つの COPY で取り込まれたファイルが /app に並んでいることを確認する
実行する
コマンド
/app # ls -l
確認する
ポイント
package.json・package-lock.json・server.js・Dockerfile が並ぶ / node_modules/ は COPY ではなく次の RUN が作ったもの
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
TOPIC

RUN — ビルド時に 1 回だけ実行

RUN npm ci
ビルド時に実行
コマンドの結果をイメージに焼き付ける
1 回だけ
docker build 中に実行。docker run のたびには走らない
起動時の処理
CMD・ENTRYPOINT で別途指定する
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
TOPIC

CMD — コンテナ起動時に実行するコマンド

CMD ["node", "server.js"]
起動時に実行
PID 1(最初のプロセス)になる
デフォルトの性格
docker run で追加引数を渡すと差し替わる
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
DEMO

CMD のプロセスを ps で確かめる

目的CMD で指定したコマンドが PID 1 として動いていることを確認する
実行する
コマンド
/app # ps
確認する
ポイント
PID 1 が node server.js である(ブラウザに応答していたのもこのプロセス)
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

ENTRYPOINT — CMD との組み合わせ

起動コマンドは ENTRYPOINT + CMD の連結。docker run の追加引数は CMD だけを差し替える

ENTRYPOINT ["python"] + CMD ["app.py"]
docker run myimage
python app.py
CMD が引数として連結
docker run myimage --version
python --version
CMD は使われず追加引数が連結
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
TOPIC

EXPOSE — 宣言にすぎない

EXPOSE 3000
読み手・ツール向けの宣言
このコンテナは 3000 番で待ち受けるという情報を残す
ポートは公開されない
通信経路を作るのは docker run -p
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
TOPIC

ENV — 環境変数をイメージに焼き付ける

ENV NODE_ENV=production
ENV KEY=value
イメージに環境変数を設定する
参照範囲
後続の RUN・起動後のコンテナ内の全プロセスから参照できる
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
DEMO

ENV の値をコンテナ内で確かめる

目的ENV で設定した環境変数がコンテナ内で参照できることを確認する
実行する
コマンド
/app # printenv NODE_ENV
確認する
ポイント
production が返ること=Dockerfile の ENV で設定した値がそのまま残っている
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

命令の整理 — ビルド時・起動時・メタデータ

8 つの命令を「いつ動くか」で 3 分類する

docker build
イメージ
docker run
ビルド時に動く
FROM・WORKDIR・COPY・RUN・ENV
起動時の振る舞い
CMD・ENTRYPOINT
メタデータの宣言
EXPOSE
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ

リスト形式とシェル形式

リスト形式はプロセスが直接 PID 1 になり、シグナルが正しく届く

CMD ["node", "server.js"]
リスト形式
CMD node server.js
シェル形式
node(PID 1)
直接メインプロセスになる
/bin/sh -c(PID 1)→ node
シェルが間に挟まる
docker stop → 直接届く
docker stop → sh で止まることがある
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
DEMO

コンテナから抜けて停止する

目的確認を終え、コンテナを片付ける
実行する
コマンド
/app # exit$ docker stop ch5-app
確認する
ポイント
--rm 付きで起動したので、停止と同時に自動削除される(docker ps -a に残らない)
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ
SECTION 05

この章のまとめ

Dockerfile は自分専用イメージの手順書。docker build が上から順に処理してイメージを作る
FROM・WORKDIR・COPY・RUN はビルド時に動き、結果がレイヤーとしてイメージに残る
CMD・ENTRYPOINT は起動時の振る舞い、EXPOSE はメタデータの宣言のみ
読み方の型:「この命令はいつ動くか」「コンテナの中に何が残るか」
次章: compose.yml を読む・docker compose を打つ
Dockerfileとは
ビルドの仕組み
FROM・WORKDIR
COPY・RUN
CMD・ENTRYPOINT
EXPOSE・ENV
命令の整理
まとめ