mcpField
D
docker-local

docker-local

github.com/madsnorgaardクラウド・DevOps49103 回インストール6 週間前に更新
リポジトリ

docker-local について

docker-local は、DDEV 以外の Docker Compose を使うローカル開発向けスキルで、Drupal に重点を置いています。環境の起動、設定、トラブルシューティングに使うコマンドや手順をまとめています。

主な機能

  1. 01Docker Compose 環境の確認
  2. 02サービスの起動と管理
  3. 03コンテナ操作とログ調査
  4. 04Drupal と Drush の手順
  5. 05データベースの入出力と設定

活用シーン

  1. 01既存の Compose 設定の確認
  2. 02ローカルサービスの起動や再ビルド
  3. 03コンテナやネットワークの問題調査
  4. 04Drupal のデータベースやキャッシュ管理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/madsnorgaard/drupal-agent-resources --skill docker-local

インストール後、Claude Code で/docker-localを入力して読み込まれたか確認します。

詳細

Docker Compose によるローカル開発

カスタムの Docker Compose ローカル開発環境(DDEV 以外)を使用します。

環境の検出

Docker を使用するプロジェクトで作業するときは、まずセットアップを検出します。

# Check for compose files
ls -la docker-compose*.yml compose*.yml 2>/dev/null

# Check for environment files
ls -la .env* 2>/dev/null

# Check for Makefile or scripts
ls -la Makefile docker/ scripts/ 2>/dev/null

よく使うコマンド

プロジェクトのライフサイクル
docker compose up -d              # Start in background
docker compose up -d --build      # Start with rebuild
docker compose down               # Stop and remove containers
docker compose down -v            # Also remove volumes (DATA LOSS!)
docker compose restart            # Restart all services
コマンドの実行
# In running container
docker compose exec <service> <command>

# Examples
docker compose exec php composer install
docker compose exec php ./vendor/bin/drush cr
docker compose exec php bash

# In new container (if service not running)
docker compose run --rm php composer install
デバッグ
docker compose ps                 # Show container status
docker compose logs -f            # Follow all logs
docker compose logs -f php        # Follow specific service
docker compose top                # Show processes
docker compose exec php env       # Show environment

Drupal の Docker パターン

よく使われるサービス名

プロジェクトによって異なりますが、一般的なパターンは次のとおりです。

サービスの種類よく使われる名前
PHP/Webphp、web、app、drupal、php-fpm
データベースdb、mysql、mariadb、postgres
キャッシュredis、memcached
検索solr、elasticsearch
Drush の実行
# Find the PHP container
docker compose ps

# Run Drush (path may vary)
docker compose exec php drush cr
docker compose exec php ./vendor/bin/drush cr
docker compose exec web vendor/bin/drush cr
データベース操作
# MySQL/MariaDB
docker compose exec db mysql -u root -p<password> <database>

# Import
docker compose exec -T db mysql -u root -p<password> <database> < dump.sql

# Export
docker compose exec db mysqldump -u root -p<password> <database> > dump.sql

# PostgreSQL
docker compose exec db psql -U <user> <database>

標準的な Docker Compose テンプレート

DDEV を使用しない Drupal プロジェクト向けです。

# docker-compose.yml
services:
  php:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    volumes:
      - .:/var/www/html:cached
    depends_on:
      - db
    environment:
      - PHP_MEMORY_LIMIT=512M

  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html:ro
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php

  db:
    image: mariadb:10.11
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: drupal
      MYSQL_USER: drupal
      MYSQL_PASSWORD: drupal
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3306:3306"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  db-data:
PHP Dockerfile
# docker/php/Dockerfile
FROM php:8.2-fpm

RUN apt-get update && apt-get install -y \
    git unzip libpng-dev libjpeg-dev libfreetype6-dev \
    libzip-dev libicu-dev mariadb-client \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install gd pdo_mysql zip intl opcache bcmath

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html
Nginx 設定
# docker/nginx/default.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html/web;
    index index.php;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

Makefile ラッパー

Makefile を使ってコマンドを簡素化します。

# Makefile
.PHONY: up down restart shell drush composer logs

up:
	docker compose up -d

down:
	docker compose down

restart:
	docker compose restart

shell:
	docker compose exec php bash

drush:
	docker compose exec php ./vendor/bin/drush $(filter-out $@,$(MAKECMDGOALS))

composer:
	docker compose exec php composer $(filter-out $@,$(MAKECMDGOALS))

logs:
	docker compose logs -f

db-import:
	docker compose exec -T db mysql -u root -proot drupal < $(file)

db-export:
	docker compose exec db mysqldump -u root -proot drupal > dump.sql

%:
	@:

使用方法:

make up
make drush cr
make composer require drupal/module
make db-import file=backup.sql

トラブルシューティング

ポートの競合
# Find what's using a port
sudo lsof -i :80
sudo lsof -i :3306

# Check all Docker ports
docker ps --format "table {{.Names}}\t{{.Ports}}"
コンテナが起動しない
docker compose logs <service>           # Check logs
docker compose down && docker compose up -d --build  # Rebuild
docker compose down -v && docker compose up -d       # Fresh start (loses data!)
権限の問題
# Check container user
docker compose exec php id

# Fix web directory permissions
docker compose exec php chown -R www-data:www-data /var/www/html/web/sites/default/files
ネットワークの問題
# Containers reach each other by service name
# From PHP container: mysql -h db -u root -proot

# Inspect network
docker network ls
docker network inspect <project>_default
パフォーマンス(macOS/Windows)

macOS/Windows でファイル同期が遅い場合:

  • :cached ボリュームフラグを使用します
  • 同期対象から vendor/ と node_modules/ を除外します
  • Docker Desktop の VirtioFS(macOS)の使用を検討します
volumes:
  - .:/var/www/html:cached
  - vendor:/var/www/html/vendor  # Named volume for vendor

環境変数

.env ファイル

Docker Compose は .env を自動的に読み込みます。

COMPOSE_PROJECT_NAME=myproject
PHP_VERSION=8.2
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=drupal
Drupal settings.php
// settings.php for Docker
$databases['default']['default'] = [
  'driver' => 'mysql',
  'database' => getenv('MYSQL_DATABASE') ?: 'drupal',
  'username' => getenv('MYSQL_USER') ?: 'drupal',
  'password' => getenv('MYSQL_PASSWORD') ?: 'drupal',
  'host' => getenv('DB_HOST') ?: 'db',
  'port' => getenv('DB_PORT') ?: 3306,
];

// Redis (if using)
if (getenv('REDIS_HOST')) {
  $settings['redis.connection']['host'] = getenv('REDIS_HOST') ?: 'redis';
  $settings['cache']['default'] = 'cache.backend.redis';
}

ベストプラクティス

  1. docker-compose.yml をバージョン管理する - 環境の一貫性を確保します
  2. シークレットには .env を使用する - パスワードをコミットしないでください
  3. Makefile を作成する - チームで使うコマンドを簡素化します
  4. README に記載する - 起動、停止、サービスへのアクセス方法を記載します
  5. 名前付きボリュームを使用する - データベースの永続化に使用します
  6. ヘルスチェック - 依存するサービスが起動する前に、各サービスの準備が整っていることを確認します

コメント