「開発環境の構築に丸1日かかってしまった…」
「先輩のPCでは動くのに、自分のPCだとエラーが出る…」
エンジニアとして働く中で、このような「環境構築」の悩みに直面したことはありませんか?
私もかつては、Pythonのバージョン違いや、必要なライブラリ不足で、開発を始めるまでに何時間も浪費した経験があります。
そんな開発者の「環境」に関する悩みを劇的に解決してくれるのが、Docker です。
この記事は、「Dockerについて入門レベルから知りたい」「Dockerがなぜ必要なのか、どう使えばいいのかわからない」 という方に向けて書いています。
この記事を読めば、Dockerの基本概念から、具体的な使い方、さらには実務での応用ステップまで、体系的に理解できます。開発効率を上げたいすべてのエンジニア必見です。
Dockerとは?入門前に知っておきたい基本知識

まずは「Dockerとは何か」という入門の基本から押さえましょう。
そもそもDockerとは何か?
Dockerとは、「コンテナ型仮想化」 という技術を使って、アプリケーションの実行環境を構築・管理するためのプラットフォームです。
難しく聞こえるかもしれませんが、要は「アプリケーションと、それが動くために必要な設定やライブラリ一式を『コンテナ』という箱に詰め込む」仕組みです。
この「コンテナ」は、どのコンピュータ(Windows, Mac, Linux)の上でも、ほぼ同じように動作します。
「私のPCでは動いたのに、本番サーバでは動かない」といった、開発現場でよくある環境差異の問題を、Dockerは根本から解決してくれるのです。
Dockerが注目される理由
Dockerがこれほどまでに注目され、現代の開発に不可欠となった理由は、開発効率と運用効率が劇的に向上するからです。
従来の開発では、新しいプロジェクトに参加するたびに、OSの設定、データベースのインストール、言語のバージョン合わせなど、複雑な環境構築作業が必要でした。
しかしDockerを使えば、「Dockerイメージ」と呼ばれる設計図さえあれば、コマンド一つで誰でも・どこでも・すぐに同じ開発環境を再現できます。
この「環境構築の高速化」と「環境の持ち運びやすさ」が、Dockerの最大の強みです。
仮想マシンとの違いをわかりやすく解説
Dockerとよく比較される技術に「仮想マシン」(VMwareやVirtualBoxなど)があります。どちらも「仮想的な実行環境」を作る点で似ていますが、根本的な違いがあります。
結論から言うと、Dockerコンテナは仮想マシンよりも圧倒的に軽量で高速に動作します。
- 仮想マシン (VM):
- ホストOSの上に、ゲストOS(WindowsやLinuxなどOSそのもの) を丸ごと起動します。
- 起動に数分かかり、メモリやディスクも数GB単位で消費します。
- 例えるなら「独立した家を丸ごと建てる」イメージ。
- Dockerコンテナ:
- ホストOSの機能(カーネル)を共有し、アプリケーションの実行に必要な部分だけを隔離します。
- 起動は数秒で、リソース消費も最小限に抑えられます。
- 例えるなら「アパートの一室を借りる」イメージ。
この軽量さゆえに、1台のマシンで多くのコンテナを同時に動かしたり、開発・テスト・本番環境へのデプロイを高速に繰り返したりすることが可能になります。
Dockerを使うメリットとデメリット

