1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SES現場で即戦力になるDocker開発環境構築スクリプト集【2026年版】

1
Posted at

SES現場で即戦力になるDocker開発環境構築スクリプト集【2026年版】

SES現場で新しいプロジェクトにジョインする際、開発環境のセットアップに時間を取られることは珍しくありません。プロジェクトごとに異なる技術スタック、バージョン違い、依存関係の複雑さ―これらの課題を解決するために、2026年現在多くのSES現場でDockerを活用した環境構築が標準化されています。

本記事では、SES現場で実際に使われている実践的なDockerスクリプト集を紹介し、新しい現場で最速で開発環境を構築できるテクニックを解説します。

SES現場でよくある開発環境の課題

環境構築の時間的コスト

SES現場では、プロジェクトの参画期間が限られているため、環境構築に時間をかけすぎることはできません。経済産業省の「IT人材需給に関する調査」(2026年版)によると、SES案件の平均参画期間は6.2ヶ月となっており、初期の環境構築フェーズを短縮することの重要性が増しています。

技術スタックの多様性

  • フロントエンド:React 18.x、Vue 3.x、Next.js 14.x
  • バックエンド:Node.js 20.x、Python 3.12、Java 21
  • データベース:PostgreSQL 16、MySQL 8.0、MongoDB 7.0
  • インフラ:AWS、Azure、GCP

よくある環境構築の問題

  1. バージョン不整合:ローカル環境とプロダクション環境のバージョン違い
  2. 依存関係の競合:複数プロジェクト間でのライブラリ競合
  3. OS差異:Windows、macOS、Linux間での動作違い
  4. 設定の属人化:個別に調整された設定の共有困難

Docker化による解決アプローチ

コンテナ化のメリット

  • 環境の標準化:開発・テスト・本番環境の一致
  • ポータビリティ:どのマシンでも同じ環境を再現
  • 分離:プロジェクト間の依存関係を分離
  • スケーラビリティ:必要に応じてリソースを調整

実践的Dockerスクリプト集

1. フルスタックWeb開発環境(React + Node.js + PostgreSQL)

SES現場で最も多く見かけるフルスタック構成の環境を、一つのコマンドで構築できるスクリプトです。

# docker-compose.yml
version: '3.8'

services:
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      - REACT_APP_API_URL=http://localhost:8000
    depends_on:
      - backend

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    volumes:
      - ./backend:/app
      - /app/node_modules
    environment:
      - DATABASE_URL=postgresql://postgres:password@db:5432/app_db
      - NODE_ENV=development
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      - POSTGRES_DB=app_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "5432:5432"

  redis:
    image: redis:7.2
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

2. 開発環境自動セットアップスクリプト

新しい現場にジョインした際、一つのコマンドで完全な開発環境を構築できるシェルスクリプトです。

#!/bin/bash
# setup-dev-env.sh - SES現場対応開発環境セットアップスクリプト

set -e  # エラー時に終了

echo "🚀 SES開発環境セットアップを開始します..."

# カラー出力の設定
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# プロジェクト情報の確認
read -p "プロジェクト名を入力してください: " PROJECT_NAME
read -p "使用する技術スタック (react/vue/next): " TECH_STACK
read -p "データベース (postgres/mysql/mongodb): " DATABASE

echo -e "${YELLOW}環境構築中...${NC}"

# ディレクトリ構造の作成
create_directory_structure() {
    echo "📁 ディレクトリ構造を作成中..."
    
    mkdir -p ${PROJECT_NAME}/{frontend,backend,database,scripts,docs}
    mkdir -p ${PROJECT_NAME}/docker/{nginx,redis}
    mkdir -p ${PROJECT_NAME}/.github/workflows
    
    echo -e "${GREEN}✅ ディレクトリ構造作成完了${NC}"
}

# Dockerファイルの生成
generate_dockerfiles() {
    echo "🐳 Dockerファイルを生成中..."
    
    # フロントエンド用Dockerfile
    cat > ${PROJECT_NAME}/frontend/Dockerfile << EOF
FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]
EOF

    # バックエンド用Dockerfile
    cat > ${PROJECT_NAME}/backend/Dockerfile << EOF
FROM node:20-alpine

WORKDIR /app

# 開発用ツールのインストール
RUN apk add --no-cache git

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 8000

CMD ["npm", "run", "dev"]
EOF

    echo -e "${GREEN}✅ Dockerfile生成完了${NC}"
}

