Dockerはコンテナ型仮想化技術の代表格で、現代のWeb開発・インフラ構築において必須のスキルです。本記事では、Docker初心者から中級者向けに、基本概念から実践的な使い方まで体系的に解説します。
Dockerとは?コンテナ仮想化の基本概念
Dockerは、アプリケーションとその実行環境(ライブラリ、設定ファイルなど)を「コンテナ」と呼ばれる軽量な仮想環境にまとめるツールです。従来の仮想マシン(VM)とは異なり、ホストOSのカーネルを共有するため、起動が高速で軽量です。
仮想マシン vs Dockerの比較
| 比較項目 | 仮想マシン(VM) | Docker |
|---|---|---|
| 起動時間 | 数分 | 数秒 |
| ディスク使用量 | 数GB〜数十GB | 数MB〜数百MB |
| OSオーバーヘッド | 大(各VMに独立OS) | 小(ホストOSカーネル共有) |
| ポータビリティ | 低い | 高い |
| 本番環境での採用 | 従来型システム | マイクロサービス、クラウド |
Dockerのインストール方法
macOS へのインストール
# Homebrew でインストール
brew install --cask docker
# または Docker Desktop の公式サイトからダウンロード
# https://www.docker.com/products/docker-desktop/
# インストール確認
docker --version
docker-compose --version
Ubuntu/Debianへのインストール
# 必要パッケージをインストール
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# Docker の GPG キーを追加
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# リポジトリを追加
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker エンジンをインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 権限設定(sudo なしで使えるように)
sudo usermod -aG docker $USER
基本コマンド集【よく使うDockerコマンド】
# イメージの操作
docker pull nginx # イメージをダウンロード
docker images # ローカルイメージ一覧
docker rmi nginx # イメージを削除
docker image prune # 未使用イメージを一括削除
# コンテナの操作
docker run -d -p 8080:80 nginx # コンテナをバックグラウンドで起動
docker ps # 実行中コンテナ一覧
docker ps -a # 全コンテナ一覧(停止済み含む)
docker stop [container_id] # コンテナを停止
docker rm [container_id] # コンテナを削除
docker logs [container_id] # コンテナのログ表示
docker exec -it [id] /bin/bash # コンテナ内でシェル起動
Dockerfileの書き方【実践的なサンプル】
Node.js アプリのDockerfile
# ベースイメージを指定(軽量なalpineを使用)
FROM node:20-alpine
# 作業ディレクトリを設定
WORKDIR /app
# package.json と package-lock.json をコピー(キャッシュ効率のため先にコピー)
COPY package*.json ./
# 依存関係をインストール(本番用のみ)
RUN npm ci --only=production
# アプリケーションコードをコピー
COPY . .
# ポートを公開
EXPOSE 3000
# 非rootユーザーで実行(セキュリティベストプラクティス)
USER node
# アプリケーションを起動
CMD ["node", "src/index.js"]
Docker Composeで複数コンテナを管理
実際の開発では、Webサーバー、データベース、キャッシュなど複数のサービスを連携させます。Docker Composeを使うと、これらを一元管理できます。
# docker-compose.yml の例(Node.js + PostgreSQL + Redis)
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
cache:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
# Docker Compose の操作コマンド
docker compose up -d # 全サービスをバックグラウンドで起動
docker compose down # 全サービスを停止・削除
docker compose logs -f # ログをリアルタイムで表示
docker compose ps # サービスの状態確認
docker compose exec app bash # appコンテナ内でbashを起動
Dockerのベストプラクティス
- 軽量なベースイメージを使う:alpineやslim版を選択してイメージサイズを削減
- マルチステージビルド:ビルド環境と実行環境を分離してイメージを小さく
- .dockerignoreを使う:不要なファイルをイメージに含めない
- 非rootユーザーで実行:セキュリティリスクを軽減
- レイヤーキャッシュを活用:変更頻度の低いファイルを先にCOPY
- 環境変数で設定を外部化:設定をコードから分離
まとめ
Dockerはモダンな開発・運用に不可欠なツールです。ローカル開発環境の統一、CI/CDパイプラインの構築、本番環境へのデプロイまで、幅広い場面で活躍します。まずは本記事で紹介した基本コマンドから習得し、徐々にDocker Composeや本番向けの設定を学んでいきましょう。