Docker入門|開発環境構築の基礎をゼロから分かりやすく解説
Dockerの基礎概念からインストール、実際のコンテナ操作、docker-composeまで、初心者でも分かるように丁寧に解説します。
はじめに:「自分のPCでは動いたのに…」を解決する技術
エンジニアなら一度は経験したことがあるでしょう。「自分のPCでは動くのに、チームメンバーの環境では動かない」「本番サーバーにデプロイしたら謎のエラーが出る」——この環境の違いによる問題を根本的に解決する技術がDockerです。
2026年現在、Dockerはインフラエンジニアだけの技術ではなくなりました。フロントエンド、バックエンド、データサイエンスを問わず、開発環境の構築にDockerを使うのが当たり前になっています。求人票でも「Docker経験あり」が記載されることが増えており、避けて通れない技術と言って良いでしょう。
この記事では、Dockerの概念から実際の操作まで、完全にゼロから理解できるように解説します。一緒に手を動かしながら読んでいただくと、記事を読み終わる頃にはDockerの基本操作ができるようになっているはずです。
コンテナとは何か?仮想マシンとの違い
「箱」に環境をまるごとパッケージングする
Dockerの核心は「コンテナ」という概念です。コンテナとは、アプリケーションと、それを動かすために必要なもの一式を、独立した「箱」に詰め込む技術です。
たとえば、Node.jsのWebアプリケーションを動かすには、Node.js本体、npmパッケージ、設定ファイルなどが必要です。これらを全部まとめてコンテナという「箱」に入れてしまえば、そのコンテナはどんなPCでも同じように動くわけです。
仮想マシン(VM)と何が違うの?
「環境をまるごと持ち運ぶ」という目的ならVMでも同じでは?と思うかもしれません。大きな違いは軽さです。
仮想マシン(VM)の場合:
- OSまるごとコピーするので、1つのVMに数GB〜数十GBかかる
- 起動に数分かかる
- ホストOSの上にゲストOSが乗る二重構造で、リソースを大量に消費する
Dockerコンテナの場合:
- ホストOSのカーネルを共有するので、数十MB〜数百MBで済む
- 起動は数秒
- プロセスレベルの分離なので、オーバーヘッドが極めて小さい
つまりDockerは、VMの良いところ(環境の独立性)を残しつつ、圧倒的に軽量で高速という特徴を持っています。
Docker用語を整理しよう
Dockerには独自の用語がいくつかあります。ここで整理しておきましょう。
イメージ(Image)
コンテナの「設計図」です。「Node.js v20がインストールされた状態のLinux環境」といった内容がパッケージされたものです。Docker Hubという公式リポジトリに、様々なイメージが公開されています。
コンテナ(Container)
イメージを元に作られた実際に動いている実体です。「イメージが設計図、コンテナが建てた家」と考えると分かりやすいです。1つのイメージから複数のコンテナを作れます。
Dockerfile
イメージを作るためのレシピファイルです。「Ubuntu上にNode.jsをインストールして、ソースコードをコピーして、npmパッケージをインストールする」といった手順を記述します。
Docker Compose
複数のコンテナを一括管理するためのツールです。Webアプリ+データベース+キャッシュサーバーのように、複数のサービスを組み合わせて動かす場合に使います。
ボリューム(Volume)
コンテナのデータを永続化するための仕組みです。コンテナは削除するとデータも消えますが、ボリュームを使えばデータを保持できます。
Dockerのインストール
Windows / Macの場合
Docker Desktopをインストールするのが最も簡単です。公式サイト(docker.com)からダウンロードして、インストーラーを実行するだけです。
Windowsの場合はWSL2(Windows Subsystem for Linux 2)が必要です。Docker Desktopのインストーラーが自動で設定してくれますが、事前にWSL2を有効にしておくとスムーズです。
インストール確認
ターミナルを開いて以下を実行しましょう。
docker --version
# Docker version 27.x.x が表示されればOK
docker run hello-world
# Hello from Docker! というメッセージが出れば成功
hello-world コンテナが動いた時点で、Dockerの基本的なセットアップは完了です。
最初のコンテナを動かしてみよう
Nginxコンテナを起動する
Webサーバーの定番であるNginxのコンテナを起動してみましょう。
docker run -d -p 8080:80 --name my-nginx nginx
このコマンドを分解すると:
-d— バックグラウンドで動かす(デタッチモード)-p 8080:80— ホストの8080番ポートをコンテナの80番ポートに接続--name my-nginx— コンテナに名前を付けるnginx— 使用するイメージ名
ブラウザで http://localhost:8080 にアクセスすると、Nginxのデフォルトページが表示されるはずです。たった1行のコマンドで、Webサーバーが起動しました。
コンテナの基本操作
docker ps # 稼働中のコンテナ一覧
docker ps -a # 停止中も含めた全コンテナ一覧
docker stop my-nginx # コンテナを停止
docker start my-nginx # コンテナを再開
docker rm my-nginx # コンテナを削除
docker logs my-nginx # コンテナのログを表示
docker exec -it my-nginx bash # コンテナの中に入る
特に docker exec -it はよく使います。コンテナの中に入って、ファイルを確認したり設定を変更したりできます。
Dockerfileを書いてオリジナルイメージを作る
Node.jsアプリケーションのDockerfileを書いてみましょう。
# ベースイメージの指定
FROM node:20-alpine
# 作業ディレクトリの設定
WORKDIR /app
# パッケージ情報をコピー(キャッシュ活用のため先にコピー)
COPY package*.json ./
# 依存関係のインストール
RUN npm ci --production
# アプリケーションコードをコピー
COPY . .
# ポートの公開宣言
EXPOSE 3000
# アプリケーションの起動コマンド
CMD ["node", "server.js"]
イメージのビルドと実行
docker build -t my-app .
docker run -d -p 3000:3000 my-app
-t my-app でイメージに名前を付け、. で現在のディレクトリのDockerfileを使うことを指定しています。
Dockerfileのベストプラクティス
.dockerignoreを必ず作る —node_modulesや.gitをイメージに含めないようにする- マルチステージビルドを活用 — ビルド用と実行用でステージを分け、最終イメージを軽量化する
- レイヤーキャッシュを意識 — 変更頻度の低いもの(依存関係)を先にCOPYすると、ビルドが高速化する
- alpine系イメージを使う — 通常のイメージより大幅に軽量(例:node:20が1GBなのに対し、node:20-alpineは150MB程度)
docker-composeで複数サービスを管理する
実際のWebアプリケーションは、アプリサーバー単体で動くことは稀です。データベースやキャッシュなど、複数のサービスが必要になります。docker-composeを使えば、これらを一括で管理できます。
compose.yamlの例
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
- redis
db:
image: postgres:16
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- db-data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
db-data:
compose操作コマンド
docker compose up -d # 全サービスをバックグラウンドで起動
docker compose down # 全サービスを停止・削除
docker compose logs -f # 全サービスのログをリアルタイム表示
docker compose ps # 稼働状況の確認
docker compose exec app sh # 特定のサービスに入る
docker compose up -d だけで、アプリ・DB・Redisが全部起動します。チームメンバーも同じコマンドを打つだけで、全く同じ開発環境が手に入るわけです。
よく使うDockerコマンド一覧
覚えておくと便利なコマンドをまとめます。
イメージ操作:
docker images— ローカルのイメージ一覧docker pull イメージ名— イメージのダウンロードdocker rmi イメージ名— イメージの削除docker image prune— 未使用イメージの一括削除
コンテナ操作:
docker run— コンテナの作成・起動docker stop / start / restart— 停止・起動・再起動docker rm— コンテナの削除docker container prune— 停止中コンテナの一括削除
デバッグ:
docker logs コンテナ名— ログの確認docker inspect コンテナ名— 詳細情報の表示docker stats— リソース使用状況のリアルタイム表示
実際の開発現場でのDocker活用例
ユースケース1:チーム開発の環境統一
compose.yaml をリポジトリに含めておけば、新しいメンバーがジョインしたとき git clone → docker compose up だけで開発環境が完成します。「セットアップに丸一日かかる」というのが過去のものになります。
ユースケース2:CI/CDパイプライン
GitHub ActionsなどのCIでDockerイメージをビルドし、テストを実行し、合格したらデプロイするという流れが主流です。同じイメージが開発からテスト、本番まで一貫して使われるため、環境差分によるバグが激減します。
ユースケース3:マイクロサービス
アプリケーションを小さなサービスに分割し、それぞれを独立したコンテナとして動かすマイクロサービスアーキテクチャは、Dockerなしには成り立ちません。
まとめ:Dockerは「一度覚えればずっと使える」スキル
Dockerのポイントを振り返りましょう。
- コンテナはアプリ+環境をパッケージングする軽量な仮想化技術
- Dockerfileでイメージの作り方を定義し、docker-composeで複数サービスを管理
- **「どの環境でも同じように動く」**ことが最大のメリット
- インストールはDocker Desktop一発で完了
- 実務では環境統一・CI/CD・マイクロサービスで活躍
最初は覚えることが多く感じるかもしれませんが、基本コマンドは10個程度です。まずは docker run でコンテナを動かすところから始めて、次にDockerfileを書いてみて、最後にdocker-composeで複数サービスを立ち上げる——この3ステップを踏めば、Dockerの基本は身に付きます。
一度覚えてしまえば、どんなプロジェクトでも使える普遍的なスキルですので、ぜひ今日から手を動かしてみてください。