前の記事でDockerをインストールし、hello-worldを動かしました。この記事ではDockerfileを使って「自分だけのイメージ」を作る方法を学びます。Dockerfileを理解することで、Dockerの最も重要な概念の一つが身につきます。
Dockerfileとは何か?
Dockerfileとは、Dockerイメージを作るための手順書をテキストで書いたファイルです。「どのベースイメージを使うか」「どのライブラリをインストールするか」「どのファイルをコピーするか」などの手順を書いておくと、docker buildコマンドで自動的にイメージが作られます。
レシピに例えると「ベースイメージ=CookPadのベースレシピ」で、それにRUNやCOPYの作業を加えてオリジナルの料理(イメージ)を作るイメージです。
最小限のDockerfileを作ってみよう
まず最もシンプルなDockerfileを作って動かすまでやってみましょう。作業用のディレクトリを作ってその中にDockerfileファイルを作成します。
mkdir myapp
cd myapp
nano Dockerfile
Dockerfileに以下を記述します。
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y curl
CMD ["echo", "Hello from my Docker image!"]
3行それぞれの意味を説明します。
- FROM ubuntu:22.04:Ubuntu 22.04をベースにする、という宣言です。必ずDockerfleの1行目に書きます
- RUN apt-get update && apt-get install -y curl:イメージをビルドするときに実行するコマンドです。ここではcurlをインストールしています
- CMD […]:コンテナ起動時に実行するデフォルトコマンドです
イメージをビルドしてコンテナを起動する
docker build -t myapp:1.0 .
docker run myapp:1.0
docker build -t myapp:1.0 .の各部分を説明します。-t myapp:1.0は「イメージにmyappという名前と1.0というタグ(バージョン)を付ける」という指定で、末尾の.(ドット)は「カレントディレクトリのDockerfileを使う」という意味です。
Dockerfileの主な命令一覧
| 命令 | 意味 | 使い方の例 |
|---|---|---|
FROM | ベースイメージを指定(必須・1行目) | FROM ubuntu:22.04 |
RUN | ビルド時にコマンドを実行 | RUN apt-get install -y nginx |
COPY | ホストからファイルをコピー | COPY app.py /app/ |
WORKDIR | 作業ディレクトリを指定 | WORKDIR /app |
CMD | コンテナ起動時のデフォルトコマンド | CMD ["python3", "app.py"] |
EXPOSE | コンテナが使うポートを明示 | EXPOSE 8080 |
ENV | 環境変数を設定 | ENV PORT=8080 |
USER | 実行ユーザーを指定 | USER appuser |
実践的なDockerfileの例:Pythonアプリ
# ベースイメージ
FROM python:3.11-slim
# 作業ディレクトリを設定
WORKDIR /app
# 依存関係ファイルを先にコピー(キャッシュ効率化)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# コードをコピー
COPY . .
# ポートを開放
EXPOSE 5000
# 起動コマンド
CMD ["python3", "app.py"]
この例でrequirements.txtをコードより先にコピーしているのは、ビルドキャッシュを有効活用するためです。コードだけ変更した場合、pip installの処理がキャッシュから再利用されてビルドが速くなります。
つまずきやすいポイント
「No such file or directory」エラー
COPYのコピー元ファイルが見つからない場合に発生します。docker buildを実行するディレクトリに対象ファイルが存在するかlsで確認してください。
ビルドが遅い
初回は全レイヤーのビルドに時間がかかりますが、キャッシュが機能する2回目以降は速くなります。変更がないレイヤーはキャッシュから再利用されるためです。
まとめ
- Dockerfileはイメージを作るための手順書(テキストファイル)
- 必ず
FROMから始まる。ベースイメージはpython:3.11-slimなど軽量なslimバリアントがおすすめ docker build -t 名前:tag .でイメージをビルド、docker runで起動requirements.txtはコードより先にコピーするとビルドキャッシュが効く
次の記事ではDocker Composeを使って、Webサーバーとデータベースなど複数のコンテナをコマンド1つで起動する方法を学びます。



コメント