Docker入門|コンテナの仕組みとdocker runからdocker composeまで初心者向け解説
目次
Dockerが解決する問題
「自分のPCでは動くのに、本番サーバーでは動かない」という問題を、エンジニアなら一度は経験するでしょう。原因として多いのは以下のような環境の差異です。
- OSのバージョンが違う(macOS と Ubuntu)
- Node.jsのバージョンが違う(開発: v20 / 本番: v18)
- ライブラリのバージョンが違う
- 環境変数の設定漏れ
Dockerはこの問題を根本的に解決します。「コンテナ」という単位でアプリケーションと実行環境をまるごとパッケージ化することで、どのマシンでも同じ環境でアプリを動かせるようになります。
コンテナと仮想マシン(VM)の違い
よく比較される仮想マシン(VirtualBox、VMwareなど)とDockerコンテナの違いを理解しましょう。
| 比較項目 | 仮想マシン(VM) | Dockerコンテナ |
|---|---|---|
| 起動時間 | 数十秒〜数分 | 1秒以下 |
| ディスク容量 | 数GB〜数十GB | 数十MB〜数百MB |
| OSの持ち方 | ゲストOSを丸ごと含む | ホストOSのカーネルを共有 |
| 用途 | OS全体の隔離 | アプリの実行環境の隔離 |
仮想マシンはOS全体をエミュレートするため重く、起動も遅いです。一方Dockerコンテナはホストマシンのカーネルを共有するため非常に軽量で、起動も高速です。
Dockerの基本用語
イメージ(Image)
コンテナの「設計図」です。OSの種類、インストールするソフトウェア、設定ファイルなどが書かれた読み取り専用のテンプレートです。
Docker Hub(hub.docker.com)には公式イメージが多数公開されています。node:20-alpine(軽量Node.js環境)やpostgres:16(PostgreSQLデータベース)などがよく使われます。
コンテナ(Container)
イメージから作成した「実行中のインスタンス」です。同じイメージから複数のコンテナを起動することもできます。コンテナを停止・削除しても、イメージ自体は残ります。
Dockerfile
カスタムイメージを作るための設定ファイルです。ベースイメージの指定、パッケージのインストール、ファイルのコピーなどの手順を記述します。
レジストリ(Registry)
イメージを保存・配布する場所です。Docker Hubが最も有名ですが、GitHub Container Registry(ghcr.io)やAWSのECRなどもあります。
基本コマンド
docker pull — イメージを取得
docker pull node:20-alpine
# Docker HubからNode.js 20のAlpineイメージをダウンロード
docker run — コンテナを起動
# 基本的な起動
docker run node:20-alpine node --version
# ポートフォワードして起動(ホストの3000番 → コンテナの3000番)
docker run -p 3000:3000 node:20-alpine
# バックグラウンドで起動
docker run -d -p 5432:5432 --name my-postgres \
-e POSTGRES_PASSWORD=secret \
postgres:16
# ボリュームをマウントして起動(ホストのファイルを共有)
docker run -v $(pwd):/app -w /app node:20-alpine node index.js
docker ps — コンテナ一覧を表示
docker ps # 実行中のコンテナ一覧
docker ps -a # 停止中も含めた全コンテナ一覧
docker stop / rm — コンテナを停止・削除
docker stop my-postgres # コンテナを停止
docker rm my-postgres # コンテナを削除(停止後に実行)
docker rm -f my-postgres # 強制停止して削除
docker build — イメージをビルド
docker build -t my-app:1.0 .
# カレントディレクトリのDockerfileを使ってmy-app:1.0というイメージを作成
Dockerfileの書き方
Node.jsアプリのDockerfileの例を見てみましょう。
# ベースイメージを指定(Node.js 20のAlpine Linux版)
FROM node:20-alpine
# コンテナ内の作業ディレクトリを設定
WORKDIR /app
# package.jsonとpackage-lock.jsonをコピー(キャッシュ活用のため先にコピー)
COPY package*.json ./
# 依存パッケージをインストール(本番用のみ)
RUN npm ci --only=production
# アプリケーションのソースコードをコピー
COPY . .
# コンテナが公開するポート番号を宣言
EXPOSE 3000
# コンテナ起動時に実行するコマンド
CMD ["node", "server.js"]
Dockerfileのベストプラクティス:
COPY package*.json ./を先に行いRUN npm ciでインストールする(ソース変更時にキャッシュを有効活用)node_modulesは.dockerignoreに追加してコピー対象から除外する- 本番環境では
npm installではなくnpm ciを使う(再現性が高い)
docker-compose.ymlの基本
複数のコンテナを連携させる場合、docker-compose.ymlを使うと管理が楽になります。Node.js + PostgreSQLの構成を例に見てみましょう。
# docker-compose.yml
version: '3.9'
services:
# Node.jsアプリケーション
app:
build: . # カレントのDockerfileでビルド
ports:
- "3000:3000" # ホスト:コンテナのポートマッピング
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://postgres:secret@db:5432/mydb
volumes:
- .:/app # ホストのカレントディレクトリをマウント
- /app/node_modules # node_modulesはマウント対象外
depends_on:
db:
condition: service_healthy # DBのヘルスチェック後に起動
# PostgreSQLデータベース
db:
image: postgres:16
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data # データを永続化
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
# 名前付きボリューム(コンテナ削除後もデータを保持)
volumes:
postgres_data:
docker composeの主要コマンド
docker compose up # 全サービスを起動(フォアグラウンド)
docker compose up -d # バックグラウンドで起動
docker compose down # 全サービスを停止・削除
docker compose down -v # ボリュームも含めて削除
docker compose logs -f app # appサービスのログをリアルタイム表示
docker compose exec app sh # 実行中のappコンテナにシェルで入る
docker compose ps # サービスの状態を確認
.dockerignoreを設定する
.gitignoreと同様に、Dockerのビルドコンテキストから除外するファイルを指定します。
node_modules
.git
.env
dist
build
*.log
node_modulesをコピー対象に含めると、ホスト環境のバイナリがコンテナにコピーされて動作しないことがあります。必ず除外しましょう。
Docker/Kubernetes 実践コンテナ開発入門
Dockerの基礎からKubernetesによるオーケストレーションまで実践的に解説。現場で使える構成例が豊富に掲載されています。
※ アフィリエイトリンクを含みます
Udemy — Docker & Kubernetes: The Practical Guide
DockerとKubernetesをハンズオン形式で学べるベストセラー講座。実際のプロジェクトに即した内容で、環境構築から本番デプロイまで網羅。
※ アフィリエイトリンクを含みます
まとめ
Dockerの核心は「環境をコードで定義して再現可能にする」ことです。
- イメージ: コンテナの設計図(読み取り専用)
- コンテナ: イメージから作った実行インスタンス
- Dockerfile: カスタムイメージを作る設計書
- docker-compose.yml: 複数コンテナを定義・管理する設定ファイル
まずはdocker runで既存のイメージを動かすことから始め、慣れてきたら自前のDockerfileを書いてイメージをビルドしてみましょう。チーム開発でDockerを使えると、「環境が違う」という問題から解放されます。