Dockerは万能に見えますが、メリットとデメリットの両方を理解しておくことが重要です。
Dockerの代表的なメリット5つ
Dockerを導入することで得られる主なメリットは以下の5点です。
- 環境構築が数秒で完了する「Dockerfile」や「Docker Compose」という設定ファイルを使えば、複雑な環境もコマンド一つで再現できます。新メンバーがチームに参加した際のセットアップ時間が劇的に短縮します。
- 環境差異がなくなる(ポータビリティ)開発環境(Mac)、テスト環境(Linux)、本番環境(クラウド)など、どこでも同じ「コンテナ」を動かせます。「私の環境でだけ動かない」という不毛なトラブルがなくなります。
- 起動・停止が高速で軽量前述の通り、仮想マシンに比べて起動が非常に高速です。開発中の「ちょっと試してすぐ破棄する」といったサイクルをストレスなく回せます。
- 環境のコード管理(IaC)Dockerfileによって、どのような環境でアプリケーションが動いているかがコードとして明文化されます。「このサーバ、誰がどんな設定したっけ?」といった属人化を防げます。
- リソース効率の向上1台のサーバで多くのコンテナを効率よく実行できます。特にマイクロサービスアーキテクチャのように、小さなサービスを多数実行する場合に真価を発揮します。
実務で感じるデメリット・注意点
もちろんデメリットも存在します。
- 学習コストがかかるDocker独自の概念(イメージ、コンテナ、ボリューム、ネットワーク)を新しく学ぶ必要があります。最初はとっつきにくいと感じるかもしれません。
- OSに依存する部分もあるDockerはホストOSのカーネルを共有するため、例えばWindowsホスト上で本物のLinuxカーネルを動かすには、WSL2 (Windows Subsystem for Linux 2) といった追加技術が必要になります(現在のDocker Desktopでは自動化されています)。
- パフォーマンスのオーバーヘッド非常に軽量とはいえ、ネイティブ環境で直接実行するのに比べれば、わずかながらパフォーマンスのオーバーヘッドは存在します。特にファイルI/O(読み書き)が遅くなるケースが報告されることもあります。
どんな開発に向いているか
結論として、Dockerはほぼ全てのWebアプリケーション開発に向いています。
特に以下のようなケースで強力な効果を発揮します。
- チームでの開発
- Webサービス (PHP, Ruby, Python, Go, Javaなど)
- APIサーバ
- マイクロサービスアーキテクチャ
- CI/CD(継続的インテグレーション/継続的デリバリー)パイプラインの構築
逆に、GUIを多用するデスクトップアプリ開発や、OSの深い部分をチューニングする必要がある特殊な開発では、Dockerが最適でない場合もあります。
Dockerの基本構造を理解しよう

Dockerを使いこなすには、いくつかの重要なキーワードを理解する必要があります。ここでは入門に必須の3つを解説します。
イメージとコンテナの違い
これはDocker入門者が最初に覚えるべき、最も重要な概念です。
- イメージ (Image):
- コンテナの「設計図」あるいは 「テンプレート」 です。
- アプリケーションを実行するために必要なOS、ライブラリ、設定ファイル、アプリケーションコードなど、すべてをまとめた静的なファイルです。
- 例えるなら、「OSのインストールCD」や「冷凍食品のパッケージ」です。
- コンテナ (Container):
- イメージを元に「実行された実体」です。
- イメージから起動された、実際に動作しているプロセス(環境)を指します。
- 例えるなら、「インストールされたOS」や「解凍されて調理中の冷凍食品」です。
1つの「イメージ」から、何個も同じ「コンテナ」を作ることができます。 これが環境構築の高速化の秘密です。
Dockerfileとは?役割と書き方
Dockerfileは、前述の「Dockerイメージ」を作成するための設計図です。
これはプレーンテキストのファイルで、以下のようなことを記述します。
- どのOSイメージをベースにするか (例:
FROM python:3.9) - どのファイルをコンテナ内にコピーするか (例:
COPY . /app) - どのライブラリをインストールするか (例:
RUN pip install -r requirements.txt) - コンテナ起動時にどのコマンドを実行するか (例:
CMD ["python", "app.py"])
Dockerfileのサンプル (シンプルなPythonアプリ):
# 1. ベースイメージを指定 (Python 3.9の軽量版)
FROM python:3.9-slim
# 2. 作業ディレクトリを設定
WORKDIR /app
# 3. 必要なファイル(requirements.txt)をコピー
COPY requirements.txt .
# 4. 依存ライブラリをインストール
RUN pip install --no-cache-dir -r requirements.txt
# 5. アプリケーションのソースコードをコピー
COPY . .
# 6. コンテナ起動時に実行するコマンド
CMD [ "python", "./main.py" ]このDockerfileを docker build コマンドで実行すると、オリジナルのDockerイメージが作成されます。
Docker Hubとプライベートリポジトリの使い分け
作成したDockerイメージは、どこかに保存しておく必要があります。その保存場所を「レジストリ」と呼びます。
- Docker Hub:
- Docker社が公式に提供している、世界最大の公開レジストリです。
- GitHubのDockerイメージ版と考えると分かりやすいでしょう。
- Nginx, Python, MySQLなど、公式が提供する安全なイメージが多数登録されており、誰でも
docker pullコマンドでダウンロードできます。 - 自作イメージも公開できます(無料プランでは公開のみ)。
- プライベートリポジトリ:
- 非公開・社内用のイメージを保存するレジストリです。
- 自社開発のアプリケーションコードを含むイメージなど、外部に公開したくない場合に利用します。
- 代表的なサービスには、AWS ECR, GCP Artifact Registry, Azure CR, GitHub Packagesなどがあります。
入門者はまず、Docker Hubから公式イメージを取得して使うことから始めます。
Dockerのインストールと初期設定

