【初心者向け】Dockerfileの作り方完全ガイド|基本構文から実用例まで

Docker

「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
ADDCOPYの拡張版(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"]

コードの解説

  1. FROM python:3.10-slim: Python 3.10の軽量版をベースイメージとして使用
  2. WORKDIR /app: コンテナ内の作業ディレクトリを/appに設定
  3. COPY requirements.txt .: 依存関係ファイルを先にコピー(Docker のキャッシュ機能を効率的に活用)
  4. RUN pip install: Pythonの依存関係をインストール
  5. COPY . .: アプリケーションのソースコードをコピー
  6. EXPOSE 8000: ポート8000を外部に公開
  7. 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

.dockerignore は、Dockerがビルドコンテキスト(docker build で送られるファイル群)から無視するファイルやディレクトリを指定するファイルです。

.gitignoreと似ていて、同じような記法で書けます。

マルチステージビルド

# ビルド用ステージ
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 <イメージ名> .

コメント

タイトルとURLをコピーしました