docker-local について
docker-local は、DDEV 以外の Docker Compose を使うローカル開発向けスキルで、Drupal に重点を置いています。環境の起動、設定、トラブルシューティングに使うコマンドや手順をまとめています。
主な機能
- 01Docker Compose 環境の確認
- 02サービスの起動と管理
- 03コンテナ操作とログ調査
- 04Drupal と Drush の手順
- 05データベースの入出力と設定
活用シーン
- 01既存の Compose 設定の確認
- 02ローカルサービスの起動や再ビルド
- 03コンテナやネットワークの問題調査
- 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/Web | php、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';
}
ベストプラクティス
- docker-compose.yml をバージョン管理する - 環境の一貫性を確保します
- シークレットには .env を使用する - パスワードをコミットしないでください
- Makefile を作成する - チームで使うコマンドを簡素化します
- README に記載する - 起動、停止、サービスへのアクセス方法を記載します
- 名前付きボリュームを使用する - データベースの永続化に使用します
- ヘルスチェック - 依存するサービスが起動する前に、各サービスの準備が整っていることを確認します
コメント
Markdown 対応