概念を学んだら、次は実際にDockerを動かしてみましょう。
Windows・Mac・Linuxそれぞれの導入方法
現在、WindowsとMacでDockerを始める最も簡単な方法は、公式が提供する「Docker Desktop」をインストールすることです。
- Windows (Windows 10/11 Pro/Enterprise/Home):
- Docker Desktop for Windowsを公式サイトからダウンロードします。
- インストールにはWSL2 (Windows Subsystem for Linux 2) の有効化が必要です。多くの場合、インストーラーが自動で設定してくれます。
- Mac (Intel / Apple Silicon):
- Docker Desktop for Macを公式サイトからダウンロードします。
- 自分のMacのCPU(IntelかApple Silicon M1/M2/M3)に合ったインストーラーを選びます。
- Linux (Ubuntu, Debian, Fedora, CentOSなど):
- Linuxには「Docker Engine」を直接インストールするのが伝統的でしたが、最近では「Docker Desktop for Linux」も提供されています。
- 入門者はDocker Desktopを、サーバ運用が目的ならDocker Engineをインストールするのが良いでしょう。
Docker Desktopの基本設定
インストール後、Docker Desktopを起動すると、タスクトレイ(Windows)やメニューバー(Mac)にクジラのアイコンが表示されます。
入門者がまず確認すべき設定は以下の通りです。(設定(歯車アイコン) > Resources)
- CPUs / Memory:
- Dockerが使用できるPCリソースの上限を設定します。
- PCのスペックにもよりますが、デフォルト(例: 4 CPUs, 4GB Memory)のままでも、たいていの入門学習は問題ありません。
- もしPCの動作が重く感じるようであれば、数値を少し下げてみてください。
初回に確認しておくべきコマンド
インストールが正しく完了したかを確認するために、ターミナル(WindowsならPowerShellかコマンドプロンプト)を開き、以下の2つのコマンドを実行します。
- バージョン確認
docker versionClient(操作側)とServer(実行側、Dockerデーモン)の両方のバージョン情報が表示されれば、Dockerは起動しています。 - Hello Worldの実行
docker run hello-worldこのコマンドは、hello-worldというDockerイメージを探し、もしローカルになければDocker Hubから自動でダウンロードし、コンテナとして実行します。Hello from Docker!というメッセージが表示されれば、インストールと初期設定は大成功です。
Dockerの基本操作を体験してみよう

Docker環境が整ったので、基本的なコマンド操作を学びます。
よく使うDockerコマンド一覧
入門者がまず覚えるべきコマンドは多くありません。
| コマンド | 説明 |
docker run [イメージ名] | イメージからコンテナを起動する |
docker ps | 起動中のコンテナ一覧を表示する |
docker ps -a | 停止中のコンテナも含む一覧を表示する |
docker stop [コンテナ名/ID] | 起動中のコンテナを停止する |
docker rm [コンテナ名/ID] | コンテナを削除する(停止してから) |
docker images | ローカルにあるイメージ一覧を表示する |
docker rmi [イメージ名/ID] | イメージを削除する |
docker pull [イメージ名] | Docker Hubなどからイメージをダウンロードする |
docker build -t [タグ名] [パス] | Dockerfileからイメージをビルドする |
docker exec -it [コンテナ名] bash | 起動中コンテナの内部に入る(bashを実行) |
docker logs [コンテナ名] | コンテナのログ(標準出力)を表示する |
Nginxコンテナを立ち上げてみよう(サンプル付き)
コマンド1つでWebサーバを立ち上げてみましょう。ここでは人気のWebサーバ「Nginx」を使います。
以下のコマンドをターミナルで実行してください。
docker run -d -p 8080:80 --name my-nginx nginx実行後、Webブラウザを開き、http://localhost:8080 にアクセスしてください。
Nginxの「Welcome to nginx!」というページが表示されれば成功です。たった1コマンドでWebサーバが起動しました。
コンテナの停止・削除・永続化の基本
先ほど起動したNginxコンテナを片付けましょう。
- コンテナの停止
docker stop my-nginx - コンテナの削除(停止しないと削除できません)
docker rm my-nginx
これでコンテナは削除されました。docker ps -a で確認しても、一覧から消えているはずです。
コンテナは、原則として「使い捨て」です。docker rm でコンテナを削除すると、コンテナ内で作成されたデータ(例: データベースのデータ、アップロードされたファイル)も一緒に消えてしまいます。
データを永続化(コンテナを削除してもデータを残す)したい場合は、「Docker Volume(ボリューム)」 という仕組みを使います。これは、ホストPCの特定の領域をコンテナにマウント(接続)する技術です。
Docker Composeで複数コンテナを管理する

