結論: Docker(ドッカー)とは、アプリケーションを実行環境ごと「コンテナ」という箱に詰め込み、どんなサーバー上でも同じように動かせるようにする技術です。
エンジニアの世界では「自分のPCでは動いたのに、本番サーバーでは動かない」というトラブルが日常茶飯事でした。Dockerはこの問題を解決するために、OSの設定やライブラリまで丸ごとパッケージ化(コンテナ化)してしまうアプローチを取ります。
本記事では、仮想マシンとの比較から始め、現場で必須となる概念やコマンドまでを一気に解説します。
【結論】Dockerと仮想マシン、どっちを使うべき?
技術的な詳細に入る前に、まず「どちらを選ぶべきか」という問いに答えを出しておきます。両者は対立するものではなく、「分離レベル」と「目的」が異なります。
まずは以下の比較マトリクスで全体像を掴んでください。
| 比較項目 | Docker(コンテナ型) | 仮想マシン(VM型) |
|---|---|---|
| 起動速度 | 爆速(ミリ秒〜秒単位) | 遅い(数分かかることも) |
| サイズ | 軽量(MB単位) | 重い(数GB〜数十GB) |
| OSの自由度 | ホストOSのカーネルに依存 | 完全に自由(Win/Linux混在可) |
| 可搬性 | 高い(環境差異がほぼない) | 普通(移行の手間がかかる) |
| セキュリティ | プロセス分離(カーネル共有) | 完全隔離(ハードウェアレベル) |
Mikoto表を見るとDockerの方が圧倒的に軽くて速そうですね。もうVM(仮想マシン)って使わなくていいんですか?
Yachiいえ、完全に不要になったわけではありません。ただ、Webアプリケーションの開発に関しては、Dockerが「事実上の標準」になっています。
Dockerを選ぶべきシーン
現代のWeb開発において、Dockerは以下の理由から「第一選択肢」となっています。
- マイクロサービスアーキテクチャ:機能を細かく分割して開発する場合、軽量なDockerは相性が抜群です。
- 頻繁なリリース(CI/CD):起動が速いため、自動テストやデプロイのサイクルを高速に回せます。
- チーム開発の環境統一:全員が同じコンテナを使うことで、環境構築のトラブル(Works on my machine)を根絶できます。
- 高密度なリソース利用:1台のサーバーに数多くのアプリを詰め込むことができます。
仮想マシン(VM)を選ぶべきシーン
一方で、VMが廃れたわけではありません。以下のような要件ではVMが優れています。
- 異なるOSカーネルが必要:Linuxサーバー上でWindows Serverを動かしたい場合など。
- 強固なセキュリティ隔離:不特定多数のユーザーが同居するマルチテナント環境など、隣の環境への影響をハードウェアレベルで遮断したい場合。
- レガシーアプリの延命:古いOS環境をそのまま塩漬けにして動かしたい場合。
Yachi個人的には、新規開発のWebサービスであればDocker一択だと考えています。VMは「OSを管理する」コストがかかりますが、Dockerなら「アプリと実行環境」だけに集中できるからです。リソース効率の面でも、VMを複数立てるよりコンテナを並べたほうが圧倒的に経済的です。



アーキテクチャの違い:なぜDockerは軽いのか
なぜDockerはこれほど軽く、速いのでしょうか。その秘密は「カーネル共有」の仕組みにあります。ここでは建設現場のアナロジー(比喩)を使って理解しましょう。
仮想マシン(VM):在来工法の家
VM(ハイパーバイザ型仮想化)は、サーバーという土地の上に、基礎工事から始めて「独立した家(ゲストOS)」を建てるようなものです。
- アプリケーションを1つ動かすために、OS全体(カーネル、システムプロセス等)を丸ごと起動する必要があります。
- 家ごとに基礎や柱が必要なため、土地(リソース)を大量に消費しますし、解体や移動も大仕事です。
Docker:ユニットハウス(プレハブ)
対してDockerは、「ユニットハウス(プレハブ)」に近い構造です。
- 土地(サーバー)には、すでに水道や電気といったインフラ(ホストOSのカーネル)が通っています。
- Dockerはその上に、工場で作られた規格済みの「ユニット(コンテナ)」をクレーンで置くだけです。
- 基礎(カーネル)は共有しているため、ユニット自体は壁と内装だけの必要最小限の重さしかありません。設置も撤去も一瞬で終わります。
この「OSの重い部分(カーネル)はホストに任せて、アプリに必要な部分だけを隔離する」技術こそが、Dockerの軽量さの正体です。
Mikotoなるほど!VMはいちいち基礎工事からやるけど、Dockerは既にあるインフラ(カーネル)を使うから速いってことですね。
Yachiその通りです。だからDockerコンテナは起動に数秒もかからないんです。カーネルの起動待ち時間がないですからね。

