- Day4:Dockerfile入門(最重要ステップ)
- Dockerfileとは何か(初心者がまず理解すべき本質)
- 例題:Node.jsアプリをDocker化する流れ
- FROM:ベースとなる環境を選ぶ
- WORKDIR:作業ディレクトリを決める
- COPY:アプリのコードをコンテナにコピーする
- RUN:コンテナ内でコマンドを実行する
- CMD:コンテナ起動時に実行されるコマンド
- Dockerfile 全体の流れを物語として理解する
- 実際にイメージを作ってコンテナを動かす
- Pythonアプリの場合の違い(初心者が知っておくと強い)
- Dockerfileを書くときの“実務的な思考”
- Day4のゴール:自分のコードをコンテナ化できる
Day4:Dockerfile入門(最重要ステップ)
Day4は、Docker学習の中でも“最重要ポイント”です。
なぜなら Dockerfile を理解すると「自分のアプリを自由にコンテナ化できる」ようになるから です。
ここから先は、既存のイメージを使うだけでなく、あなた自身が“コンテナを設計する側”に回ります。
Dockerfileとは何か(初心者がまず理解すべき本質)
アプリを動かすための「レシピ」
Dockerfileは、
「このアプリを動かすために必要な環境を、こうやって作ってください」
というレシピ(設計書)です。
料理に例えると、
材料(ベースイメージ)を用意し、
調理手順(RUN)を書き、
最後にどうやって提供するか(CMD)を指定する、
そんなイメージです。
Dockerfile → イメージ → コンテナ の流れ
Dockerfileはあくまで「設計書」。
これを docker build すると「イメージ(設計図の完成品)」ができ、
そのイメージから docker run すると「コンテナ(実行環境)」が生まれます。
この流れを理解すると、Dockerの世界が一気にクリアになります。
例題:Node.jsアプリをDocker化する流れ
ここでは、次のような簡単な Node.js アプリを想定します。
app.js
package.json
このアプリを Dockerfile を使ってコンテナ化します。
FROM:ベースとなる環境を選ぶ
FROM node:18 の意味
FROM node:18
これは
「Node.js 18 がインストールされた公式イメージを使う」
という宣言です。
初心者がよく誤解するのは、
「Node.js を自分でインストールする必要があるの?」
という点ですが、答えは NO です。
Dockerの世界では、
必要な環境はすでに誰かが作ってくれている
というのが大前提です。
WORKDIR:作業ディレクトリを決める
WORKDIR /app の意味
WORKDIR /app
これは
「このコンテナの中で作業する場所を /app にします」
という宣言です。
以降の COPY や RUN はすべてこの /app の中で実行されます。
COPY:アプリのコードをコンテナにコピーする
COPY . . の意味
COPY . .
これは
「ホスト側の現在のフォルダ(.)を、コンテナ内の作業ディレクトリ(.)にコピーする」
という意味です。
つまり、あなたの app.js や package.json がコンテナの /app にコピーされます。
RUN:コンテナ内でコマンドを実行する
RUN npm install の意味
RUN npm install
これは
「コンテナの中で npm install を実行して、依存パッケージをインストールする」
という処理です。
ここで重要なのは、
npm install はホストではなくコンテナの中で実行される
という点です。
つまり、ホスト側に Node.js がインストールされていなくても問題ありません。
CMD:コンテナ起動時に実行されるコマンド
CMD [“node”, “app.js”] の意味
CMD ["node", "app.js"]
これは
「コンテナが起動したら node app.js を実行してアプリを動かす」
という設定です。
RUN は「イメージを作るときに実行される」
CMD は「コンテナを起動したときに実行される」
この違いは非常に重要です。
Dockerfile 全体の流れを物語として理解する
Dockerfile を読むと、次のようなストーリーが見えてきます。
Node.js 18 が入った環境を用意して、
作業場所を /app にして、
アプリのコードをコピーして、
依存パッケージをインストールして、
最後にアプリを起動する。
この流れが理解できれば、どんな言語のアプリでも Docker 化できます。
実際にイメージを作ってコンテナを動かす
イメージをビルドする
docker build -t myapp .
これは
「このフォルダの Dockerfile を使って myapp という名前のイメージを作る」
という意味です。
コンテナを起動する
docker run -p 3000:3000 myapp
アプリが 3000 番ポートで動くなら、
ブラウザで http://localhost:3000 にアクセスできます。
Pythonアプリの場合の違い(初心者が知っておくと強い)
Pythonアプリの場合は、次のような Dockerfile になります。
FROM python:3.11
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
Node.js とほぼ同じ構造で、
npm install が pip install に変わるだけです。
つまり、
Dockerfile の構造はどの言語でもほぼ同じ
ということです。
Dockerfileを書くときの“実務的な思考”
1. ベースイメージは公式を使う
公式イメージはセキュリティ的に安全で、更新も早いです。
2. COPY の順番を工夫してキャッシュを活かす
実務では、
package.json → npm install → 残りのコード
の順に COPY することでビルド時間を短縮します。
3. CMD と RUN の違いを理解する
RUN は「イメージ作成時」
CMD は「コンテナ起動時」
この違いを理解すると、Dockerfileの設計が一気に上手くなります。
Day4のゴール:自分のコードをコンテナ化できる
ここまで理解できれば、
Node.js でも Python でも Go でも Java でも、
どんなアプリでも Docker 化できます。
Dockerfile は最初は難しく見えますが、
実は「決まった型」があるので、一度理解すると一気に応用できます。
