「自分の環境では動くのに…」というフレーズは、開発者にとって古くからの悩みです。Dockerは、この「環境差異」の問題を根本的に解決するコンテナ技術です。本記事では、Dockerの概念から実践的な使い方まで、30分で理解できるように解説します。
💡 この記事のポイント
Dockerは「軽量な仮想環境」です。アプリケーションとその実行環境をまるごとパッケージ化し、どこでも同じ動作を保証します。
1. Dockerとは?
Dockerはコンテナ型仮想化技術のプラットフォームです。従来の仮想マシン(VM)と比較して、軽量かつ高速に起動できます。
VMとコンテナの違い
- 仮想マシン:OS全体を仮想化 → 重い(GBレベル)、起動に分単位
- コンテナ:アプリ + 依存関係のみ → 軽い(MBレベル)、起動は秒単位
Dockerの主要概念
- イメージ:コンテナの設計図(テンプレート)
- コンテナ:イメージから作られた実行環境
- Dockerfile:イメージを構築するための設定ファイル
- Docker Hub:イメージを共有するレジストリ
2. インストールと初期設定
# macOS(Homebrew)
brew install --cask docker
# Windows(winget)
winget install Docker.DockerDesktop
# Linux(Ubuntu)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# インストール確認
docker --version
# Docker version 26.x.x
docker run hello-world
3. 基本コマンド
# イメージの取得
docker pull node:20-slim
# コンテナの起動
docker run -d --name my-app -p 3000:3000 node:20-slim
# 実行中のコンテナ一覧
docker ps
# すべてのコンテナ一覧(停止含む)
docker ps -a
# コンテナのログ確認
docker logs my-app
# コンテナ内でコマンド実行
docker exec -it my-app bash
# コンテナの停止・削除
docker stop my-app
docker rm my-app
# 不要なリソースを一括削除
docker system prune -a
広告
4. Dockerfileの書き方
Node.jsアプリケーションの実践的なDockerfileを見てみましょう。
# ベースイメージの指定
FROM node:20-slim AS builder
# 作業ディレクトリ
WORKDIR /app
# 依存関係のインストール(キャッシュ活用)
COPY package*.json ./
RUN npm ci
# アプリケーションコードのコピー
COPY . .
# ビルド
RUN npm run build
# 本番用ステージ(マルチステージビルド)
FROM node:20-slim AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
# 非rootユーザーで実行
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]
✅ 実践のヒント
マルチステージビルドを使用すると、ビルドツール(TypeScriptコンパイラ等)が本番イメージに含まれず、最終的なイメージサイズを大幅に削減できます。
5. docker-composeで複数コンテナ管理
実際の開発では、アプリ + DB + Redis のように複数のサービスを同時に動かします。docker-composeを使えば、ワンコマンドで全サービスを起動できます。
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- '3000:3000'
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
volumes:
- .:/app # ホットリロード用
- /app/node_modules
db:
image: postgres:16
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- '5432:5432'
cache:
image: redis:7-alpine
ports:
- '6379:6379'
volumes:
pgdata:
# 全サービスの起動
docker compose up -d
# ログの確認
docker compose logs -f app
# 全サービスの停止
docker compose down
# データも含めて完全削除
docker compose down -v
6. ベストプラクティス
- 軽量ベースイメージ:
-slimや-alpineを使う - .dockerignoreを設定:
node_modules、.git等を除外 - レイヤーキャッシュを活用:変更頻度の低いものを先にCOPY
- 非rootユーザーで実行:セキュリティ向上
- ヘルスチェックを設定:コンテナの健全性監視
- マルチステージビルド:本番イメージの最小化
Dockerは現代のソフトウェア開発に欠かせないツールです。まずはシンプルなプロジェクトからDockerを使い始めて、徐々にdocker-composeやCI/CDとの連携に進んでいきましょう。