【2026年版】Docker完全入門|コンテナ技術の基礎からdocker-composeによる本番環境構築まで

Dockerはモダンなソフトウェア開発に欠かせないコンテナ技術です。「自分のPCでは動くのに本番環境で動かない」という問題を根本から解決し、開発・ステージング・本番環境を完全に統一できます。本記事では、Dockerの基礎概念から実際のdocker-compose.ymlの書き方、本番運用のベストプラクティスまで解説します。

Dockerとは何か:コンテナ技術の基礎

Dockerはコンテナと呼ばれる軽量な仮想環境を作成・管理するためのプラットフォームです。従来の仮想マシン(VM)と比較して、OSを共有するため起動が速く、リソース消費も少ないのが特徴です。

Dockerの主要コンセプト:

  • イメージ:コンテナの設計図。アプリケーションの実行に必要なすべてが含まれる
  • コンテナ:イメージから作成された実行中のインスタンス
  • Dockerfile:イメージを作成するための設定ファイル
  • Docker Hub:公式イメージを公開・共有するレジストリ
  • docker-compose:複数コンテナをまとめて管理するツール

Dockerインストールと基本コマンド

まずDocker Desktopをインストールしましょう。macOS・Windows・Linuxすべてに対応しています。

# バージョン確認
docker --version
docker compose version

# イメージの取得
docker pull nginx:latest

# コンテナの起動
docker run -d -p 8080:80 --name my-nginx nginx:latest

# 起動中のコンテナ確認
docker ps

# コンテナのログ確認
docker logs my-nginx

# コンテナに入る(シェル実行)
docker exec -it my-nginx /bin/bash

# コンテナの停止・削除
docker stop my-nginx
docker rm my-nginx

Dockerfileの書き方:Node.jsアプリの例

# Node.jsアプリのDockerfile例
FROM node:20-alpine

# 作業ディレクトリの設定
WORKDIR /app

# package.jsonのコピーと依存関係インストール
# (ソースコードより先にコピーしてキャッシュを活用)
COPY package*.json ./
RUN npm ci --only=production

# ソースコードのコピー
COPY . .

# ビルド
RUN npm run build

# 非rootユーザーで実行(セキュリティ対策)
USER node

# ポートの公開
EXPOSE 3000

# アプリの起動
CMD ["node", "dist/index.js"]

docker-composeで複数サービスを管理する

実際のWebアプリケーションは、フロントエンド・バックエンド・データベース・Redisなど複数のサービスで構成されます。docker-composeを使えばこれらを一括管理できます。

# docker-compose.yml(Webアプリの典型的な構成)
version: '3.9'

services:
  # Next.jsフロントエンド
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      - NEXT_PUBLIC_API_URL=http://backend:4000
    depends_on:
      - backend
    volumes:
      - ./frontend:/app
      - /app/node_modules

  # Node.js/Expressバックエンド
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "4000:4000"
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
      - REDIS_URL=redis://redis:6379
      - NODE_ENV=development
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

  # PostgreSQLデータベース
  db:
    image: postgres:16-alpine
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=myapp
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
      interval: 5s
      timeout: 5s
      retries: 5

  # Redisキャッシュ
  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

本番環境のベストプラクティス

本番環境でDockerを使う際は、セキュリティと効率性を意識した設計が重要です。

  • マルチステージビルド:ビルド環境と実行環境を分離してイメージサイズを削減
  • 非rootユーザー実行:セキュリティリスクを低減
  • .dockerignore:不要なファイルをイメージに含めない
  • ヘルスチェック:サービスの正常稼働を監視
  • シークレット管理:環境変数やDocker Secretsで機密情報を管理
  • イメージタグの固定:latestではなく特定バージョンを指定

まとめ

Dockerをマスターすることで、環境の再現性が保証され、チーム開発や本番デプロイが劇的に楽になります。まずはdocker-compose upでローカル開発環境を構築することから始めて、徐々にKubernetesなどのオーケストレーションツールへとステップアップしていきましょう。

投稿者 kasata

IT企業でエンジニアとして勤務後、テクノロジー情報メディア「Tech Athletes(テック・アスリート)」を運営。プログラミング、クラウドインフラ(AWS/GCP/Azure)、AI活用、Webサービス開発を専門とする。エンジニア・ビジネスパーソン向けに、実際に使ってみた経験をもとに信頼できる技術情報を発信中。資格:AWS認定ソリューションアーキテクト、Python 3 エンジニア認定試験合格。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です