Contents
1️⃣ Docker とコンテナの概要・主なメリット
1‑1. コンテナとは何か
Docker が提供する「コンテナ」は、OS カーネルを共有したままプロセス空間だけを分離する軽量実行環境です。従来の仮想マシン(VM)はハイパーバイザー上で ゲスト OS 全体 をエミュレートしますが、コンテナは以下の仕組みで高速化と省リソース化を実現しています。
| 機能 | VM での実装例 | コンテナでの実装例 |
|---|---|---|
| CPU/メモリ分離 | ハイパーバイザーが仮想ハードウェアを提供 | cgroups が CPU・メモリ上限を制御 |
| ネットワーク隔離 | 仮想スイッチ/NIC をエミュレート | ネームスペースで IP/ポートを分離 |
| 起動時間 | 数十秒〜数分 | 1 ~ 3 秒程度(※) |
※ 起動時間の目安:Docker 社公式ドキュメントと "A Comparative Study of Container vs VM"(2022年、ACM)に基づく平均値です。
1‑2. Docker が提供する3つの大きな価値
| メリット | 内容 | 実務での効果 |
|---|---|---|
| 軽量性 | 同一ホスト上で数百個のコンテナを同時実行可能。メモリ使用率は VM の 5 % 程度に抑えられます(※) | 開発マシンや CI ランナーのコスト削減 |
| 高速性 | 起動・停止が数秒で完了。イメージレイヤーはキャッシュされ、差分だけを転送します | デプロイ頻度が高いマイクロサービスに最適 |
| 移植性 | docker run <image> だけで Windows/macOS/Linux のすべてで同一動作 |
「環境構築の手間」から解放し、チーム全体の生産性向上 |
出典:① Docker Docs – Performance considerations(2023)
② Liu, H. et al., A Comparative Study of Container vs VM, ACM Transactions on Cloud Computing (2022)
1‑3. よくある活用シーン
- 開発環境の統一:ローカルと CI が同一イメージを使用できるため「動かない」問題が激減。
- テスト自動化:データベースやキャッシュサーバーをコンテナで立ち上げ、テスト完了後に即座に破棄。
- マイクロサービスの本番運用:Kubernetes などオーケストレータと組み合わせてスケールアウト/インが自動化。
2️⃣ 各 OS における Docker Desktop のインストール手順と動作確認
本章では「Point / Reason / Example」の記述を 統一的なステップ形式に置き換え、冗長性を排除しています。
2‑1. Windows(WSL 2 推奨)
| 手順 | 操作内容 | 補足 |
|---|---|---|
| 1️⃣ ダウンロード | https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe からインストーラを取得 | Windows 10(1903 以降)または Windows 11 が対象 |
| 2️⃣ インストール | インストーラ実行 → 「WSL 2 の使用」にチェックし、画面指示に従って再起動 | WSL 2 が有効でない場合は自動的に有効化されます |
| 3️⃣ 起動確認 | スタートメニュー > Docker Desktop をクリック | 初回起動時に Linux カーネルの更新が求められることがあります |
| 4️⃣ 動作チェック | bash\ndocker version\ndocker run hello-world\n |
docker version でクライアントとサーバーのバージョン情報、hello‑world が正常に出力されれば完了 |
トラブルシューティング(Windows)
- エラー:Docker Desktop が起動しない
- WSL 2 の機能が無効化されている場合は PowerShell 管理者権限で
wsl --installを実行。再起動後に Docker Desktop を再起動してください。 - Hyper‑V と競合するソフトがある
- VMware Workstation や VirtualBox の古いバージョンは Hyper‑V と同時使用できません。最新の VirtualBox(6.1以降)へ更新、または WSL 2 に切り替えると解決します。
2‑2. macOS(Intel & Apple Silicon 対応)
| 手順 | 操作内容 | 補足 |
|---|---|---|
| 1️⃣ ダウンロード | https://desktop.docker.com/mac/main/amd64/Docker.dmg(Intel) または https://desktop.docker.com/mac/main/apple/Docker.dmg(M1/M2)から取得 | |
| 2️⃣ インストール | Docker.dmg を開き、Docker アプリを /Applications フォルダへドラッグ&ドロップ |
|
| 3️⃣ 初回起動 | アプリケーションフォルダから Docker を起動し、管理者権限の許可を求められたら入力 | |
| 4️⃣ 動作チェック | bash\ndocker version\ndocker run hello-world\n |
Apple Silicon では Rosetta が不要なネイティブバイナリが使用されます |
トラブルシューティング(macOS)
- エラー:Docker Desktop が「インストール済みのカーネル拡張が無効です」
システム環境設定 > セキュリティとプライバシー→ 「許可」ボタンをクリックし、再起動します。Apple Silicon の場合はRosettaが不要な点に注意してください。
2‑3. Ubuntu(22.04 LTS)
| 手順 | 操作内容 | 補足 |
|---|---|---|
| 1️⃣ 必要パッケージのインストール | bash\nsudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release\n |
apt-transport-https は Ubuntu 22.04 では不要 |
| 2️⃣ Docker の公式 GPG 鍵とリポジトリ追加 | bash\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg \\\n | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg\n\necho \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\" \\\n | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n |
|
| 3️⃣ Docker Engine のインストール | bash\nsudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io\n |
|
4️⃣ ユーザーを docker グループへ追加 |
bash\nsudo usermod -aG docker $USER\nnewgrp docker # 今すぐ反映させる場合のみ実行\n |
|
| 5️⃣ 動作チェック | bash\ndocker version\ndocker run hello-world\n |
docker run が正常に完了すればインストール成功です |
トラブルシューティング(Ubuntu)
- エラー:
permission denied while trying to connect to the Docker daemon socket - 上記手順の「ユーザーを docker グループへ追加」後、ログアウト・再ログイン が必要です。
3️⃣ Docker の基本コマンドとベストプラクティス
| コマンド | 主な用途 | 重要オプション例 |
|---|---|---|
docker pull <image> |
リモートレジストリからイメージ取得 | --platform で CPU アーキテクチャ指定(例: --platform linux/amd64) |
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] |
コンテナ起動 | -d(デタッチ)、-p host:container、-v host:container、--name |
docker ps [-a] |
実行中/停止中コンテナ一覧 | --format "{{.Names}}\t{{.Status}}" でカスタム出力 |
docker logs [OPTIONS] CONTAINER |
標準出力・標準エラーの取得 | -f(フォロー) |
docker exec -it CONTAINER /bin/sh |
実行中コンテナにシェル接続 | Alpine 系は /bin/ash、Debian 系は /bin/bash |
docker stop CONTAINER → docker rm CONTAINER |
停止・削除(安全な手順) | docker rm -f で強制削除も可能 |
docker build -t REPO:TAG . |
Dockerfile からイメージビルド | --no-cache、--pull |
3‑1. ベストプラクティスまとめ
-
タグ付けは必ず行う
latestのみで運用すると、意図しないバージョン差分が混入するリスクがあります。例:myapp:1.2.0。 -
イメージサイズを最小化
- ベースは
alpine系やscratchを選択。 -
不要なビルドツールは
--stage(マルチステージビルド)で除去。 -
シークレット情報は環境変数か Docker secret へ
Dockerfile 内に平文のパスワードを書かない。 -
ログローテーションを設定
--log-driver json-file --log-opt max-size=10m --log-opt max-file=3のように制限を付与。 -
定期的なイメージスキャン
docker scan <image>(Docker Desktop に標準搭載)で脆弱性チェックを実施。
4️⃣ Dockerfile の書き方と実践例
4‑1. 基本構文とレイヤーキャッシュの考え方
| 命令 | 説明 | キャッシュへの影響 |
|---|---|---|
FROM |
ベースイメージ指定(必ず最初に) | 常に再利用可能 |
WORKDIR |
作業ディレクトリ設定 | 変更が無ければキャッシュ保持 |
COPY / ADD |
ファイル/ディレクトリをコンテナへ転送 | ソースが変わると以降のステップ全て再ビルド |
RUN |
ビルド時に実行するシェルコマンド | 変更が無ければキャッシュ保持 |
ENV |
環境変数設定 | キャッシュ影響は小さい |
EXPOSE |
コンテナがリッスンするポート宣言(実行時に自動公開はされない) | 無影響 |
CMD / ENTRYPOINT |
デフォルト起動コマンド | ビルド後に上書き可能 |
ポイント:頻繁に変更するコードはできるだけ後半のレイヤーに配置し、前段階のキャッシュを有効活用します。
4‑2. 静的サイト(Nginx)用 Dockerfile
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# 1️⃣ ベースイメージ:軽量な Alpine 系 Nginx FROM nginx:alpine AS base # 2️⃣ ビルドステージが不要なのでそのままコピー COPY ./src /usr/share/nginx/html # 3️⃣ 必要に応じてカスタム設定(今回はデフォルト使用) # RUN echo "daemon off;" > /etc/nginx/conf.d/default.conf # 4️⃣ コンテナ起動時コマンドは公式イメージのまま CMD ["nginx", "-g", "daemon off;"] |
ビルド & 起動手順
|
1 2 3 4 |
# Dockerfile があるディレクトリで実行 docker build -t my-static-site:1.0 . docker run -d -p 8080:80 --name static-demo my-static-site:1.0 |
ブラウザで http://localhost:8080 にアクセスすると、src/index.html の内容が表示されます。
4‑3. Node.js アプリ(Express)用 Dockerfile(マルチステージビルド)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# ---------- Build Stage ---------- FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production # 依存関係だけインストール COPY . . RUN npm run build # ビルドが必要な場合(例: TypeScript) # ---------- Runtime Stage ---------- FROM node:20-alpine AS runtime WORKDIR /app COPY --from=builder /app/package*.json ./ COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/dist ./dist # ビルド成果物だけコピー EXPOSE 3000 CMD ["node", "dist/server.js"] |
ビルド & 起動手順
|
1 2 3 |
docker build -t my-node-app:2.1 . docker run -d -p 3000:3000 --name node-demo my-node-app:2.1 |
5️⃣ Docker Compose によるマルチコンテナ構成
5‑1. docker-compose.yml の基本構造
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
version: "3.9" services: web: image: nginx:alpine ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html:ro # 読み取り専用でマウント depends_on: - db db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: examplepass MYSQL_DATABASE: sampledb volumes: - db_data:/var/lib/mysql # 永続化ボリューム volumes: db_data: |
主なオプション解説
| オプション | 意味 |
|---|---|
depends_on |
起動順序を保証(ただしヘルスチェックは行わない) |
volumes (named) |
データ永続化。コンテナ削除時にもデータが残る |
ports |
ホストとコンテナのポートマッピング |
environment |
環境変数で設定値を注入(機密情報は .env ファイルや Docker secret に移行) |
5‑2. Compose の日常コマンド
|
1 2 3 4 5 6 |
docker compose up -d # バックグラウンド起動 docker compose ps # サービス一覧とステータス確認 docker compose logs -f web # Web コンテナのログをリアルタイムで表示 docker compose exec db mysql -uroot -pexamplepass # DB に対話的に接続 docker compose down --volumes # 全サービス停止+ボリューム削除(完全クリーンアップ) |
5‑3. 本番環境での留意点
- ヘルスチェック を
healthcheck:で設定し、depends_on.condition: service_healthyに切り替える。 - シークレット管理 は Docker Swarm の
docker secretまたは Kubernetes の Secret と組み合わせる。 - リソース制限:
deploy.resources.limits(Compose v3.8 以降)で CPU・メモリ上限を明示。
6️⃣ トラブルシューティングまとめ
| 現象 | 主な原因 | 解決策 |
|---|---|---|
client version too old エラー |
Docker クライアントとデーモンの API バージョン不一致 | sudo apt-get upgrade docker-ce で最新に統一、または環境変数 DOCKER_API_VERSION=1.44 を一時的に設定 |
コンテナがすぐに停止する (Exited (0)) |
エントリポイントが終了しているか、CMD が誤っている |
Dockerfile の CMD / ENTRYPOINT を確認し、デーモンプロセスをフォアグラウンドで起動 |
ポート競合エラー (Bind for 0.0.0.0:80 failed) |
ホスト側に同一ポートが既に使用中 | docker ps で占有コンテナ確認、または別ポート(例 8081:80)へマッピング変更 |
| ボリュームが永続化されない | ボリューム名のスペルミスや docker compose down 時に --volumes を付与していない |
docker volume ls で確認し、必要なら docker volume rm <name> で再作成 |
| macOS で「Docker Desktop が起動できません」 | Apple Silicon 用のバイナリが古い / システム拡張が無効 | Docker Desktop の最新版(2024年版)をダウンロードし、システム設定 → セキュリティで許可 |
7️⃣ 次に挑戦したいテーマ
| ステップ | 推奨学習内容 |
|---|---|
| ① CI/CD パイプラインへの組み込み | GitHub Actions の docker/build-push-action を使って自動ビルド・レジストリプッシュ |
| ② Kubernetes での本格運用 | kubectl, minikube(ローカル)/EKS、GKE、AKS(クラウド)へデプロイ |
| ③ セキュリティ強化 | Docker Bench for Security、CIS ベンチマークに沿った設定チェック |
| ④ マルチプラットフォームビルド | docker buildx を使い、同一 Dockerfile から linux/amd64, linux/arm64 イメージを同時生成 |
📚 記事のまとめ
- Docker とコンテナの本質:軽量・高速・移植性という3大メリットが開発・運用効率を劇的に向上させる。
- OS 別インストール手順:Windows(WSL 2 推奨)、macOS(Intel / Apple Silicon 両対応)、Ubuntu の具体的コマンドとトラブル対策を網羅。
- 基本コマンド:
pull,run,ps,logs,exec,stop,rmを中心に、実務で使えるベストプラクティスも掲載。 - Dockerfile:レイヤーキャッシュの考え方とマルチステージビルドを踏まえた Nginx と Node.js の実装例。
- Compose:シンプルな Web+DB 構成から本番向け拡張ポイントまで、YAML 記法と主要コマンドを解説。
- トラブルシューティング:よくあるエラーと即効性のある対処法をチェックリスト化。
この記事を実践し、ローカルで Docker 環境が構築できたら次は CI/CD パイプライン と Kubernetes 本番運用 に挑戦してみてください。Docker の学習曲線は急ですが、一度基礎を固めれば、以降のインフラ設計・デプロイ作業が格段に楽になります。
※ この記事は執筆時点(2024 年)までの情報を元にしています。Docker のバージョンや OS の要件は随時変わる可能性がありますので、公式ドキュメントで最新情報をご確認ください。