Skip to content

Dockerとは完全ガイド

Dockerは、コンテナ技術を使用してアプリケーションをパッケージ化し、どこでも同じように実行できるようにするツールです。実務で使える実装例とベストプラクティスを詳しく解説します。

Dockerは、アプリケーションとその依存関係をコンテナとしてパッケージ化し、どの環境でも同じように実行できるようにします。

開発環境
↓(Dockerイメージ)
本番環境(同じイメージで実行)

問題のある構成(Dockerなし):

Terminal window
# 問題: 環境依存の問題
# 開発環境: Node.js 18, PostgreSQL 14
# 本番環境: Node.js 16, PostgreSQL 13
# 問題点:
# 1. 環境の違いによるバグ
# 2. セットアップの手間
# 3. 依存関係の管理が困難
# 4. 再現性が低い

解決: Dockerによるコンテナ化

# 解決: Dockerfileで環境を定義
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
# メリット:
# 1. 環境の一貫性(どこでも同じ環境)
# 2. 簡単なセットアップ(docker run だけで起動)
# 3. 依存関係の管理(Dockerfileに記述)
# 4. 高い再現性(同じイメージで同じ結果)

2. コンテナと仮想マシンの違い

Section titled “2. コンテナと仮想マシンの違い”
物理サーバー
├─ ハイパーバイザー
│ ├─ VM1(OS + アプリ)
│ ├─ VM2(OS + アプリ)
│ └─ VM3(OS + アプリ)

特徴:

  • OS全体を仮想化
  • リソース消費が大きい
  • 起動が遅い(数分)
物理サーバー
├─ OS
│ ├─ コンテナ1(アプリのみ)
│ ├─ コンテナ2(アプリのみ)
│ └─ コンテナ3(アプリのみ)

特徴:

  • OSのカーネルを共有
  • リソース消費が小さい
  • 起動が速い(数秒)
項目仮想マシンコンテナ
起動時間数分数秒
リソース消費大きい小さい
分離レベル高い中程度
移植性中程度高い

イメージは、アプリケーションとその依存関係を含む読み取り専用のテンプレートです。

Terminal window
# イメージのビルド
docker build -t my-app:latest .
# イメージの一覧表示
docker images
# イメージの詳細確認
docker inspect my-app:latest
# イメージの削除
docker rmi my-app:latest
# 未使用のイメージを一括削除
docker image prune -a

コンテナは、イメージから作成された実行可能なインスタンスです。

Terminal window
# コンテナの起動
docker run -d -p 3000:3000 --name my-app my-app:latest
# コンテナの一覧表示
docker ps # 実行中
docker ps -a # すべて
# コンテナの停止
docker stop my-app
# コンテナの再起動
docker restart my-app
# コンテナの削除
docker rm my-app
# コンテナのログ確認
docker logs my-app
docker logs -f my-app # リアルタイム

Dockerfileは、イメージを構築するための手順を記述したファイルです。

# ベースイメージ
FROM node:18-alpine
# 作業ディレクトリの設定
WORKDIR /app
# 依存関係のインストール
COPY package*.json ./
RUN npm ci --only=production
# アプリケーションコードのコピー
COPY . .
# ポートの公開
EXPOSE 3000
# アプリケーションの起動
CMD ["npm", "start"]

Docker Hubは、Dockerイメージを共有・管理するためのクラウドサービスです。

Terminal window
# Docker Hubにログイン
docker login
# イメージにタグを付ける
docker tag my-app:latest username/my-app:latest
# イメージをプッシュ
docker push username/my-app:latest
Terminal window
# 公式イメージのプル
docker pull nginx:latest
# カスタムイメージのプル
docker pull username/my-app:latest
Terminal window
# プライベートレジストリの使用
docker pull registry.example.com/my-app:latest
# プライベートレジストリへのプッシュ
docker tag my-app:latest registry.example.com/my-app:latest
docker push registry.example.com/my-app:latest

Docker Composeは、複数のコンテナを定義し、管理するためのツールです。

docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/mydb
depends_on:
- db
db:
image: postgres:14-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Terminal window
# サービスの起動
docker-compose up -d
# サービスの停止
docker-compose down
# ログの確認
docker-compose logs -f
# サービスの再ビルド
docker-compose up -d --build

6. 実務でのベストプラクティス

Section titled “6. 実務でのベストプラクティス”
# 開発環境と本番環境で同じベースイメージを使用
FROM node:18-alpine
# 環境変数で動作を切り替え
ENV NODE_ENV=production

パターン2: イメージのタグ付け

Section titled “パターン2: イメージのタグ付け”
Terminal window
# バージョンタグ
docker build -t my-app:v1.0.0 .
# 最新タグ
docker build -t my-app:latest .
# 環境別タグ
docker build -t my-app:dev .
docker build -t my-app:staging .
docker build -t my-app:prod .

原因:

  • ポートが既に使用されている
  • 環境変数が設定されていない

解決策:

Terminal window
# ポートの使用状況を確認
lsof -i :3000
# 環境変数を確認
docker run -e DATABASE_URL=... my-app:latest
# ログを確認
docker logs my-app

問題2: イメージのビルドが遅い

Section titled “問題2: イメージのビルドが遅い”

原因:

  • キャッシュが効いていない
  • 不要なファイルをコピーしている

解決策:

# .dockerignoreファイルを作成
node_modules
.git
.env
*.log
# Dockerfileの最適化
# 依存関係のインストールを先に行う(キャッシュを活用)
COPY package*.json ./
RUN npm ci
COPY . .

これで、Dockerの基礎知識と実務での使い方を理解できるようになりました。