T-CREATOR

Cursor × Docker:環境構築からアプリ開発までの最短ルート

Cursor × Docker:環境構築からアプリ開発までの最短ルート

現代の開発現場では、プロジェクトのセットアップに膨大な時間を費やしてしまうことが珍しくありません。依存関係の管理、環境差異の解決、チームメンバー間での設定統一など、開発に取り掛かる前の準備だけで一日が終わってしまうこともあるでしょう。

そんな課題を一気に解決してくれるのが、AI 支援エディタ「Cursor」とコンテナ技術「Docker」の組み合わせです。この記事では、初心者の方でも迷うことなく環境構築からアプリ開発まで進められる最短ルートをご紹介します。

従来の手動設定から脱却し、AI の力を借りながら効率的に開発環境を整える方法を、具体的な手順とともに解説いたします。

背景

従来の開発環境構築の問題点

これまでの開発環境構築には、多くの開発者が頭を悩ませる問題がありました。特に深刻なのは以下の 3 点です。

まず、環境依存による問題が挙げられます。Windows、macOS、Linux といった異なるオペレーティングシステムでは、同じソフトウェアでも動作が微妙に異なることがあります。また、Python のバージョン違いや Node.js の環境差異により、「私の環境では動くのに」という状況が頻繁に発生していました。

次に、複雑な依存関係の管理です。モダンなアプリケーション開発では、数十から数百のライブラリやパッケージを組み合わせることが一般的になっています。これらの依存関係を手動で管理することは、非常に煩雑で時間のかかる作業となります。

最後に、新メンバーのオンボーディング時間の長さです。新しいチームメンバーが参加する際、開発環境の構築だけで数日から一週間かかってしまうケースも珍しくありませんでした。

Cursor の AI 支援開発の特徴

Cursor は、ChatGPT の技術をベースにした革新的な AI 支援エディタです。従来のコードエディタとは一線を画す特徴を持っています。

最大の特徴は、自然言語でのコード生成能力です。「ログイン機能を作って」「エラーハンドリングを追加して」といった日本語の指示から、適切なコードを自動生成してくれます。これにより、複雑な構文を覚える必要がなく、アイデアを直接コードに変換できるようになります。

また、コンテキストを理解した提案機能も優れています。プロジェクト全体のファイル構成や既存のコードパターンを学習し、一貫性のある修正や追加を提案してくれます。

さらに、リアルタイムでのエラー検出と修正提案により、開発中のデバッグ時間を大幅に短縮できます。

以下の図は、Cursor の AI 支援開発フローを示しています。

mermaidflowchart LR
  user[開発者] -->|自然言語で指示| cursor[Cursor AI]
  cursor -->|コード生成| editor[エディタ]
  editor -->|リアルタイム解析| ai_check[AI チェック]
  ai_check -->|修正提案| cursor
  cursor -->|最適化されたコード| user

このフローにより、従来の「調べる → 書く → テストする → 修正する」のサイクルが「指示する → 確認する → 完了」へと劇的に短縮されます。

Docker によるコンテナ化の利点

Docker は、アプリケーションとその実行環境を一つのパッケージにまとめる「コンテナ化」技術です。開発環境構築における革命的な解決策として注目されています。

環境の完全な再現性が最大の利点です。Docker コンテナは、どのマシンで実行しても全く同じ環境を提供します。開発者のローカル環境、テスト環境、本番環境すべてで同一の動作を保証できるのです。

軽量で高速な起動も重要なポイントです。仮想マシンと比較して、Docker コンテナは必要最小限のリソースで動作し、秒単位での起動が可能です。

また、バージョン管理との親和性により、環境設定もコードと同様に Git で管理できます。インフラストラクチャをコードとして扱う「Infrastructure as Code」の実現が容易になります。

課題

環境差異による開発の非効率性

開発チームが直面する最も深刻な問題の一つが、環境差異による非効率性です。この問題は、プロジェクトの規模が大きくなるほど深刻になります。

開発者間の環境違いが引き起こす問題は多岐にわたります。例えば、Mac ユーザーと Windows ユーザーが混在するチームでは、パスの区切り文字(​/​ vs \)の違いだけでもエラーの原因となります。さらに、OS の違いによるファイルシステムの動作差異や、デフォルトでインストールされているソフトウェアの違いなども影響します。