Dockerの3大要素とアーキテクチャ
Dockerを理解するには、3つの専門用語を「工業製品の製造フロー」として捉えるのが近道です。
1. Docker Image(設計図・金型)
コンテナを作るための「金型」や「設計図」にあたるデータです。
- Read-only(読み取り専用): 一度作成されたイメージの内容は変更されません。
- レイヤー構造: ベースとなるOS部分、ライブラリ部分、アプリ部分などが層のように積み重なって管理されています。
2. Docker Container(実体・ユニット)
イメージ(金型)から生成された、実際に動く「製品ユニット」です。
- イメージの層の上に、「書き込み可能なレイヤー」を1枚乗せた状態で起動します。
- このコンテナ内でファイルを作成したり変更したりできますが、コンテナを削除するとその変更も消えます(後述)。
3. Docker Registry(資材センター)
イメージを保管・共有するための倉庫です。
- Docker Hub: 世界中の開発者がイメージを公開している巨大なパブリックレジストリ。
- 必要なイメージはここから
docker pull(入荷)し、作ったイメージはdocker push(出荷)します。
MikotoImageが金型で、Containerが実際の製品……。じゃあ、Imageがあれば何度でも同じContainerを作れるってことですか?
Yachiまさにその通りです。だから「開発環境では動いたけど、本番環境では動かない」というトラブルがなくなるんです。同じ金型(Image)から作っていますからね。
データの永続化:コンテナの「揮発性」への対策
初心者が最もハマりやすいのが、「コンテナを削除すると、中のデータも消える」という仕様です。
Mikotoえ、消えるんですか?データベースのデータとかも?
Yachiはい、何も設定しなければ完全に消えます。コンテナは基本的に「使い捨て(エフェメラル)」なんです。
コンテナは、あくまで「処理をする場所」であって、「データを保存する場所」ではありません。例えば、データベースのコンテナをうっかり削除してしまい、顧客データごと消滅するという事故は防がなくてはなりません。
解決策:Volume(ボリューム)
この問題を解決するために、「Volume」という機能を使います。
これは、ユニットハウス(コンテナ)の外側に「外付け倉庫」を設置し、パイプで繋ぐようなイメージです。
- 仕組み: ホスト側のディスク領域を、コンテナ内の特定ディレクトリにマウント(接合)します。
- 効果: コンテナ自体を撤去・交換しても、外付け倉庫(ホスト側)にあるデータは無傷で残ります。
データベースやログファイルなど、消えては困るデータは必ずVolume領域に保存する設計にします。