# 開発用スクリプトの生成
generate_dev_scripts() {
    echo "📝 開発用スクリプトを生成中..."
    
    # 開発サーバー起動スクリプト
    cat > ${PROJECT_NAME}/scripts/dev.sh << 'EOF'
#!/bin/bash
echo "🚀 開発サーバーを起動しています..."
docker-compose up --build
EOF

    # テスト実行スクリプト
    cat > ${PROJECT_NAME}/scripts/test.sh << 'EOF'
#!/bin/bash
echo "🧪 テストを実行しています..."
docker-compose exec backend npm test
docker-compose exec frontend npm test
EOF

    # データベースマイグレーションスクリプト
    cat > ${PROJECT_NAME}/scripts/migrate.sh << 'EOF'
#!/bin/bash
echo "🗄️ データベースマイグレーションを実行しています..."
docker-compose exec backend npm run migrate
EOF

    chmod +x ${PROJECT_NAME}/scripts/*.sh
    echo -e "${GREEN}✅ 開発用スクリプト生成完了${NC}"
}

# 環境変数ファイルの生成
generate_env_files() {
    echo "🔧 環境変数ファイルを生成中..."
    
    cat > ${PROJECT_NAME}/.env << EOF
# プロジェクト設定
PROJECT_NAME=${PROJECT_NAME}
NODE_ENV=development

# データベース設定
DB_HOST=db
DB_PORT=5432
DB_NAME=app_db
DB_USER=postgres
DB_PASSWORD=password

# Redis設定
REDIS_HOST=redis
REDIS_PORT=6379

# API設定
API_PORT=8000
API_URL=http://localhost:8000

# フロントエンド設定
REACT_APP_API_URL=http://localhost:8000
PORT=3000
EOF

    echo -e "${GREEN}✅ 環境変数ファイル生成完了${NC}"
}

# メイン処理の実行
main() {
    create_directory_structure
    generate_dockerfiles
    generate_dev_scripts
    generate_env_files
    
    cd ${PROJECT_NAME}
    
    echo -e "${GREEN}🎉 環境構築が完了しました!${NC}"
    echo -e "${YELLOW}次のステップ:${NC}"
    echo "1. cd ${PROJECT_NAME}"
    echo "2. ./scripts/dev.sh"
    echo "3. ブラウザで http://localhost:3000 にアクセス"
}

# スクリプト実行
main

3. マイクロサービス対応Docker Compose設定

大規模なSES案件でよく見られるマイクロサービス構成に対応したDocker Compose設定です。

# docker-compose.microservices.yml
version: '3.8'

services:
  # API Gateway
  api-gateway:
    image: nginx:1.25
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - user-service
      - product-service
      - order-service
    networks:
      - microservices-network

  # User Service
  user-service:
    build:
      context: ./services/user-service
      dockerfile: Dockerfile
    environment:
      - DATABASE_URL=postgresql://postgres:password@user-db:5432/user_db
      - REDIS_URL=redis://redis:6379/0
      - JWT_SECRET=your_jwt_secret_here
    depends_on:
      - user-db
      - redis
    networks:
      - microservices-network
    deploy:
      replicas: 2
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

  # Product Service
  product-service:
    build:
      context: ./services/product-service
      dockerfile: Dockerfile
    environment:
      - DATABASE_URL=postgresql://postgres:password@product-db:5432/product_db
      - ELASTICSEARCH_URL=http://elasticsearch:9200
    depends_on:
      - product-db
      - elasticsearch
    networks:
      - microservices-network
    deploy:
      replicas: 2

  # Order Service
  order-service:
    build:
      context: ./services/order-service
      dockerfile: Dockerfile
    environment:
      - DATABASE_URL=postgresql://postgres:password@order-db:5432/order_db
      - RABBITMQ_URL=amqp://rabbitmq:5672
    depends_on:
      - order-db
      - rabbitmq
    networks:
      - microservices-network

  # Databases
  user-db:
    image: postgres:16
    environment:
      - POSTGRES_DB=user_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
    volumes:
      - user_db_data:/var/lib/postgresql/data
    networks:
      - microservices-network

  product-db:
    image: postgres:16
    environment:
      - POSTGRES_DB=product_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
    volumes:
      - product_db_data:/var/lib/postgresql/data
    networks:
      - microservices-network

  order-db:
    image: postgres:16
    environment:
      - POSTGRES_DB=order_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
    volumes:
      - order_db_data:/var/lib/postgresql/data
    networks:
      - microservices-network

  # Infrastructure Services
  redis:
    image: redis:7.2
    volumes:
      - redis_data:/data
    networks:
      - microservices-network

  elasticsearch:
    image: elasticsearch:8.11.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    volumes:
      - elasticsearch_data:/usr/share/elasticsearch/data
    networks:
      - microservices-network

  rabbitmq:
    image: rabbitmq:3.12-management
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=password
    ports:
      - "15672:15672"  # Management UI
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq
    networks:
      - microservices-network

  # Monitoring
  prometheus:
    image: prom/prometheus:v2.48.0
    ports:
      - "9090:9090"
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    networks:
      - microservices-network

  grafana:
    image: grafana/grafana:10.2.0
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana_data:/var/lib/grafana
    networks:
      - microservices-network

volumes:
  user_db_data:
  product_db_data:
  order_db_data:
  redis_data:
  elasticsearch_data:
  rabbitmq_data:
  prometheus_data:
  grafana_data:

networks:
  microservices-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

応用パターンと実践テクニック

1. 環境固有の設定管理

SES現場では、開発・ステージング・本番環境で異なる設定が必要になることがよくあります。

# 環境別Docker Compose設定の管理

# 開発環境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

# ステージング環境
docker-compose -f docker-compose.yml -f docker-compose.staging.yml up

# 本番環境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

2. ヘルスチェックの実装

サービスの状態監視は、特に複数のサービスが連携するSES案件では重要です。

# healthcheck付きのサービス定義例
services:
  backend:
    build: ./backend
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

3. 開発効率を向上させるMakefile

よく使うDockerコマンドをMakefileにまとめることで、チーム全体の開発効率が向上します。

# Makefile
.PHONY: help build up down logs shell test clean

# デフォルトターゲット
help: ## このヘルプを表示
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

build: ## Dockerイメージをビルド
	docker-compose build

up: ## 開発サーバーを起動
	docker-compose up -d
	@echo "🚀 開発サーバーが起動しました"
	@echo "Frontend: http://localhost:3000"
	@echo "Backend API: http://localhost:8000"
	@echo "Database: localhost:5432"

down: ## サーバーを停止
	docker-compose down

logs: ## ログを表示
	docker-compose logs -f

shell-backend: ## バックエンドコンテナにシェル接続
	docker-compose exec backend sh

shell-frontend: ## フロントエンドコンテナにシェル接続
	docker-compose exec frontend sh

shell-db: ## データベースに接続
	docker-compose exec db psql -U postgres -d app_db

test: ## テストを実行
	docker-compose exec backend npm test
	docker-compose exec frontend npm test

migrate: ## データベースマイグレーション
	docker-compose exec backend npm run migrate

seed: ## テストデータを投入
	docker-compose exec backend npm run seed

clean: ## 未使用のDockerリソースを削除
	docker system prune -f
	docker volume prune -f

reset: ## 完全リセット(データも削除)
	docker-compose down -v
	docker-compose build --no-cache
	docker-compose up -d

monitor: ## システムリソースを監視
	docker stats

パフォーマンス最適化のポイント

1. マルチステージビルドの活用

本番環境のイメージサイズを削減し、セキュリティを向上させます。

# フロントエンド用マルチステージDockerfile
FROM node:20-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

# 本番用の軽量イメージ
FROM nginx:1.25-alpine AS production

COPY --from=builder /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

2. Dockerキャッシュの最適化

# 最適化されたDockerfile例
FROM node:20-alpine

WORKDIR /app

# 依存関係の情報を先にコピー(キャッシュ効率化)
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

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

# 不要なファイルを削除
RUN rm -rf /tmp/* /var/cache/apk/*

EXPOSE 8000

USER node

CMD ["node", "server.js"]

SES現場でのDocker活用のベストプラクティス

1. セキュリティの考慮

  • 本番環境では非rootユーザーでコンテナを実行
  • 機密情報は環境変数やSecretで管理
  • 定期的なベースイメージの更新

2. チーム協力の促進

  • 標準化されたディレクトリ構造
  • 分かりやすいREADME.mdの作成
  • Makefileによるコマンドの統一

3. トラブルシューティング

# よく使うデバッグコマンド

# コンテナの状態確認
docker-compose ps

# ログの確認
docker-compose logs -f [service_name]

# コンテナ内でのコマンド実行
docker-compose exec [service_name] sh

# ネットワークの確認
docker network ls
docker network inspect [network_name]

# ボリュームの確認
docker volume ls
docker volume inspect [volume_name]

まとめ

SES現場でのDocker活用は、2026年現在ますます重要になっています。本記事で紹介したスクリプト集を活用することで:

  • 環境構築時間の大幅短縮:従来の手動設定から自動化への移行
  • チーム間の設定統一:属人化の防止と知識共有の促進
  • プロジェクト間のポータビリティ向上:異なる現場でも同じ手法を適用可能
  • 運用の安定性向上:再現可能な環境構築による障害減少

SES業界のトレンドとして、Docker化されたプロジェクトの経験は市場価値を大きく向上させます。これらのテクニックを身につけることで、新しい現場でも即戦力として活躍できるでしょう。

今後もクラウドネイティブ技術の進歩とともに、SES現場でのコンテナ活用はさらに加速していくと予想されます。継続的な学習とスキルアップを心がけ、変化に対応できるエンジニアを目指しましょう。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?