バージョン管理の複雑さも大きな課題です。Node.js のバージョン 12 で開発されたアプリケーションが、バージョン 18 の環境では予期しない動作をすることがあります。Python 開発では、2 系と 3 系の違いや、さらに細かなマイナーバージョンの差異が問題となることも珍しくありません。

これらの問題により、デバッグ時間の増大生産性の低下が発生します。「なぜこのエラーが出るのか」を調べるだけで数時間を費やし、結果的に環境固有の問題だったということも頻繁に起こります。

複雑な依存関係の管理

現代のソフトウェア開発では、外部ライブラリやフレームワークに大きく依存しています。これらの依存関係の管理は、プロジェクトが成長するにつれて複雑化していきます。

依存関係の競合は頻繁に発生する問題です。ライブラリ A がライブラリ C のバージョン 1.0 を要求し、ライブラリ B がライブラリ C のバージョン 2.0 を要求する場合、どちらを選択すべきか判断が困難になります。

セキュリティ脆弱性の管理も重要な課題です。使用しているライブラリに脆弱性が発見された場合、影響範囲の特定とアップデート作業が必要になります。しかし、アップデートによって他の部分に影響が出る可能性もあり、慎重な検証が求められます。

以下の図は、典型的な依存関係の複雑さを表しています。

mermaidgraph TD
  app[メインアプリ] --> react[React 18.2]
  app --> express[Express 4.18]
  app --> db[MongoDB Driver 4.15]

  react --> babel[Babel 7.22]
  react --> webpack[Webpack 5.88]
  express --> cors[CORS 2.8]
  express --> helmet[Helmet 7.0]

  babel --> core[Babel Core 7.22]
  webpack --> terser[Terser 5.19]

  style app fill:#e1f5fe
  style react fill:#fff3e0
  style express fill:#f3e5f5
  style db fill:#e8f5e8

この複雑な依存関係を手動で管理することは現実的ではなく、自動化された解決策が必要です。

チーム開発での環境統一の困難

チーム開発において環境を統一することは、技術的な課題を超えた組織的な課題でもあります。

新メンバーのオンボーディング時間は、プロジェクトの生産性に直接影響します。熟練の開発者でも、新しいプロジェクトの環境構築に数日かかることは珍しくありません。新人の場合は、さらに時間がかかる可能性があります。

環境設定の属人化も深刻な問題です。「この設定は田中さんしか知らない」「山田さんのマシンでしか動かない」といった状況は、チームの持続可能性を脅かします。

ドキュメント管理の負担も軽視できません。環境構築手順書の作成・更新・メンテナンスには相当な時間と労力が必要です。しかも、手順書が更新されずに古い情報のままになっていることも多く、結果的に役に立たないドキュメントになってしまうケースも見受けられます。

解決策

Cursor + Docker による統合開発環境

Cursor と Docker を組み合わせることで、これまでの課題を根本的に解決できます。この組み合わせの核となるのは、一貫性のある開発体験の実現です。

AI 支援による効率化環境の標準化を同時に実現できることが最大のメリットです。Cursor の AI 機能により、Docker 設定ファイルの作成や最適化を自然言語の指示で行えます。「Node.js 18 と PostgreSQL を使う開発環境を作って」という指示だけで、適切な設定ファイルが生成されるのです。

学習コストの大幅削減も重要なポイントです。従来は Dockerfile の書き方、docker-compose.yml の設定方法、各種コマンドの使い方など、多くの知識が必要でした。しかし、Cursor の支援により、初心者でも迷うことなく適切な設定を行えるようになります。

以下の図は、Cursor + Docker の統合開発環境の全体像を示しています。

mermaidflowchart TB
  cursor[Cursor エディタ] --> ai[AI アシスタント]
  ai --> dockerfile[Dockerfile 生成]
  ai --> compose[docker-compose.yml 生成]
  ai --> config[設定ファイル最適化]

  dockerfile --> container[Docker コンテナ]
  compose --> container
  config --> container

  container --> app[アプリケーション実行環境]
  container --> db[データベース環境]
  container --> tools[開発ツール環境]

  app --> output[統一された実行結果]
  db --> output
  tools --> output

  style cursor fill:#4fc3f7
  style ai fill:#66bb6a
  style container fill:#ff7043
  style output fill:#ab47bc

