第3章
Dockerfile入門 — FROM・COPY・RUN・CMDの基本
約3分
Dockerfileは、Dockerイメージの作り方を書くファイルです。
既存の node:22 や nginx イメージをそのまま使うだけでなく、自分のアプリを含めたイメージを作るには Dockerfile が必要になります。
最小のDockerfile
Node.jsアプリなら、最小構成は次のようになります。
FROM node:22
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]dockerfile
それぞれの命令には役割があります。
| 命令 | 役割 |
|---|---|
FROM | ベースイメージを指定する |
WORKDIR | 以降の作業ディレクトリを指定する |
COPY | ホスト側のファイルをイメージ内へコピーする |
RUN | イメージ作成中にコマンドを実行する |
CMD | コンテナ起動時に実行するコマンドを指定する |
buildしてrunする
Dockerfileからイメージを作るには docker build を使います。
docker build -t my-node-app .bash
-t my-node-app はイメージ名を付ける指定です。最後の . は「現在のディレクトリをビルドコンテキストにする」という意味です。
作ったイメージからコンテナを起動します。
docker run --name app -p 3000:3000 my-node-appbash
COPYの順番には意味がある
Dockerfileでは、命令ごとにレイヤーが作られます。依存関係のインストールは時間がかかるため、キャッシュを効かせやすい順番にするのが重要です。
COPY package*.json ./
RUN npm install
COPY . .dockerfile
先に package.json と lock file だけをコピーして npm install し、その後にアプリ本体をコピーします。こうすると、ソースコードだけを変更した場合は npm install のレイヤーを再利用しやすくなります。
.dockerignoreを使う
.dockerignore は、Docker build に含めないファイルを指定するためのファイルです。
node_modules
.next
.git
.envnode_modules やビルド成果物、Git履歴、秘密情報をイメージに入れないようにします。不要なファイルを含めると、ビルドが遅くなり、イメージサイズも大きくなります。
CMDとRUNの違い
RUN はイメージを作るときに実行されます。CMD はコンテナを起動するときに実行されます。
| 命令 | 実行タイミング | 例 |
|---|---|---|
RUN | docker build 中 | RUN npm install |
CMD | docker run 時 | CMD ["npm", "start"] |
ここを混同すると、「build時にサーバーを起動しようとする」「起動時に依存インストールを毎回走らせる」といった不自然なDockerfileになります。
ちゃんと使うためのポイント
- Dockerfileはイメージの作り方を書く
FROMでベースを選び、COPY/RUNで必要なものを入れるRUNはbuild時、CMDはrun時COPY package*.json→RUN npm install→COPY . .の順にするとキャッシュを使いやすい.dockerignoreで不要ファイルや秘密情報を入れない