ウェブエンジニア問題集
第3章

Dockerfile入門 — FROM・COPY・RUN・CMDの基本

3
この章の目次開く

Dockerfileは、Dockerイメージの作り方を書くファイルです。

既存の node:22nginx イメージをそのまま使うだけでなく、自分のアプリを含めたイメージを作るには Dockerfile が必要になります。

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-app
bash

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

node_modules やビルド成果物、Git履歴、秘密情報をイメージに入れないようにします。不要なファイルを含めると、ビルドが遅くなり、イメージサイズも大きくなります。

CMDとRUNの違い

RUN はイメージを作るときに実行されます。CMD はコンテナを起動するときに実行されます。

命令実行タイミング
RUNdocker buildRUN npm install
CMDdocker runCMD ["npm", "start"]

ここを混同すると、「build時にサーバーを起動しようとする」「起動時に依存インストールを毎回走らせる」といった不自然なDockerfileになります。

ちゃんと使うためのポイント

  • Dockerfileはイメージの作り方を書く
  • FROM でベースを選び、COPY / RUN で必要なものを入れる
  • RUN はbuild時、CMD はrun時
  • COPY package*.jsonRUN npm installCOPY . . の順にするとキャッシュを使いやすい
  • .dockerignore で不要ファイルや秘密情報を入れない