この統合環境により、開発者は技術的な設定に時間を取られることなく、本来の開発作業に集中できるようになります。

Dev Container の活用方法

Dev Container は、VS Code(および Cursor)の機能の一つで、開発環境をコンテナ内で構築・実行する仕組みです。Cursor との組み合わせにより、さらに強力な開発環境を構築できます。

設定ファイルの自動生成が Dev Container の大きな利点です。.devcontainer​/​devcontainer.json ファイルに必要な設定を記述するだけで、完全な開発環境が自動的に構築されます。Cursor の AI 機能を使えば、このファイルも自然言語の指示から生成可能です。

拡張機能の統一管理も重要な機能です。チーム全体で使用する拡張機能を設定ファイルで管理することで、全員が同じ開発体験を得られます。リンター、フォーマッター、デバッガーなどの設定も含めて統一できるのです。

ポートフォワーディングの自動設定により、コンテナ内で動作するアプリケーションに簡単にアクセスできます。ローカルホストからのアクセスと同様の感覚で開発を進められます。

典型的な Dev Container の構成例を以下に示します。

json{
  "name": "Node.js & TypeScript 開発環境",
  "image": "mcr.microsoft.com/devcontainers/typescript-node:18",
  "features": {
    "ghcr.io/devcontainers/features/docker-in-docker:2": {}
  },
  "customizations": {
    "vscode": {
      "extensions": [
        "esbenp.prettier-vscode",
        "dbaeumer.vscode-eslint",
        "ms-vscode.vscode-typescript-next"
      ]
    }
  },
  "forwardPorts": [3000, 5432],
  "postCreateCommand": "yarn install"
}

この設定により、Node.js 18、TypeScript、必要な拡張機能がすべて含まれた統一された開発環境が自動的に構築されます。

AI 支援による効率的な設定

Cursor の AI 機能を活用することで、従来は専門知識が必要だった Docker や Dev Container の設定を、誰でも簡単に行えるようになります。

自然言語からの設定生成が最も革新的な機能です。「React と Express を使うフルスタックアプリの開発環境を作りたい。データベースは PostgreSQL を使う予定」という指示から、適切な Dockerfile、docker-compose.yml、devcontainer.json がすべて生成されます。

ベストプラクティスの自動適用も重要な利点です。AI は最新のセキュリティ対策、パフォーマンス最適化、保守性の向上などを考慮した設定を提案してくれます。手動で設定する場合に見落としがちな重要な設定も自動的に含まれます。

継続的な最適化提案により、プロジェクトの成長に合わせて設定を改善していけます。新しいライブラリの追加、パフォーマンス要件の変更、セキュリティ要件の更新などに応じて、AI が適切な修正を提案してくれるのです。

具体例

基本環境構築

実際に Cursor と Docker を組み合わせた開発環境を構築してみましょう。ここでは、初心者の方でも迷うことなく進められるよう、ステップバイステップで解説いたします。

Docker Desktop のインストール

まず、Docker Desktop をインストールします。これは最も重要な基盤となる部分です。

Windows の場合Docker Desktop for Windows から最新版をダウンロードし、インストーラーを実行します。WSL 2 バックエンドを有効にすることを強く推奨します。

macOS の場合Docker Desktop for Mac から、お使いの Mac に対応したバージョン(Intel チップまたは Apple シリコン)をダウンロードしてインストールします。

Linux の場合: ディストリビューションに応じたインストール手順に従ってください。

インストール完了後、ターミナルで以下のコマンドを実行して動作確認を行います。

bash# Docker のバージョン確認
docker --version

# 簡単なテストコンテナの実行
docker run hello-world

「Hello from Docker!」のメッセージが表示されれば、インストールは成功です。

Cursor のセットアップ

次に、Cursor をセットアップします。公式サイトからダウンロードしてインストールしてください。

初回起動時に重要な設定を行います。

API キーの設定: Cursor の AI 機能を使用するために、OpenAI API キーまたは Cursor Pro のサブスクリプションが必要です。Settings から API 設定を行ってください。

Dev Container 拡張機能の確認: Cursor には Dev Container 機能が標準で含まれていますが、念のため拡張機能が有効になっていることを確認します。

bash# Cursor でプロジェクトフォルダを開く
mkdir my-cursor-docker-project
cd my-cursor-docker-project
cursor .

初回プロジェクト作成

