この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:9
ページ更新者:T
更新日時:2026-06-11 07:12:00

タイトル: Docker
SEOタイトル: Docker 完全ガイド (Container / Image / Dockerfile / Compose / WSL2)

この記事の要点
  • Docker はコンテナ仮想化のデファクト。Dockerfile からビルド → Image → Container を実行
  • 主コマンド: docker build / run / exec / ps / stop / rm / logs / images / pull / push
  • 複数コンテナは docker-compose.yml(Compose v2 では docker compose サブコマンド)
  • ボリューム (volume / bind mount) でデータ永続化、ネットワーク (bridge / host / overlay) で通信
  • Windows は Docker Desktop + WSL2、本番は Kubernetes との連携が定番。Podman は OSS 代替

Docker とは

Docker は 2013 年に公開されたコンテナ仮想化のオープンソースツール。OS の機能(Linux Namespace / cgroups)を使ってプロセスを隔離し、VM より遥かに軽量に環境を分離できます。「動く環境ごとパッケージ化する」アプローチで、開発・テスト・本番の差異を吸収します。

Docker のクジラロゴ / アーキテクチャ図

VM とコンテナの違い

項目VM (VMware / VirtualBox / Hyper-V)Container (Docker)
カーネルVM ごとにゲスト OS★ ホスト OS のカーネルを共有
起動時間数十秒〜分★ 数百ms〜数秒
容量数 GB★ 数十 MB 〜
密度1 ホストに数台★ 数十〜数百
隔離レベル★ 強い(別 OS)プロセス分離のみ
主用途異 OS 混在 / 完全分離★ アプリの配布 / マイクロサービス

主要な用語

  • Image (イメージ):コンテナの設計図。レイヤ構造でキャッシュ管理。docker images
  • Container (コンテナ):Image から起動された実行中インスタンス。docker ps
  • Dockerfile:Image をビルドするレシピ(テキストファイル)
  • Registry:Image を保管するサーバ。公式は Docker Hub。AWS ECR / GCR / GHCR / Harbor 等
  • Volume:データ永続化用のストレージ
  • Network:コンテナ間 / ホストとの通信経路
  • Compose:複数コンテナを YAML で一括管理

インストール

Windows / Mac

Docker Desktop を docker.com からダウンロードしてインストール。Windows は WSL2 統合が前提(Hyper-V 仮想化が必要)。

Linux (Ubuntu)

# 旧版を削除
sudo apt-get remove docker docker-engine docker.io containerd runc

# 公式リポジトリ
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /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

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 一般ユーザでも docker コマンドを使えるように
sudo usermod -aG docker $USER
# 再ログインで反映

docker version
docker run hello-world

基本コマンド

# Image 操作
docker pull nginx:latest              # Image 取得
docker images                         # ローカル Image 一覧
docker rmi nginx:latest               # Image 削除
docker image prune -a                 # 未使用 Image 一括削除

# Container 操作
docker run -d --name web -p 80:80 nginx:latest
#   -d  : デタッチ (バックグラウンド)
#   -p  : ポート転送 ホスト:コンテナ
#   --name : 名前
docker ps                             # 起動中コンテナ
docker ps -a                          # 停止含む全て
docker logs web                       # ログ確認
docker logs -f web                    # ログ追従
docker exec -it web bash              # コンテナにシェル接続
docker stop web                       # 停止
docker start web                      # 再開
docker restart web                    # 再起動
docker rm web                         # 削除(停止後)
docker rm -f web                      # 強制削除(起動中でも)
docker container prune                # 停止コンテナ一括削除

# システム全体掃除
docker system prune -a --volumes

Dockerfile の書き方

# Node.js アプリの例
FROM node:20-alpine                   # ベース Image (軽量 Alpine)

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

# 依存だけ先にコピー(キャッシュ活用)
COPY package*.json ./
RUN npm ci --only=production

# アプリ本体
COPY . .

# 環境変数
ENV NODE_ENV=production

# 公開ポート(ドキュメント目的)
EXPOSE 3000

# 起動コマンド
CMD ["node", "server.js"]

ビルドと実行

# ビルド
docker build -t myapp:1.0 .
docker build -t myapp:1.0 --no-cache .  # キャッシュ無視

# タグ付け
docker tag myapp:1.0 myregistry.com/myapp:1.0

# Push (要 docker login)
docker login
docker push myregistry.com/myapp:1.0

# 起動
docker run -d -p 3000:3000 --name app myapp:1.0

