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

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:201GB →node:20-alpine150MB) - Multi-Stage Build で開発依存を本番に含めない
- .dockerignore で
node_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 など代替
| ツール | 特徴 |
|---|---|
| Podman | Red Hat 製。デーモン不要、rootless 標準。Docker コマンド互換 |
| containerd | Docker の中身でも使われている低レベルランタイム。K8s 公式ランタイム |
| BuildKit | Docker のビルダー強化版。DOCKER_BUILDKIT=1 で有効 |
| Lima / Colima | Mac で Docker Desktop の代替(軽量・無料) |
| Rancher Desktop | Mac/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 を使うのが一般的。