実際にプロジェクトを作成して、基本的な設定を行ってみましょう。

Cursor を開いた状態で、Ctrl+Shift+P(Mac では Cmd+Shift+P)を押してコマンドパレットを開き、「Dev Containers: Add Dev Container Configuration Files」を選択します。

テンプレート選択画面で「Node.js & TypeScript」を選択すると、基本的な設定ファイルが自動生成されます。

生成されるファイル構成は以下のようになります。

arduinomy-cursor-docker-project/
├── .devcontainer/
│   └── devcontainer.json
├── .gitignore
└── README.md

この時点で、Cursor の AI 機能を使って設定をカスタマイズできます。チャット機能(Ctrl+L または Cmd+L)を開いて、以下のように指示してみてください。

「この開発環境に PostgreSQL データベースと Redis を追加して、ポート 3000 で Web サーバーが動くように設定してください」

AI が適切な docker-compose.yml ファイルと更新された devcontainer.json を提案してくれるはずです。

実践:Node.js アプリ開発

基本的な環境構築ができたら、実際に Node.js アプリケーションを開発してみましょう。ここでは、簡単な API サーバーとフロントエンドを含むフルスタックアプリケーションを作成します。

Dockerfile の作成

まず、アプリケーション用の Dockerfile を作成します。Cursor の AI 機能を活用すると、以下のような指示で適切な Dockerfile が生成されます。

Cursor のチャット機能で「Node.js 18 を使った本番用の Dockerfile を作成してください。Express アプリケーション用で、セキュリティとパフォーマンスを考慮した設定にしてください」と入力します。

生成される Dockerfile の例:

dockerfile# マルチステージビルドを使用
FROM node:18-alpine AS builder

# セキュリティ:非rootユーザーの作成
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

# 作業ディレクトリの設定
WORKDIR /app

# 依存関係のインストール(キャッシュ効率化)
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

# アプリケーションコードのコピー
COPY . .

# 非rootユーザーに所有権を変更
RUN chown -R nextjs:nodejs /app
USER nextjs

# アプリケーションのビルド
RUN npm run build

# 本番用ステージ
FROM node:18-alpine AS production

RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

WORKDIR /app

# 必要なファイルのみコピー
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=nextjs:nodejs /app/dist ./dist
COPY --from=builder --chown=nextjs:nodejs /app/package*.json ./

USER nextjs

# ヘルスチェックの設定
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

EXPOSE 3000

CMD ["npm", "start"]

この Dockerfile には、セキュリティ対策(非 root ユーザーの使用)、パフォーマンス最適化(マルチステージビルド)、運用面の考慮(ヘルスチェック)が含まれています。

docker-compose.yml の設定

次に、複数のサービスを組み合わせた開発環境を構築するために docker-compose.yml を作成します。

Cursor の AI 機能に「Node.js API サーバー、PostgreSQL データベース、Redis キャッシュ、nginx リバースプロキシを含む docker-compose.yml を作成してください」と指示します。

yamlversion: '3.8'

services:
  # API サーバー
  api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - '3001:3000'
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgresql://postgres:password@db:5432/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
    volumes:
      - .:/app
      - /app/node_modules
    command: npm run dev

  # PostgreSQL データベース
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    ports:
      - '5432:5432'
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

  # Redis キャッシュ
  redis:
    image: redis:7-alpine
    ports:
      - '6379:6379'
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

  # nginx リバースプロキシ
  nginx:
    image: nginx:alpine
    ports:
      - '80:80'
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - api

volumes:
  postgres_data:
  redis_data:

この設定により、完全なフルスタック開発環境が構築されます。各サービスは適切に連携し、開発時に必要な機能がすべて含まれています。

Cursor での開発フロー

実際の開発フローを体験してみましょう。Cursor の AI 機能を最大限活用した効率的な開発手順をご紹介します。

1. プロジェクトの初期化

bash# 開発環境の起動
docker-compose up -d

# Cursor で Dev Container を開く
# Ctrl+Shift+P → "Dev Containers: Reopen in Container"

2. API エンドポイントの作成

Cursor のチャット機能で以下のように指示します:

「Express サーバーでユーザー管理 API を作成してください。PostgreSQL に接続し、CRUD 操作ができるようにしてください。バリデーション、エラーハンドリング、ログ出力も含めてください」

AI が生成するコードの例:

javascript// server.js - Express サーバーの基本設定
const express = require('express');
const { Pool } = require('pg');
const cors = require('cors');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');

const app = express();
const port = process.env.PORT || 3000;

// セキュリティミドルウェア
app.use(helmet());
app.use(cors());

// レート制限
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分
  max: 100, // リクエスト数制限
});
app.use(limiter);

app.use(express.json());

// データベース接続設定
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});

// ヘルスチェックエンドポイント
app.get('/health', (req, res) => {
  res.status(200).json({
    status: 'OK',
    timestamp: new Date().toISOString(),
  });
});

module.exports = { app, pool };

3. データベースモデルの実装

javascript// models/User.js - ユーザーモデル
const { pool } = require('../server');

class User {
  // ユーザー作成
  static async create(userData) {
    const { name, email, password } = userData;
    try {
      const result = await pool.query(
        'INSERT INTO users (name, email, password_hash, created_at) VALUES ($1, $2, $3, NOW()) RETURNING id, name, email, created_at',
        [name, email, password] // 実際の実装ではハッシュ化が必要
      );
      return result.rows[0];
    } catch (error) {
      throw new Error(
        `ユーザー作成エラー: ${error.message}`
      );
    }
  }

  // ユーザー取得
  static async findById(id) {
    try {
      const result = await pool.query(
        'SELECT id, name, email, created_at FROM users WHERE id = $1',
        [id]
      );
      return result.rows[0] || null;
    } catch (error) {
      throw new Error(
        `ユーザー取得エラー: ${error.message}`
      );
    }
  }

  // ユーザー一覧取得
  static async findAll(limit = 10, offset = 0) {
    try {
      const result = await pool.query(
        'SELECT id, name, email, created_at FROM users ORDER BY created_at DESC LIMIT $1 OFFSET $2',
        [limit, offset]
      );
      return result.rows;
    } catch (error) {
      throw new Error(
        `ユーザー一覧取得エラー: ${error.message}`
      );
    }
  }
}

module.exports = User;

4. API ルーターの実装

javascript// routes/users.js - ユーザー関連のルート
const express = require('express');
const User = require('../models/User');
const {
  body,
  validationResult,
} = require('express-validator');

const router = express.Router();

// バリデーションルール
const userValidation = [
  body('name')
    .trim()
    .isLength({ min: 1, max: 100 })
    .withMessage('名前は1〜100文字で入力してください'),
  body('email')
    .isEmail()
    .normalizeEmail()
    .withMessage('有効なメールアドレスを入力してください'),
  body('password')
    .isLength({ min: 8 })
    .withMessage('パスワードは8文字以上で入力してください'),
];

// ユーザー作成
router.post('/', userValidation, async (req, res) => {
  try {
    // バリデーション結果の確認
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({
        error: 'バリデーションエラー',
        details: errors.array(),
      });
    }

    const user = await User.create(req.body);
    res.status(201).json({
      message: 'ユーザーが正常に作成されました',
      user,
    });
  } catch (error) {
    console.error('ユーザー作成エラー:', error);
    res.status(500).json({
      error: 'サーバーエラーが発生しました',
    });
  }
});

// ユーザー取得
router.get('/:id', async (req, res) => {
  try {
    const user = await User.findById(req.params.id);
    if (!user) {
      return res.status(404).json({
        error: 'ユーザーが見つかりません',
      });
    }
    res.json({ user });
  } catch (error) {
    console.error('ユーザー取得エラー:', error);
    res.status(500).json({
      error: 'サーバーエラーが発生しました',
    });
  }
});

module.exports = router;

この開発フローにより、従来であれば数時間かかっていた基本的な API 実装が、わずか数十分で完了します。Cursor の AI 機能が、ベストプラクティスに従ったコードを自動生成してくれるためです。

高度な活用

基本的な開発環境が整ったら、より高度な機能を活用して本格的なアプリケーション開発を行いましょう。

マルチステージビルド

本番環境を見据えた効率的なコンテナイメージの作成には、マルチステージビルドが重要です。Cursor の AI 機能を使って、最適化された Dockerfile を作成してみましょう。

「本番環境用の最適化されたマルチステージ Dockerfile を作成してください。セキュリティ、パフォーマンス、イメージサイズの最小化を考慮してください」という指示で、以下のような高度な Dockerfile が生成されます。