Dockerの基本操作に慣れたら、次は「Docker Compose」です。実務では必須のツールです。
Docker Composeとは?
Docker Composeは、複数のコンテナ構成を定義・管理するためのツールです。
先ほどのNginxはコンテナ1つでしたが、実際のWebサービスは「Webサーバ」「アプリケーションサーバ」「データベースサーバ」など、複数のコンテナが連携して動作します。
これらのコンテナを、docker run コマンドで1つずつ起動・設定するのは非常に手間がかかります。
Docker Composeは、docker-compose.yml というYAML形式の設定ファイルに、「どのコンテナを、どう連携させて起動するか」を記述するだけで、コマンド一つ(docker-compose up) ですべてのコンテナを一括管理できます。
docker-compose.ymlの基本構文
docker-compose.yml (docker-compose.yml) は、主に version, services, volumes, networks などで構成されます。
services: 起動するコンテナの定義を記述します。image: 使用するイメージ名。ports: ポートマッピング(例:"8080:80")。volumes: ボリューム(データ永続化)の設定。environment: 環境変数の設定。depends_on: 起動順序の依存関係(例: DBが起動してからAPを起動)。
WordPress+MySQL環境を構築してみる例
最も分かりやすい例として、ブログツールのWordPressとMySQLの環境をDocker Composeで構築してみましょう。
適当なフォルダを作成し、その中に docker-compose.yml という名前で以下のファイルを作成します。
docker-compose.yml:
version: '3.8'
services:
# データベース(MySQL)サービス
db:
image: mysql:8.0
container_name: wordpress_db
volumes:
# db_dataという名前のボリュームを/var/lib/mysqlにマウント
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: my_root_password123
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: my_user_password123
restart: always
# WordPressサービス
wordpress:
image: wordpress:latest
container_name: wordpress_app
ports:
# ホストの8000番ポートをコンテナの80番ポートに
- "8000:80"
depends_on:
# dbサービス(MySQL)が起動してから起動する
- db
environment:
WORDPRESS_DB_HOST: db:3306 # サービス名(db)で接続
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: my_user_password123
restart: always
# データを永続化するためのボリューム定義
volumes:
db_data:ファイルを作成したら、そのフォルダでターミナルを開き、以下のコマンドを実行します。
docker-compose up -d(docker compose up -d ※ハイフンなしが新しい構文です)
これだけで、MySQLコンテナとWordPressコンテナが、内部ネットワークで接続された状態で起動します。
ブラウザで http://localhost:8000 にアクセスすると、WordPressの初期設定画面が表示されるはずです。db_data ボリュームを指定しているため、コンテナを停止・削除してもデータベースの内容は保持されます。
よくあるトラブルと解決方法

Docker入門者がつまずきがちなポイントと、その対処法を紹介します。
コンテナが起動しないときのチェックポイント
docker run や docker-compose up を実行したのに、docker ps で見るとコンテナがいない(すぐに停止してしまう)場合があります。
この原因は、コンテナの起動時にエラーが発生しているためです。
docker logs [コンテナ名] コマンドで、コンテナのログを確認します。
docker logs wordpress_appログには「設定ファイルが見つからない」「データベースに接続できない」など、エラーの原因が具体的に出力されています。
ポート競合エラーの対処法
docker run -p 8080:80 ... を実行した際に、「Port is already allocated」や「address already in use」といったエラーが出ることがあります。
ホストPCの8080番ポートが、すでに他のアプリケーション(または他のDockerコンテナ)によって使用されているためです。
イメージの容量が大きくなりすぎる問題
Dockerを使い続けると、古いイメージやビルドキャッシュが溜まり、PCのディスク容量を圧迫することがあります。
docker system prune コマンドで、不要になったリソースを一括削除できます。
# 使用されていないコンテナ、ネットワーク、イメージ(dangling=true)を削除
docker system prune
# 上記に加え、停止中のコンテナや使用されていない全イメージも削除 (強力)
docker system prune -a --volumes定期的に実行することで、ディスク容量を健全に保てます。
まとめ
Dockerは、現代のソフトウェア開発において必須の技術となりました。最初は「イメージ」や「コンテナ」といった独自の概念に戸惑うかもしれませんが、一度その便利さを体験すると、もうDockerなしの開発には戻れなくなるはずです。
- Dockerは「コンテナ型仮想化」技術
- 「イメージ(設計図)」から「コンテナ(実体)」が起動する
- 軽量・高速で、環境差異をなくすことが最大のメリット
docker runで単体起動、docker-composeで複数起動
この記事が、あなたのDocker入門の一助となれば幸いです。まずは docker run hello-world から、コンテナの世界に飛び込んでみてください。
