【コンテナ技術】第3回:Dockerfile入門(FROM, RUN, COPY, CMD, ENTRYPOINT)|現場で使うDocker実践入門

   夜空を飛ぶコンテナを背負ったdockerクジラ

はじめに

第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がやっていることは、かなりシンプルです。

  1. Node.jsが入った土台を用意する
  2. 作業するフォルダを決める
  3. 必要なファイルをコピーする
  4. 必要なソフト(npm)を入れる
  5. アプリを起動する

ここからは、命令を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はほぼ必須です。