「ローカルでは動いたのに、サーバーに上げたら動かない」——個人開発者なら誰もが一度は経験したことがあるでしょう。
Pythonのバージョン違い、Node.jsの互換性問題、データベースのセットアップミス……環境差異によるトラブルは開発者の時間を大量に奪います。
Dockerは、この問題を根本的に解決するツールです。アプリケーションとその実行環境を「コンテナ」という単位でパッケージ化し、どの環境でも同じように動作することを保証します。
この記事では、Dockerの基本概念から実践的な開発環境構築、VPSへのデプロイまでを、個人開発者目線で徹底解説します。「Dockerって聞いたことあるけど難しそう」と思っている人でも、読み終えたらすぐに使い始められる内容です。
この記事でわかること
- Dockerとコンテナの基本概念(仮想マシンとの違い)
- Docker Desktop / Docker Engine のインストールと初期設定
- Docker Composeを使ったマルチコンテナ開発環境の構築
- Node.js / Python / PostgreSQLのコンテナ化実践例
- マルチステージビルドで本番用イメージを最適化
- VPSにDocker環境を構築してアプリをデプロイする方法
Dockerとは何か|コンテナと仮想マシンの違い
Dockerは、アプリケーションを「コンテナ」という軽量な隔離環境で実行するためのプラットフォームです。コンテナは仮想マシン(VM)とよく比較されますが、以下の点で大きく異なります。
| 項目 | コンテナ(Docker) | 仮想マシン(VM) |
|---|---|---|
| 起動時間 | ミリ秒〜秒単位 | 数十秒〜分単位 |
| ディスク使用量 | MB〜数百MB | GB単位 |
| OSカーネル | ホストOSと共有 | ゲストOSごとに独立 |
| リソースオーバーヘッド | ほぼゼロ | 大きい(OS起動分) |
| 移植性 | 極めて高い(Dockerfile1枚) | やや低い(VMDK/OVA形式) |
個人開発者にとって重要なのは、コンテナは仮想マシンより圧倒的に軽量で操作がシンプルだという点です。開発環境を丸ごとコード化できるため、プロジェクトごとに環境を切り替えるのも一瞬です。
Dockerのインストール
2026年6月時点でのインストール方法をOS別に紹介します。
macOS
Apple Silicon(M1/M2/M3/M4)搭載MacでもIntel Macでも、Docker Desktop が最も簡単です。
# Homebrewでインストール(推奨)
brew install --cask docker
# アプリケーションフォルダからDockerを起動
open /Applications/Docker.app
最新のDocker DesktopはRosetta 2を必要とせず、ネイティブのApple Siliconバイナリで動作します。ホットリロードやファイル変更検知も従来より安定しました。
Linux(Ubuntu 24.04 LTS / 22.04 LTS)
個人開発でVPSを使うなら、LinuxへのDocker Engineインストールは必須スキルです。
# パッケージインデックスを更新
sudo apt update
# 必要なパッケージをインストール
sudo apt install -y ca-certificates curl
# Dockerの公式GPG鍵を追加
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# リポジトリを追加
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker Engine + Composeをインストール
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# ユーザーをdockerグループに追加(sudo不要に)
sudo usermod -aG docker $USER
# 一度ログアウトして再ログイン
Windows(WSL2)
Windows環境ではWSL2(Windows Subsystem for Linux)上でDockerを動かすのがデファクトスタンダードです。Docker Desktop for WindowsをインストールするとWSL2インテグレーションが有効になり、VS Codeからの操作もシームレスです。
広告
Dockerの基本操作を10分でマスター
インストールが完了したら、実際にコンテナを動かしてみましょう。以下のコマンドを順に実行するだけで、Dockerの基本が理解できます。
Hello World
# Dockerが正しくインストールされたか確認
docker --version
# → Docker version 27.x
# Hello Worldコンテナを実行
docker run hello-world
このコマンド1つで、Docker Hubから「hello-world」イメージがダウンロードされ、コンテナが起動してメッセージを表示した後に自動終了します。裏では以下のことが行われています。
docker runがローカルにイメージがないことを検知- 自動的にDocker Hubからイメージをプル
- コンテナを作成して起動
- メインプロセスが終了したらコンテナも停止
主要コマンド一覧
| コマンド | 説明 |
|---|---|
docker ps |
実行中のコンテナ一覧を表示 |
docker ps -a |
全てのコンテナ(停止中も含む)を表示 |
docker images |
ローカルに保存されたイメージ一覧 |
docker pull <image> |
イメージをダウンロード(実行はしない) |
docker run -d -p 3000:3000 <image> |
バックグラウンド起動しポートマッピング |
docker stop <container> |
コンテナを停止 |
docker rm <container> |
停止したコンテナを削除 |
docker rmi <image> |
イメージを削除 |
docker logs <container> |
コンテナのログを表示 |
docker exec -it <container> bash |
実行中のコンテナ内でシェルを開く |
Dockerfileの書き方|環境をコード化する
Dockerの真価は Dockerfile にあります。これは「どんな環境でアプリを動かすか」をコードとして記述する設計図です。
Node.js + ExpressアプリのDockerfile
まずは最もシンプルなNode.jsアプリをコンテナ化してみましょう。
# ベースイメージを指定(軽量なAlpine Linux版)
FROM node:22-alpine
# 作業ディレクトリを作成
WORKDIR /app
# package.json と lockファイルをコピー
COPY package*.json ./
# 依存関係をインストール(レイヤーキャッシュを活用)
RUN npm ci --only=production
# アプリケーションコードをコピー
COPY . .
# コンテナがリッスンするポートを指定(ドキュメント用)
EXPOSE 3000
# コンテナ起動時に実行するコマンド
CMD ["node", "server.js"]
ポイントは COPYの順序 です。package.jsonを先にコピーして npm ci を実行し、その後でアプリケーションコードをコピーしています。こうすることで、ソースコードだけ変更した場合でも依存関係のインストールはキャッシュが使われ、ビルドが高速になります。
.dockerignoreで無駄を省く
ソースコードのコピー時に node_modules や .git を含めないように、.dockerignore ファイルを作成します。
node_modules
.git
.gitignore
*.md
.env
.env.local
dist
.cache
ビルドと実行
# イメージをビルド
docker build -t my-app:latest .
# コンテナを起動(ポート3000をホストにマッピング)
docker run -d -p 3000:3000 --name my-app my-app:latest
# http://localhost:3000 にアクセスして確認
Docker Composeで開発環境を一発構築
実際の個人開発では、アプリケーションとデータベース(PostgreSQLやMySQL)など、複数のコンテナを連携させる必要があります。Docker Compose を使えば、複数コンテナの定義・起動・ネットワーク接続を1つのYAMLファイルで管理できます。
実践例:Node.js + PostgreSQL + Redis 開発環境
以下は、Webアプリ開発でよくある構成のComposeファイルです。
# docker-compose.yml
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/myapp
- REDIS_URL=redis://redis:6379
- NODE_ENV=development
volumes:
- .:/app
- /app/node_modules
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
develop:
watch:
- action: sync
path: ./
target: /app
ignore:
- node_modules/
- .git/
- action: rebuild
path: package.json
db:
image: postgres:17-alpine
ports:
- "5432:5432"
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
interval: 5s
retries: 5
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redisdata:/data
volumes:
pgdata:
redisdata:
このComposeファイルで特筆すべきポイントを解説します。
- volumesマウント —
.:/appでホストのソースコードをコンテナにマウント。ローカルで編集した変更が即座にコンテナ内に反映されます - depends_on + healthcheck — データベースの準備が整ってからアプリを起動するよう制御。起動順の競合を防止します
- develop.watch — Docker Compose Watch機能(Docker Desktop 4.30+)。ファイル変更を検知して自動的にホットリロード。従来のnodemonに相当します
- 名前付きボリューム — DBやRedisのデータを永続化。コンテナを再作成してもデータが消えません
# 一発起動
docker compose up -d
# ログを確認
docker compose logs -f app
# 停止してクリーンアップ
docker compose down -v
docker compose up -d の1コマンドで、アプリケーション・PostgreSQL・Redisの3つのコンテナが起動し、互いに通信できる状態になります。環境構築にかかる時間が 数時間から30秒 に短縮される感覚は、一度体験すればやめられません。
広告
Python + PostgreSQLの開発環境も同様に
Pythonで機械学習やAPI開発をする場合も、Docker Composeは同じように使えます。
# docker-compose.yml(Python版)
services:
api:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/myapp
volumes:
- .:/app
- /app/__pycache__
command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload
depends_on:
db:
condition: service_healthy
db:
image: postgres:17-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
interval: 5s
retries: 5
volumes:
pgdata:
FastAPIやDjangoの開発でも同じパターンでOKです。requirements.txt を先にコピーしてpip installするなど、Node.jsの場合と同様にレイヤーキャッシュを意識したDockerfileを書くことで、ビルド時間を最小化できます。
マルチステージビルドで本番用イメージを軽量化
開発環境ではソースコードやビルドツールが必要ですが、本番環境では 実行バイナリだけ あれば十分です。マルチステージビルド を使うと、ビルド用の重い環境と実行用の軽い環境を分離できます。
例:TypeScript(Next.js)アプリの本番イメージ
# ---- ビルドステージ ----
FROM node:22-alpine AS builder
WORKDIR /build
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# ---- 実行ステージ ----
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
# ビルド成果物だけをコピー
COPY --from=builder /build/.next ./.next
COPY --from=builder /build/public ./public
COPY --from=builder /build/package*.json ./
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "node_modules/.bin/next", "start"]
この手法の効果は絶大です。ビルドステージではTypeScriptコンパイラやdevDependencies(数百MB)が含まれますが、実行ステージにはそれらが一切入りません。結果として、数百MBあったイメージが 50〜100MB程度 にまで縮小されます。
VPSにデプロイする際、イメージサイズが小さいほど転送が速くなり、ディスク使用量も節約できます。
VPSにDocker環境を構築してアプリをデプロイ
ローカルで開発したDockerアプリを、実際にインターネット上で公開するにはVPSが必要です。以下の手順でセットアップします。
ステップ1:VPSを契約してSSH接続
VPSは ConoHa VPS(月額880円〜)や XServer VPS(月額1,046円〜)が個人開発者に最適です。Ubuntu 24.04 LTSを選択し、SSHでログインします。
# VPSにSSH接続
ssh user@your-server-ip
ステップ2:Docker Engineをインストール
先ほど紹介したLinux用のインストール手順をそのまま実行します。Docker Composeプラグインも忘れずにインストールしてください。
ステップ3:GitHubからプロジェクトをclone
git clone https://github.com/your-username/your-project.git
cd your-project
ステップ4:Docker Composeで起動
# 環境変数ファイルを用意
cp .env.example .env
# .env を本番用の値に編集(DBパスワードなど)
# 起動
docker compose up -d
# 動作確認
docker compose ps
docker compose logs
ステップ5:リバースプロキシ(Nginx)でSSL対応
本番公開するなら、Nginx + Let's Encrypt(Certbot)でHTTPS化しましょう。
# nginx.conf をホストに作成してマウントするか、
# 別途nginxコンテナをComposeに追加してSSL終端する
# 最も簡単な方法:cloudflared tunnel で公開
# または npm(Node.jsプロキシ)を使う
筆者のおすすめは cloudflared tunnel です。DNS設定も自動化され、DDoS保護やCDNが無料でついてきます。SSL証明書の管理も不要で、個人開発者には理想的な選択肢です。
docker compose watch で爆速開発ループ
Docker Desktop 4.30以降(Docker Engine 27.0+)で利用できる docker compose watch は、2026年の開発体験を大きく変える機能です。
# compose.yml に develop セクションを書いたら、
# 以下のコマンドで監視を開始
docker compose watch
ファイルを保存するたびに、自動的にコンテナ内へ同期(sync)あるいはイメージ再ビルド(rebuild)が行われます。nodemonやts-node-devなどのホットリロードツールと組み合わせれば、コードを書いて保存してブラウザで確認する——そのサイクルがシームレスになります。
個人開発者は「待ち時間」を極限まで減らすことが生産性向上の鍵です。Docker Compose Watchは、そのための強力な武器です。
よくあるトラブルと解決策
Dockerを使い始めると、いくつかの典型的なトラブルに遭遇します。事前に対処法を知っておきましょう。
Permission denied(Linux)
# docker.sock のパーミッション問題
sudo usermod -aG docker $USER
# 一度ログアウトして再ログイン
ポートが競合する
# "port is already allocated" エラー
# 既存のコンテナがポートを使用中
docker ps # 競合するコンテナを確認
docker stop <container> # 停止する
# または別のポートにマッピング
# ports: "3001:3000" のようにホスト側ポートを変更
ディスク容量が足りない
# 未使用のコンテナ・イメージ・ボリュームを一掃
docker system prune -a --volumes
# または設定ファイルで上限を設定(Docker Desktop)
# Settings → Resources → Disk image size
コンテナ間の接続ができない
# サービス名で名前解決できているか確認
# docker compose 内では service名がホスト名になる
# 例:db というサービスなら ホスト名は "db"
# docker network ls でネットワーク一覧を確認
# docker network inspect <network> で詳細を確認
まとめ|Dockerで開発環境をコード化するメリット
Dockerを個人開発に導入することで得られるメリットを改めて整理します。
- ✅ 環境差異ゼロ — 「ローカルでは動いたのに」がなくなる。チーム開発でも認識のズレが発生しない
- ✅ 新規参入が一瞬 — READMEに「docker compose up -d」と書くだけで開発環境構築完了。セットアップ手順書が不要に
- ✅ 本番環境と同じ構成で開発 — ローカル・ステージング・本番で差異がないため、デプロイ時のトラブルが激減する
- ✅ プロジェクトの分離が完璧 — プロジェクトAにPython 3.12 + PostgreSQL 17、プロジェクトBにNode.js 22 + MySQL 8 — 同時に動かしても競合しない
- ✅ VPSへのデプロイが簡単 — Docker Composeさえあれば、どのVPSでも同じ手順でデプロイできる
Dockerの学習曲線は決して急ではありません。基本コマンド10個とDockerfile + Composeファイルの書き方を覚えれば、あとはすぐに使いこなせます。
最初の一歩として、まずは自分の開発中のプロジェクトにDockerfileを追加してみてください。「環境構築が苦痛」という感覚が、きっと変わります。
📘 あわせて読みたい
- ☁️ Cloudflare Pages vs Vercel vs Netlify 比較 — サーバーレスホスティングの選び方
- 🔧 GitHub Actionsで始めるCI/CD入門 — Dockerイメージの自動ビルド・デプロイ
- 🐘 Supabase完全ガイド — Docker Composeでのローカル開発と本番環境
- 📦 Tailwind CSS v4ガイド — Docker + Next.jsでデザイン実装