「Dockerを使ってみたいけど、Dockerfileの作り方が分からない」
「何を書けばいいのか、構文もルールもよく分からない」
そんな悩みを持つ方に向けて、この記事ではDockerfileの作り方を基礎から分かりやすく解説します。
Dockerfileとは、Dockerコンテナを自動構築するための設計図です。
正しく書くことで、誰でも同じ環境を簡単に再現できるようになります。
プログラミング初学者やインフラ初心者でも理解できるよう、基本的な構文から実用的なサンプルまで丁寧に説明していきます。
Dockerfileとは?基本概念とメリット

Dockerfileの基本概念
Dockerfileとは、Dockerイメージを自動生成するためのスクリプトファイルです。
テキストファイルに特定の命令を記述することで、コンテナの構築手順を定義できます。
Dockerfileを使うメリット
Dockerfileを活用することで、以下のような利点があります。
- 環境構築の自動化:手動で環境構築する手間がなくなり、コマンド一つで環境を構築できます。
- 再現性の確保 :誰が実行しても、いつ実行しても同じ環境が構築されます。
- チーム開発の効率化 :チームメンバー全員が同じ開発環境で作業できるため、「私の環境では動くのに」といった問題が解消されます。
- 本番環境への適用 :継続的インテグレーション(CI)や本番デプロイでも同じDockerfileを活用できます。
Dockerfile作成の基本構文と主要命令

Dockerfileには特定の命令(ディレクティブ)を順番に記述していきます。主要な命令とその役割を見ていきましょう。
主要命令一覧
命令 | 説明 | 使用例 |
---|---|---|
FROM | ベースとなるDockerイメージを指定 | FROM ubuntu:20.04 |
RUN | イメージ構築時にコマンドを実行 | RUN apt-get update |
COPY | ローカルのファイルをコンテナ内にコピー | COPY . /app |
ADD | COPYの拡張版(URLやアーカイブにも対応) | ADD app.tar.gz /app |
WORKDIR | 作業ディレクトリを設定 | WORKDIR /app |
CMD | コンテナ起動時のデフォルトコマンド | CMD ["python", "app.py"] |
EXPOSE | 外部に公開するポートを指定 | EXPOSE 8080 |
ENV | 環境変数を設定 | ENV NODE_ENV=production |
命令の記述ルール
- Dockerfileの命令は大文字で記述するのが一般的です
- 各命令は新しい行から開始します
- “#”から始まる行はコメントとして扱われます
実践:基本的なDockerfileを作成してみよう
実際にシンプルなPythonアプリケーション用のDockerfileを作成してみましょう。
サンプルコード
# ベースイメージを指定(Python 3.10の軽量版)
FROM python:3.10-slim
# 作業ディレクトリを設定
WORKDIR /app
# 依存関係ファイルを先にコピー(キャッシュ効率化のため)
COPY requirements.txt .
# 依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションファイルをコピー
COPY . .
# ポート8000を公開
EXPOSE 8000
# アプリケーション起動コマンド
CMD ["python", "app.py"]
コードの解説
- FROM python:3.10-slim: Python 3.10の軽量版をベースイメージとして使用
- WORKDIR /app: コンテナ内の作業ディレクトリを
/app
に設定 - COPY requirements.txt .: 依存関係ファイルを先にコピー(Docker のキャッシュ機能を効率的に活用)
- RUN pip install: Pythonの依存関係をインストール
- COPY . .: アプリケーションのソースコードをコピー
- EXPOSE 8000: ポート8000を外部に公開
- CMD: コンテナ起動時にpython app.pyを実行
言語別Dockerfileテンプレート集

Node.jsアプリケーション
# Node.js 18の公式イメージを使用
FROM node:18-alpine
# 作業ディレクトリを設定
WORKDIR /app
# package.jsonとpackage-lock.jsonをコピー
COPY package*.json ./
# 依存関係をインストール
RUN npm ci --only=production
# アプリケーションコードをコピー
COPY . .
# ポート3000を公開
EXPOSE 3000
# アプリケーションを起動
CMD ["node", "index.js"]
PHP + Apache
# PHP 8.1 + Apacheの公式イメージを使用
FROM php:8.1-apache
# 必要な拡張モジュールをインストール
RUN docker-php-ext-install pdo pdo_mysql
# アプリケーションファイルをコピー
COPY . /var/www/html/
# Apacheの設定を調整(必要に応じて)
RUN chown -R www-data:www-data /var/www/html
# ポート80を公開
EXPOSE 80
Ruby on Rails
# Ruby 3.1の公式イメージを使用
FROM ruby:3.1-alpine
# 必要なパッケージをインストール
RUN apk add --no-cache build-base postgresql-dev
# 作業ディレクトリを設定
WORKDIR /app
# GemfileとGemfile.lockをコピー
COPY Gemfile Gemfile.lock ./
# Gemをインストール
RUN bundle install --without development test
# アプリケーションコードをコピー
COPY . .
# ポート3000を公開
EXPOSE 3000
# Railsサーバーを起動
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
DockerfileからDockerイメージをビルドする方法

基本的なビルドコマンド
Dockerfileを作成したら、以下のコマンドでDockerイメージをビルドします。
docker build -t myapp:latest .
オプションの説明
-t myapp:latest
: イメージに「myapp」という名前と「latest」というタグを付ける.
(ピリオド): Dockerfileがあるディレクトリを指定(現在のディレクトリの場合は「.」)
ビルド時の便利なオプション
# 特定のDockerfileを指定してビルド
docker build -f Dockerfile.prod -t myapp:production .
# ビルド時の詳細ログを表示
docker build --progress=plain -t myapp .
# キャッシュを使わずにビルド
docker build --no-cache -t myapp .
ビルドが成功したかの確認
# 作成されたイメージを確認
docker images
# コンテナを起動して動作確認
docker run -p 8000:8000 myapp:latest
Dockerfile作成のTips

イメージサイズの最適化
レイヤー数の削減:
# 悪い例(レイヤーが増える)
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget
# 良い例(1つのレイヤーにまとめる)
RUN apt-get update && \
apt-get install -y curl wget && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
軽量ベースイメージの使用
# 通常版よりもslimやalpineを選択
FROM node:18-alpine # alpineは特に軽量
FROM python:3.10-slim # slimは必要最小限のパッケージのみ
セキュリティの向上
非rootユーザーでの実行:
# 専用ユーザーを作成
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001
# 作成したユーザーに切り替え
USER nextjs
機密情報の管理:
# ❌ 悪い例(機密情報をハードコーディング)
ENV DATABASE_PASSWORD=secret123
# ✅ 良い例(実行時に環境変数で渡す)
ENV DATABASE_PASSWORD=""
開発効率の向上
.dockerignore
ファイルの活用:
node_modules
*.log
.git
.DS_Store
README.md
マルチステージビルド:
# ビルド用ステージ
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 実行用ステージ
FROM node:18-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]
まとめ
Dockerfileは、アプリケーションの環境構築を自動化し、再現性を確保する強力なツールです。
基本的な構文を理解すれば、様々な言語やフレームワークに応用できます。
本記事のポイント
- Dockerfileはコンテナ構築の設計図として機能する
- FROM、RUN、COPY、CMDなどの基本命令を理解することが重要
- 言語やフレームワークに応じたテンプレートを活用する
- ビルドコマンドは
docker build -t <イメージ名> .
コメント