dockerfile# ====================================
# ステージ1: 依存関係のインストール
# ====================================
FROM node:18-alpine AS dependencies

# セキュリティ:パッケージの更新
RUN apk update && apk upgrade && apk add --no-cache dumb-init

# 作業ディレクトリの設定
WORKDIR /app

# package.json と package-lock.json のコピー
COPY package*.json ./

# 本番用依存関係のインストール
RUN npm ci --only=production && npm cache clean --force

# ====================================
# ステージ2: アプリケーションのビルド
# ====================================
FROM node:18-alpine AS builder

WORKDIR /app

# 開発用依存関係も含めてインストール
COPY package*.json ./
RUN npm ci

# ソースコードのコピー
COPY . .

# TypeScript のビルド
RUN npm run build

# テストの実行(ビルド時にテストを実行)
RUN npm test

# ====================================
# ステージ3: 本番用ランタイム
# ====================================
FROM node:18-alpine AS production

# セキュリティ:非rootユーザーの作成
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nextjs -u 1001 -G nodejs

# 必要なパッケージのインストール
RUN apk add --no-cache dumb-init curl

WORKDIR /app

# 本番用依存関係のコピー
COPY --from=dependencies --chown=nextjs:nodejs /app/node_modules ./node_modules

# ビルド済みアプリケーションのコピー
COPY --from=builder --chown=nextjs:nodejs /app/dist ./dist

# package.json のコピー
COPY --chown=nextjs:nodejs package*.json ./

# 非rootユーザーに切り替え
USER nextjs

# ヘルスチェックの設定
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

# ポートの公開
EXPOSE 3000

# dumb-init を使用してアプリケーションを起動
ENTRYPOINT ["dumb-init", "--"]
CMD ["npm", "start"]

このマルチステージビルドにより、最終的なイメージサイズは大幅に削減され、セキュリティも向上します。

開発・本番環境の分離

環境ごとに適切な設定を使い分けることで、より安全で効率的な開発が可能になります。

環境別の docker-compose 設定

開発環境用の設定(docker-compose.dev.yml):

yamlversion: '3.8'

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
      - LOG_LEVEL=debug
    command: npm run dev

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: myapp_dev
      POSTGRES_USER: dev_user
      POSTGRES_PASSWORD: dev_password
    ports:
      - '5432:5432'

本番環境用の設定(docker-compose.prod.yml):

yamlversion: '3.8'

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
      target: production
    environment:
      - NODE_ENV=production
      - LOG_LEVEL=warn
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: myapp_prod
      POSTGRES_USER: prod_user
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_password
    volumes:
      - postgres_prod_data:/var/lib/postgresql/data

secrets:
  db_password:
    file: ./secrets/db_password.txt

volumes:
  postgres_prod_data:
    driver: local

環境変数の管理

Cursor の AI 機能を使って、安全な環境変数管理の仕組みを作成します。

javascript// config/environment.js - 環境設定の管理
const dotenv = require('dotenv');
const Joi = require('joi');

// 環境に応じた.envファイルの読み込み
const envFile =
  process.env.NODE_ENV === 'production'
    ? '.env.production'
    : '.env.development';
dotenv.config({ path: envFile });

// 環境変数のバリデーションスキーマ
const envSchema = Joi.object({
  NODE_ENV: Joi.string()
    .valid('development', 'test', 'production')
    .default('development'),
  PORT: Joi.number().port().default(3000),
  DATABASE_URL: Joi.string().uri().required(),
  REDIS_URL: Joi.string().uri().required(),
  JWT_SECRET: Joi.string().min(32).required(),
  LOG_LEVEL: Joi.string()
    .valid('error', 'warn', 'info', 'debug')
    .default('info'),
  API_RATE_LIMIT: Joi.number()
    .integer()
    .min(1)
    .default(100),
}).unknown();

// 環境変数の検証
const { error, value: envVars } = envSchema.validate(
  process.env
);

if (error) {
  throw new Error(`環境変数の設定エラー: ${error.message}`);
}

module.exports = {
  env: envVars.NODE_ENV,
  port: envVars.PORT,
  database: {
    url: envVars.DATABASE_URL,
  },
  redis: {
    url: envVars.REDIS_URL,
  },
  jwt: {
    secret: envVars.JWT_SECRET,
  },
  logging: {
    level: envVars.LOG_LEVEL,
  },
  api: {
    rateLimit: envVars.API_RATE_LIMIT,
  },
};

