Docker 完全入門ガイド|初心者向けに図解で解説【2026年版】
Docker の基礎から実践まで完全解説。コンテナの仕組み、Dockerfile、docker-compose、Volume、ネットワークなど初心者が最短で実務投入できる内容を網羅。
Docker は、アプリケーションをコンテナという軽量な仮想環境で実行するプラットフォームです。2026年現在、Web 開発において Docker を使わない現場は少数派で、開発環境・本番環境の両方で標準ツールとなっています。この記事では、初心者が最短で実務に使えるレベルまで到達できる内容を解説します。
Docker とは
Docker は、アプリケーションとその実行に必要な全環境(OS、ライブラリ、設定ファイル等)を 「コンテナ」というパッケージにまとめ、どの環境でも同じように動かせるようにするツールです。
解決する問題:
- 「自分のマシンでは動いたのに本番で動かない」問題
- 開発環境のセットアップに時間がかかる
- チームメンバー間の環境差異
- 複数バージョンの言語・ライブラリの共存
コンテナと仮想マシンの違い
仮想マシン(VM):
┌─────────────────────────┐
│ App │
│ Libs │
│ Guest OS │
│ Hypervisor │
│ Host OS │
└─────────────────────────┘
コンテナ(Docker):
┌─────────────────────────┐
│ App │
│ Libs │
│ Docker Engine │
│ Host OS │
└─────────────────────────┘
VM はゲスト OS をフル搭載するため数 GB の容量と分単位の起動時間を必要とします。Docker コンテナはホスト OS のカーネルを共有するため、数十MBの容量と秒単位の起動で済みます。
インストール
macOS / Windows
Docker Desktop をダウンロードしてインストールします。
Linux
# Ubuntu/Debian の例
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# sudo なしで実行できるようにする
sudo usermod -aG docker $USER
newgrp docker
インストール確認
docker --version
docker compose version
基本コマンド
イメージの取得と実行
# イメージを取得
docker pull nginx
# コンテナを起動
docker run -d -p 8080:80 --name my-nginx nginx
# ブラウザで http://localhost:8080 にアクセス
よく使うオプション:
| オプション | 説明 |
|---|---|
-d | バックグラウンド実行 |
-p host:container | ポートマッピング |
--name | コンテナ名 |
-e KEY=VALUE | 環境変数 |
-v host:container | ボリュームマウント |
--rm | 停止時に自動削除 |
-it | 対話モード |
コンテナの管理
# 実行中のコンテナ一覧
docker ps
# 停止中も含めた全コンテナ
docker ps -a
# コンテナの停止
docker stop my-nginx
# コンテナの再起動
docker restart my-nginx
# コンテナの削除
docker rm my-nginx
# 実行中のコンテナに入る
docker exec -it my-nginx bash
# ログを表示
docker logs my-nginx
docker logs -f my-nginx # フォロー
イメージの管理
# イメージ一覧
docker images
# イメージの削除
docker rmi nginx
# 不要なリソースの一括削除
docker system prune -a
Dockerfile の書き方
カスタムイメージを作るには Dockerfile を書きます。
Node.js アプリの例
# Dockerfile
FROM node:20-alpine
# 作業ディレクトリ
WORKDIR /app
# 依存関係を先にコピー(キャッシュ効率化)
COPY package.json package-lock.json ./
RUN npm ci --only=production
# アプリコードをコピー
COPY . .
# ポート公開
EXPOSE 3000
# 起動コマンド
CMD ["node", "server.js"]
ビルドと実行
# イメージをビルド
docker build -t my-app .
# 実行
docker run -p 3000:3000 my-app
Dockerfile のベストプラクティス
1. レイヤーキャッシュを活用
Docker はレイヤー単位でキャッシュするため、変更頻度の低いものを先にコピーします。
# Good: 依存関係を先にコピー
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
# Bad: 全てを先にコピー
COPY . .
RUN npm ci
前者ならコード変更時に npm ci の再実行が不要です。
2. Alpine イメージを使う
# Good: 軽量(約50MB)
FROM node:20-alpine
# Bad: 重い(約900MB)
FROM node:20
3. マルチステージビルド
ビルド用と実行用のイメージを分けて、本番イメージを軽量化します。
# ビルドステージ
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 実行ステージ
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm ci --only=production
CMD ["node", "dist/server.js"]
4. .dockerignore
# .dockerignore
node_modules
.git
.env
dist
*.log
.DS_Store
不要なファイルをイメージに含めないことで、ビルド時間と容量を削減できます。
5. 非 root ユーザーで実行
FROM node:20-alpine
WORKDIR /app
COPY --chown=node:node . .
RUN npm ci
USER node
CMD ["node", "server.js"]
セキュリティ上、コンテナ内でも root を避けるのが原則です。
docker compose
複数のコンテナをまとめて管理するには docker compose を使います。
例: Node.js + PostgreSQL + Redis
# docker-compose.yml
version: '3.9'
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://user:pass@db:5432/mydb
REDIS_URL: redis://cache:6379
depends_on:
- db
- cache
volumes:
- ./src:/app/src
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
cache:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
db-data:
起動と停止
# バックグラウンドで起動
docker compose up -d
# ログを表示
docker compose logs -f
# 停止
docker compose down
# 停止 + ボリューム削除
docker compose down -v
# 特定サービスのみ再起動
docker compose restart app
ボリューム(Volume)
コンテナが削除されてもデータを保持するには Volume を使います。
名前付きボリューム
# 作成(compose がなくても手動で可能)
docker volume create my-data
# マウント
docker run -v my-data:/var/lib/mysql mysql
バインドマウント(ホストのディレクトリを共有)
# ホストの ./src をコンテナの /app にマウント
docker run -v $(pwd)/src:/app my-app
開発時にコード変更を即座に反映したい場合に便利です。
ネットワーク
複数のコンテナ間で通信する場合、同じネットワーク上に配置します。
# ネットワーク作成
docker network create my-net
# コンテナをネットワークに参加させる
docker run -d --name db --network my-net postgres
docker run -d --name app --network my-net my-app
コンテナ内から db というホスト名で PostgreSQL に接続できます(自動DNS解決)。
環境変数の管理
.env ファイル
# .env
DATABASE_URL=postgres://user:pass@db:5432/mydb
API_KEY=secret123
# docker-compose.yml
services:
app:
env_file: .env
重要: .env ファイルは .gitignore に必ず追加しましょう。
よく使う実例
PostgreSQL を起動
docker run -d \
--name postgres \
-e POSTGRES_USER=user \
-e POSTGRES_PASSWORD=pass \
-e POSTGRES_DB=mydb \
-p 5432:5432 \
-v postgres-data:/var/lib/postgresql/data \
postgres:16-alpine
Redis を起動
docker run -d --name redis -p 6379:6379 redis:7-alpine
MongoDB を起動
docker run -d \
--name mongo \
-p 27017:27017 \
-v mongo-data:/data/db \
mongo:7
トラブルシューティング
コンテナが起動しない
# ログを確認
docker logs CONTAINER_NAME
# インタラクティブに入って調査
docker run -it --rm IMAGE_NAME sh
ポートが使用中
# ポートを使っているプロセスを確認
lsof -i :3000
# 別のポートを使う
docker run -p 3001:3000 my-app
ディスク容量不足
# 全体的なクリーンアップ
docker system prune -a --volumes
# ボリュームだけ
docker volume prune
# イメージだけ
docker image prune -a
本番環境での注意点
- セキュリティスキャン:
docker scoutで脆弱性をチェック - ヘルスチェック:
HEALTHCHECK命令でコンテナの健康状態を監視 - リソース制限:
--memory,--cpusでリソース制限 - ログドライバ: ログの出力先を設定
- シークレット管理:
docker secretまたは Vault などを使用
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:3000/health || exit 1
まとめ
Docker を使えるようになると、以下が可能になります。
- 環境構築の自動化: 新メンバーも
docker compose upで即開始 - 開発と本番の統一: 「自分のマシンでは動く」問題の解消
- マイクロサービス設計: 各サービスを独立したコンテナで
- CI/CD の高速化: コンテナベースのビルド
まずはローカルの開発環境を Docker 化することから始めましょう。慣れてきたら docker compose で複数サービスを組み合わせ、本番デプロイへと発展させていくのがおすすめです。