はじめに
第2回では、Docker Desktop(Windows/Mac)またはDocker Engine(Linux)を導入し、
hello-worldコンテナを起動して「Dockerが動く状態」を確認しました。
ここまで到達できれば、次はいよいよDockerの本質である「自分のアプリをコンテナ化する」段階に入れます。
第3回では、その中心となるDockerfileを扱います。
Dockerfileは一見すると単なる設定ファイルですが、
実際には「開発環境・検証環境・本番環境を同じ手順で再現するための設計書」です。
本記事では、FROM / RUN / COPY / CMD / ENTRYPOINT を中心に、業務で困らない理解を目指して整理します。
Dockerfileとは何か?
Dockerfileは、コンテナを作るための「手順書」です。
たとえば、あなたが新しいPCをセットアップするとき、
- OSを入れる
- 必要なソフトを入れる
- 設定する
- 最後にアプリを起動する
という流れがあります。
Dockerfileは、これを 文章で再現するものです。
そしてDockerは、その文章を元に
同じ環境を何度でも再現できるようにしてくれます。
Dockerfileで何が嬉しいのか
Dockerfileがあると、次のメリットがあります。
① 同じ環境を何度でも作れる
「動くPC」を手作業で作るのは大変です。
人によって環境が微妙に違うと、バグの原因になります。
Dockerfileがあると、誰がやっても同じ環境になります。
② チームに渡せる
DockerfileをGitで管理すれば、
- 新しいメンバーが来た
- 別のPCに移したい
- サーバーにデプロイしたい
というときもスムーズです。
③ 自動化に繋がる
Dockerfileは、CI/CD(自動テスト・自動デプロイ)にも直結します。
つまりDockerfileは、実務で避けて通れません。
Dockerfileの基本構造
まずは全体像を見てみます。
以下は「Node.jsアプリ」を動かす例です。
FROM node:20
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]
このDockerfileがやっていることは、かなりシンプルです。
- Node.jsが入った土台を用意する
- 作業するフォルダを決める
- 必要なファイルをコピーする
- 必要なソフト(npm)を入れる
- アプリを起動する
ここからは、命令を1つずつ見ていきます。
FROM:土台となるイメージを選ぶ
FROM は、Dockerfileの最初に書く命令です。
意味はこうです。
「このコンテナは、どの環境を元に作るか」
たとえば以下は、Node.jsが入った環境を元にするという意味です。
FROM node:20
初心者は公式イメージを使うのが安全
入門段階では、まず以下を使うのが安心です。
- node:20
- php:8.2-fpm
- python:3.12
- nginx:latest
- mysql:8
理由は単純で、情報が多く、困ったときに解決しやすいからです。
RUN:セットアップ作業をする
RUN は、コンテナの中でコマンドを実行する命令です。
例:
RUN npm install
これは「必要なライブラリをインストールする」という意味です。
よくあるRUNの例
RUN apt-get update
RUN apt-get install -y git
このように「必要なツールを入れる」ために使います。
COPY:ファイルをコンテナに入れる
COPY は、あなたのPCにあるファイルを
コンテナの中へコピーする命令です。
COPY . .
これは少し分かりにくいですが、
- 左側:コピー元(あなたのPC側)
- 右側:コピー先(コンテナ側)
という意味です。つまりこれは、
「今いるフォルダの中身を、コンテナの今いる場所に全部コピーする」
という命令になります。
CMD:起動時に実行するコマンドを書く
CMD は、コンテナを起動したときに実行されるコマンドです。
例:
CMD ["node", "server.js"]
つまりこのDockerfileは、
コンテナが起動したら node server.js を実行する
という意味になります。
ENTRYPOINT:起動コマンドを固定したいときに使う
ENTRYPOINT は、初心者にとっては少し難しい命令です。
ただし実務ではよく使います。
簡単に言えばこうです。
- CMD:起動コマンドを「変更できる」
- ENTRYPOINT:起動コマンドを「固定する」
例:常に同じプログラムを実行させたい
ENTRYPOINT ["python", "app.py"]
こう書くと、そのコンテナは「Pythonアプリを動かすもの」として固定されます。
CMDとENTRYPOINTの違い(入門向けの理解)
- 入門段階では、こう覚えるのが一番安全です。まずは CMD を使う
- ENTRYPOINT は「慣れてから」でOK
Dockerfileは、最初から全部を理解する必要はありません。
「動くDockerfileを作れること」が第一です。
WORKDIR:作業する場所を決める
今回の基本命令には含めていませんでしたが、
実務ではほぼ必須なので紹介します。
WORKDIR /app
これは
以降の命令は /app の中で実行する
という意味です。
Dockerfileを使った基本操作(build→run)
Dockerfileを書いたら、次はこの2ステップです。
① build(イメージを作る)
docker build -t myapp .
- -t myapp:名前を付ける
- .:Dockerfileがある場所
② run(コンテナを起動する)
docker run --rm myapp
初心者がハマりやすいポイント
① COPYし忘れる
Dockerfileを書いても、アプリが入っていなければ動きません。
そのため COPY は重要です。
② buildしたのに反映されない
Dockerは、処理を早くするために「前回の結果を使う」ことがあります。
変更が反映されないときは、一度これを試します。
docker build –no-cache -t myapp .
③ CMDが間違っていて起動しない
コンテナは、起動するコマンドが失敗するとすぐ終了します。
「コンテナがすぐ落ちる」場合はCMDを疑うのが基本です。
まとめ
Dockerfileは、コンテナ環境の設計図です。
まずは以下を押さえれば、実務の第一歩として十分です。
- FROM:土台を選ぶ
- RUN:セットアップする
- COPY:ファイルを入れる
- CMD:起動時に実行する
- ENTRYPOINT:起動コマンドを固定する(慣れてから)
次回予告
次回(第4回)は Docker Compose入門です。
Dockerfileで「1つのコンテナ」を作れるようになったら、次は
- Web(アプリ)
- DB(データベース)
のように 複数のコンテナをまとめて動かす方法を学びます。
業務でDockerを使うなら、Composeはほぼ必須です。