開発環境の準備(インストール)
Dockerを使い始めるための準備はOSによって異なります。
Windows / Mac ユーザー
「Docker Desktop」をインストールするのが標準です。
- 公式サイトからインストーラーをダウンロードします。
- GUI(操作画面)、CLI(コマンドツール)、Composeなどが全てセットになっています。
- 注意: Windowsの場合は「WSL 2(Windows Subsystem for Linux 2)」をバックエンドに使用することで、パフォーマンスが劇的に向上します。Macの場合は、IntelチップかApple Silicon(M1/M2/M3)かでインストーラーが異なるので注意してください。
YachiWindowsユーザーの方は、必ずWSL 2を有効化してバックエンドに設定してください。旧来のHyper-Vバックエンドだとファイルアクセスが遅すぎて、実務レベルの開発ではストレスが溜まります。個人的には、開発体験を損なわないためにもWSL 2の設定は必須手順だと考えています。
Linux ユーザー
サーバー用途ではGUIのない「Docker Engine」のみをインストールするのが一般的です。apt や yum などのパッケージマネージャー経由で docker-ce を導入します。
インストール後、ターミナルで以下のコマンドを打ち、バージョンが表示されれば準備完了です。
docker version
【実践】ライフサイクルで覚える基本コマンド
ここではWebサーバー(Apache HTTP Server)を立ち上げる流れを通して、コンテナの「一生(ライフサイクル)」を体験します。
1. 取得(Pull)
まず、資材センター(Registry)からイメージを取得します。今回は軽量な alpine 版のApacheを使います。
docker pull httpd:alpine
2. 起動(Run)
イメージからコンテナを生成・起動します。
docker run -d -p 8080:80 --name my-apache-app httpd:alpine
-d: バックグラウンドで実行(Detached mode)。これがないとターミナルが占有されます。-p 8080:80: ホストの8080番ポートを、コンテナの80番ポートに繋ぎます。--name: コンテナにわかりやすい名前を付けます。
Mikotoポートをつなぐ……?どういう意味ですか?
Yachiコンテナは独立した箱なので、外の世界と通信できません。そこで「ホストの8080番窓口に来た通信を、コンテナの80番窓口に転送してね」と設定するんです。これでブラウザから localhost:8080 にアクセスすると、コンテナ内のApacheが見えるようになります。
3. 確認(Ps)
現在動いているコンテナの一覧を表示します。
docker ps
停止中のコンテナも含めて見たい場合は docker ps -a を使います。
4. 潜入(Exec)
起動中のコンテナの中に入って作業したい場合に使います。
docker exec -it my-apache-app sh
これでコンテナ内部のシェルに入れます。exit で抜けられます。
5. 停止・削除(Stop / Rm)
使い終わったら片付けます。
# コンテナを停止
docker stop my-apache-app
# コンテナを削除(停止してから実行)
docker rm my-apache-app
# イメージも不要なら削除
docker rmi httpd:alpine
これら一連の流れが、Docker操作の基本形です。
Dockerfile:インフラの「施工手順書」を作る
毎回コマンドを手打ちで環境を作るのは非効率ですし、ミスも起きます。そこで登場するのが IaC (Infrastructure as Code) の概念です。
Dockerfile は、インフラ構築の手順を記述したテキストファイルです。料理のレシピというよりは、「工場の製造工程マニュアル」と捉えてください。
Python環境を作る例
以下は、Pythonスクリプトを動かすための最小限のDockerfileです。
# 1. ベースイメージの指定(土台)
FROM python:3.11-slim
# 2. 作業ディレクトリの作成と移動
WORKDIR /app
# 3. ホストのファイルをコンテナ内に持ち込む
COPY . /app
# 4. コンテナ起動時に実行するデフォルト命令
CMD ["python", "main.py"]
このファイルを置いたディレクトリで以下のコマンドを実行すると、マニュアル通りにイメージが自動生成(ビルド)されます。
docker build -t my-python-app .
Yachi現場では「手動でサーバー構築すること」は基本的にNGです。誰がやっても同じ結果になるよう、必ずDockerfileに残しましょう。「秘伝のタレ」のような属人的な構築手順は、負債になるだけだからです。
Docker Compose:複合システムの現場監督
Webサーバー単体ならコマンド起動でも何とかなりますが、実際のシステムは「Webアプリ + データベース + キャッシュサーバー」のように複数のコンテナが連携して動きます。
これを1つずつ手動で起動するのは現実的ではありません。そこで Docker Compose の出番です。
役割とメリット
compose.yaml という定義ファイルにシステム全体の構成を書き、「現場監督」に指示を出します。
- 一括管理: コマンド一発で全コンテナを起動・停止できます。
- ネットワーク自動設定: コンテナ同士が名前で通信できるよう、専用ネットワークを自動で作ってくれます。
Mikoto複数のコンテナをまとめて管理するツールってことですね。
Yachiそうです。「WebアプリとDBを同時に起動して、お互いに通信できるようにする」といった面倒な設定を、ファイル1つで定義できます。
構成例(Pythonアプリ + Redis)
Webアプリと、データキャッシュ用のRedisを連携させる定義ファイルの例です。
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: "redis:alpine"
このファイルがある場所で以下を実行するだけで、環境全体が立ち上がります。
docker compose up -d
一括で片付けるときは docker compose down です。
※以前は docker-compose(ハイフンあり)でしたが、現在は docker compose(ハイフンなし)への移行が進んでいます。
よくある質問と誤解 (FAQ)
- Docker Desktopは有料ですか?
-
A: 条件によります。
個人利用や教育目的、中小企業(従業員数250人未満かつ年間売上1,000万ドル未満)であれば「Docker Personal」として無料で利用できます。大企業での業務利用には有料サブスクリプションが必要です。コストが課題となる場合、代替としてRancher DesktopやOrbStackなどを検討するケースもあります。 - 既存のVM環境をDockerに移行できますか?
-
A: 可能ですが、「再設計」が必要です。
VMの中身をそのままコンテナに詰め込む(リフト&シフト)だけでは、Dockerのメリットである軽量性や柔軟性が活かせません。アプリケーション、データベース、設定ファイルなどを切り出し、マイクロサービス的にコンテナ化(Containerization)する再設計が推奨されます。 - 「コンテナが落ちる」とはどういう状態ですか?
-
A: メインプロセスが終了した状態です。
コンテナは「中のプロセス(PID 1)が動いている間だけ存在する」という仕様があります。例えば、ただスクリプトを1回実行するだけのコンテナは、実行完了と同時に停止(Exited)します。Webサーバーのように常駐させたい場合は、バックグラウンドで動き続けるプロセスとして起動する必要があります。
まとめ
Dockerは、開発環境の構築から本番運用までを一貫させる、現代エンジニアにとっての必須ツールです。
- 軽量・高速: カーネル共有により、VMよりも圧倒的にリソース効率が良い。
- どこでも動く: 「コンテナ」に固めることで環境依存トラブルを排除できる。
- コードで管理: DockerfileやComposeにより、インフラ構築を自動化・資産化できる。
まずは手元のマシンにDocker Desktopを入れ、docker run hello-world から始めてみてください。黒い画面(ターミナル)の中に、世界中のエンジニアが共有する巨大なエコシステムが広がっています。
Yachi最初はコマンド操作や概念に戸惑うかもしれませんが、一度慣れてしまえば「Dockerなしの開発なんて考えられない」と感じるはずです。僕もそうでした。まずは怖がらずに、小さなコンテナを一つ起動するところから始めてみましょう。