CI/CD との連携

最後に、GitHub Actions を使用した CI/CD パイプラインを構築します。Cursor の AI 機能で「Docker を使用した Node.js アプリケーション用の GitHub Actions ワークフローを作成してください」と指示します。

yaml# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  # テストジョブ
  test:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: test_db
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432

      redis:
        image: redis:7
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 6379:6379

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linting
        run: npm run lint

      - name: Run type checking
        run: npm run type-check

      - name: Run tests
        run: npm test
        env:
          DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_db
          REDIS_URL: redis://localhost:6379

      - name: Run integration tests
        run: npm run test:integration
        env:
          DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_db
          REDIS_URL: redis://localhost:6379

  # Docker イメージのビルドとプッシュ
  build:
    needs: test
    runs-on: ubuntu-latest
    if: github.event_name == 'push'

    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=sha

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

  # 本番環境へのデプロイ(mainブランチのみ)
  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    environment: production

    steps:
      - name: Deploy to production
        run: |
          echo "本番環境へのデプロイを実行します"
          # 実際のデプロイコマンドをここに記述

この CI/CD パイプラインにより、コードの品質確保から本番環境へのデプロイまでが自動化されます。

以下の図は、完全な CI/CD フローを示しています。

mermaidflowchart LR
  code[コード変更] --> git[Git Push]
  git --> test[自動テスト実行]
  test --> build[Docker イメージビルド]
  build --> registry[イメージレジストリ]
  registry --> deploy[本番デプロイ]

  test --> |失敗| notify[通知]
  build --> |失敗| notify
  deploy --> |成功| monitor[監視開始]

  style code fill:#e3f2fd
  style test fill:#fff3e0
  style build fill:#f3e5f5
  style deploy fill:#e8f5e8

この統合されたフローにより、開発から運用まで一貫した品質管理が実現できます。

まとめ

導入効果の整理

Cursor と Docker を組み合わせた開発環境の導入により、以下のような大きな効果を得ることができました。

開発効率の向上では、従来数時間かかっていた環境構築が、わずか数分で完了するようになります。AI 支援による自動コード生成により、ボイラープレートコードの作成時間が大幅に短縮され、開発者は本来のビジネスロジックの実装に集中できるようになりました。

品質の向上も重要な効果です。Docker による環境の標準化により、「私の環境では動くのに」という問題が根本的に解決されます。また、Cursor の AI 機能がベストプラクティスに従ったコードを生成するため、一定の品質が保たれます。

学習コストの削減により、新しい技術スタックや複雑な設定に悩む時間が大幅に減りました。初心者でも迷うことなく、プロレベルの開発環境を構築できるようになります。

チーム生産性の向上では、統一された開発環境により、チームメンバー間での技術的な問題に関する議論が激減します。新メンバーのオンボーディング時間も従来の週単位から時間単位まで短縮されました。

運用面での安定性も大きな利点です。Docker による本番環境との整合性確保、CI/CD パイプラインによる自動化により、デプロイメントの安全性と信頼性が向上します。

これらの効果により、開発チーム全体の生産性が向上し、より価値のある機能開発に時間を投資できるようになりました。

今後の発展性

Cursor と Docker の組み合わせは、今後さらなる発展が期待できます。

AI 技術の進化により、より高度なコード生成や最適化提案が可能になるでしょう。将来的には、アプリケーション全体のアーキテクチャ設計からパフォーマンス最適化まで、AI がサポートしてくれる可能性があります。

クラウドネイティブ対応では、Kubernetes との連携、サーバーレス アーキテクチャへの拡張、マイクロサービス設計の自動化などが進むと予想されます。

開発・運用の統合(DevOps の強化)により、モニタリング、ログ管理、セキュリティ対策なども統合的に管理できるようになるでしょう。

新しい技術の迅速な採用も重要なポイントです。AI の支援により、新しいフレームワークやライブラリを素早く学習し、プロジェクトに導入できるようになります。

この技術の組み合わせは、現代の開発現場における課題を解決するだけでなく、未来の開発スタイルの基盤となることでしょう。継続的な学習と実践により、さらなる効率化と品質向上を実現していけます。

関連リンク

公式ドキュメント

技術情報・チュートリアル

コミュニティ・学習リソース