Multi-Stage Build(最小化)

# ステージ 1: ビルド
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# ステージ 2: 実行(最終イメージ)
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

ステージ 1 のソースコード / node_modules は最終 Image に含まれず、Image サイズが 10 分の 1 になることも。

Volume とデータ永続化

# Bind mount (ホストのパスを直接マウント)
docker run -v /host/path:/container/path nginx
docker run -v $(pwd):/app -w /app node:20 npm install

# Named volume (Docker 管理)
docker volume create mydata
docker volume ls
docker run -v mydata:/var/lib/mysql mysql:8

# 読み取り専用マウント
docker run -v $(pwd):/app:ro node:20

# tmpfs (メモリ上)
docker run --tmpfs /tmp nginx

Network

# ネットワーク一覧
docker network ls

# bridge (デフォルト) / host / overlay (Swarm) / macvlan

# カスタムネットワーク作成
docker network create mynet
docker run -d --name db --network mynet mysql:8
docker run -d --name web --network mynet -p 80:80 nginx
# → web から db にホスト名 "db" で接続できる

# 既存コンテナにネットワーク追加
docker network connect mynet some-container

docker-compose.yml

# docker-compose.yml (Compose v2 / 最新の書き方)
services:
  app:
    build: .
    image: myapp:latest
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=mysql://root:secret@db:3306/app
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: app
    volumes:
      - dbdata:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  dbdata:

Compose コマンド

# 起動 / 停止
docker compose up -d         # バックグラウンド起動
docker compose down          # 停止 + コンテナ削除
docker compose down -v       # ボリュームも削除

# ログ
docker compose logs -f app

# 再ビルド
docker compose build
docker compose up -d --build

# サービス確認
docker compose ps

# シェル接続
docker compose exec app bash

# スケール
docker compose up -d --scale app=3

Image 最小化のコツ

  • Alpine ベースイメージを使う(node:20 1GB → node:20-alpine 150MB)
  • Multi-Stage Build で開発依存を本番に含めない
  • .dockerignorenode_modules / .git / tests を除外
  • RUN を1 行にまとめる(レイヤ数削減):RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
  • パッケージマネージャのキャッシュを削除する
  • Distroless / Scratch イメージ(Google の Distroless は libc 含まず最小)

セキュリティ

  • root で動かさないUSER appuser を Dockerfile に
  • イメージスキャン:docker scout cves myapp:1.0 / Trivy / Grype
  • シークレット情報を Image に焼き込まない(環境変数 / Vault / Secrets で渡す)
  • 公式または信頼できる Image を使う、Docker Hub の Verified Publisher / Official Image マークを確認
  • Read-Only ファイルシステム:docker run --read-only
  • Capability 制限:--cap-drop ALL --cap-add NET_BIND_SERVICE

Kubernetes との関係

Docker はコンテナのビルドと単一ホスト実行に強い。Kubernetes (K8s) は複数ホスト上でコンテナを管理(オーケストレーション)するシステム。本番運用では K8s + Docker(または containerd)が定番です。

  • K8s 1.24+ では dockershim 廃止 → containerd / CRI-O が標準ランタイム
  • Docker でビルドした OCI Image は K8s でもそのまま使える
  • ローカル開発は Docker Desktop / Compose、本番は K8s(EKS / GKE / AKS)が一般的

Podman など代替

ツール特徴
PodmanRed Hat 製。デーモン不要、rootless 標準。Docker コマンド互換
containerdDocker の中身でも使われている低レベルランタイム。K8s 公式ランタイム
BuildKitDocker のビルダー強化版。DOCKER_BUILDKIT=1 で有効
Lima / ColimaMac で Docker Desktop の代替(軽量・無料)
Rancher DesktopMac/Windows の OSS Desktop。containerd または dockerd

FAQ

Q: Docker Desktop は無料?
A: 個人 / 小規模企業(従業員 250 人未満 & 売上 1000 万ドル未満)は無料。それ以上は有料サブスクが必要。Podman / Colima / Rancher Desktop が代替です。

Q: コンテナ内のファイルを編集したい
A: 開発時は -v $(pwd):/app で bind mount。本番では docker cp で取り出し、ビルドし直すのが原則。

Q: コンテナの中で systemd / cron は動く?
A: 動かせるが推奨されません。Docker は1 コンテナ 1 プロセスが思想。cron は別コンテナとして分離するか、ホストの cron から docker exec を使うのが一般的。