はじめに
近年、「クラウドネイティブ」や「マイクロサービス」といった言葉が日常的に使われるようになり、開発現場で必須とされるテクノロジーの1つに「Docker」があります。
しかし、「Docker って何?」「どうやって使うの?」という疑問を持つ初心者は多いです。この記事では、Docker の基本概念から、コンテナ型仮想化がもたらすメリット、そして実際に Docker を使い始めるためのステップをわかりやすく解説します。初心者でもすぐに手を動かしたくなるような内容になっていますので、ぜひ最後までご覧ください。
コンテナ型仮想化とは何か?
仮想化の歴史を振り返る
-
ハードウェアレベルの仮想化
VMware, VirtualBox など、1台の物理サーバ上に複数の仮想マシン(VM)を走らせる技術。
それぞれの VM は仮想 CPU、仮想メモリ、仮想ディスクを持ち、完全に隔離された OS を実行します。 -
OS レベルの仮想化(LXC, Linux Containers)
物理サーバ上で OS カーネル を共有しつつ、ユーザー空間を分離して複数の環境を走らせます。
スタンドアロンの VM よりもオーバーヘッドは小さいですが、カーネルの互換性が課題でした。 -
コンテナ型仮想化(Docker, Kubernetes)
コンテナは アプリケーション とその 実行に必要なライブラリ・設定 のみをまとめた軽量なパッケージです。
OS カーネルはホストと共有するため、スタートアップが極めて速く、リソース効率も高い。
コンテナとイメージ
-
イメージ(Image)
コンテナを起動するための静的なテンプレート。
Dockerfile を書いてビルドすると、イメージが作られます。イメージはレイヤー構成で管理され、同じレイヤーを複数のイメージで共有できます。 -
コンテナ(Container)
イメージを実行したときに生成される実体。
実行中のプロセスが入っている“実際の環境”です。コンテナは短期的または長期的に稼働し、必要に応じて再作成できます。
Docker が提供するメリット
| 項目 | 従来の VM | Docker コンテナ |
|---|---|---|
| 起動時間 | 1〜2 分 | 1 秒以下 |
| 資源利用 | 1 VM = 1 OS | 1 コンテナ = 必要最低限 |
| 画像サイズ | 1GB 以上 | 100MB 〜 1GB 以内 |
| ポータビリティ | VM イメージはハイパーバイザー依存 | ほぼすべての OS とクラウドで動作 |
| 再現性 | スクリプトが必要 | Dockerfile で完全に再現 |
| CI/CD に適合 | スピードが問題 | 短時間でスピードスルー |
-
速度と効率性
1 秒ミリ秒単位でスタートアップできるため、開発時のフィードバックループが劇的に短縮します。 -
高速デプロイ
画像を pull するだけで環境が構築されるので、オンプレミス・クラウド問わず同一条件で動きます。 -
安全な隔離
ホストカーネルを共有したまま、ユーザー空間は完全に分離。コンテナ間での干渉がほぼありません。 -
マイクロサービスアーキテクチャの標準化
各サービスを独立したコンテナで管理・運用でき、スケールアップ・ダウンが容易です。
Docker の基本コンポーネント
| 項目 | 説明 |
|---|---|
| Docker Engine | コンテナを管理・実行するランタイム。CLI で docker コマンドを使います。 |
| Docker Hub / Docker Registry | イメージを公開・共有するレジストリ。公式イメージは library 、社内専用は myregistry などがあります。 |
| Dockerfile | イメージ構築用のレシピ。FROM, RUN, COPY, EXPOSE などの命令が書かれます。 |
| docker-compose | 複数のコンテナ構成を 1 つの YAML ファイルで定義し、docker-compose up でまとめて管理できます。 |
| Volumes | コンテナのライフサイクルを超えて永続化したいデータをホスト側に保持します。 |
簡単に始めてみよう ― Docker のインストール
-
公式サイトからインストール
- Windows / macOS: Docker Desktop で GUI インストーラ。
- Linux:
apt-get install docker.ioなど、ディストリビューション別に公式リポジトリ経由でインストール。
-
確認
docker --version docker run --rm hello-worldHello from Docker!というメッセージが表示されれば成功です。 -
ユーザー権限
sudo usermod -aG docker $USERで普通ユーザーでも
dockerコマンドが使えるようにします(再ログインが必要)。
Dockerfile を書いてイメージを作る
# 1. ベースイメージ (OS + 必要最低限のツール)
FROM python:3.11-slim
# 2. 作業ディレクトリを作成
WORKDIR /app
# 3. 必要なファイルをコピー
COPY requirements.txt .
COPY app.py .
# 4. 依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt
# 5. コンテナ起動時のコマンド
CMD ["python", "app.py"]
ビルドと実行
docker build -t my-hello-app .
docker run -d -p 5000:5000 --name hello-app my-hello-app
-d→ デタッチモードでバックグラウンド実行。-p 5000:5000→ ホストの 5000 番ポートをコンテナの 5000 番にマッピング。
コンテナにアクセスして動作確認:
curl http://localhost:5000
docker-compose でマルチコンテナを管理
docker-compose.yml 例(Web + データベース):
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
environment:
- DATABASE_URL=postgres://postgres:postgres@db:5432/appdb
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: appdb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
docker compose up -d
depends_onによって DB が起動してから Web が立ち上がる。volumesで永続化データをホストに保存。
Docker と従来の仮想化の違い
| 項目 | Docker コンテナ | VM |
|---|---|---|
| カーネル | ホストと共有 | 個別に搭載 |
| スペース | ~100MB | 1GB 以上 |
| スタートアップ | 秒以内 | 分単位 |
| 共有リソース | 動的にシェア | 固定リソース |
| 環境一致 | Dockerfile で完全再現 | スクリプト・手順が必要 |
キーポイント
コンテナは OS のカーネルレベルで隔離されるため、VM よりも軽量。ですが、“完全に独立” ではなくカーネルを共有する事から「隔離」の度合いは VM より低い。
コンテナ型仮想化の実際のユースケース
| シナリオ | Docker のメリット |
|---|---|
| 開発環境の統一 | docker-compose up で同じ環境をチーム全員で構築。 |
| CI / CD パイプライン | ビルドステージとテストステージで同一イメージを使える。 |
| マイクロサービスのデプロイ | 各サービスを個別コンテナで管理し、水平スケールが容易。 |
| 環境差異の解消 | 本番、ステージング、ローカルを同じイメージで動作させる。 |
| リソースの最適化 | 必須ライブラリのみを入れたイメージでメモリ使用量を削減。 |
Docker を使う際のベストプラクティス
-
最小権限のイメージ
FROM debian:bullseye-slimという最低構成にしてから必要なものだけ追加。 -
複数ステージビルド
ビルドツールを入れたイメージでコンパイルし、最終イメージはランタイムのみを残す。FROM maven:3.8.6-openjdk-17 AS builder COPY src /usr/src/app RUN mvn -f /usr/src/app/pom.xml clean package FROM openjdk:17-jre-slim COPY --from=builder /usr/src/app/target/app.jar /app.jar CMD ["java", "-jar", "/app.jar"] -
レイヤーのキャッシュ活用
頻繁に変わらない部分(依存関係インストール)はレイヤーとしてキャッシュ。 -
環境変数で構成管理
ENVや--env-fileを使って実行時に差別化。 -
画像サイズの最適化
docker-slim,minify,docker image pruneなどで不要ファイルを削除。 -
セキュリティ対策
- 最小権限で実行:
USER appuserで root で始動しない。 - 定期的なアップデート: base イメージを最新へ。
- 脆弱性スキャン:
docker scan等で自動チェック。
- 最小権限で実行:
Docker を使いこなすためのリソース
| タイプ | 具体例 |
|---|---|
| 公式ドキュメント | https://docs.docker.com/ |
| コミュニティ記事 | dev.to, Medium, Qiita |
| 動画チュートリアル | YouTube(公式チャンネル、TechWithTim), Udemy |
| Kubernetes との連携 | docker compose → kubectl への移行ガイド |
| 実践演習 | Docker を使った「Hello World」から「マイクロサービス」まで段階的に学ぶ eBook |
まとめ
- Docker は「イメージ」→「コンテナ」のフローで、軽量で高速にアプリケーションを実行できるコンテナ型仮想化です。
- 従来の VM と比べて、起動速度、リソース効率、ポータビリティが大幅に優れます。
- Dockerfile で構築したイメージは、環境依存がない再現性とともに、CI/CD パイプラインやマイクロサービス構築に最適です。
- ベストプラクティスを守る事で、セキュリティやメンテナンス性も高められます。
もしまだ Docker を試したことがない方は、まず簡単な「Hello World」イメージを作り、docker run で起動してみましょう。その感触を味わってから、実際のプロジェクトへ取り込む準備を進めるとスムーズです。
何か質問や相談があれば、遠慮なくコメントしてください。Docker 入門の旅を一緒に進めましょう!

コメント