כיצד Docker Compose מפשט פיתוח מקומי
מפתחים מבזבזים עד 30% מזמנם על הגדרת סביבות: קונפליקטי גרסאות עם PHP, הבדלים בין PostgreSQL ב-macOS וב-Windows, פורטים תפוסים על ידי שירותים אחרים. Docker Compose פותר זאת עם קובץ תצורה אחד. לפי התיעוד: Docker Compose הוא כלי להגדרה והרצה של יישומים מרובי-קונטיינרים תיעוד Docker Compose. אנו מגדירים docker-compose.yml כזה שמפעיל את כל הערימה בפקודה אחת. שכחו מניהול שירותים ידני — הכל ניתן לשחזור ואוטומטי.
תרחיש טיפוסי: מפתח משכפל את המאגר, מריץ make up, ובתוך 5 דקות כבר עובד עם Laravel, PostgreSQL ו-Redis. אין יותר קסמי brew/apt או התקנות ידניות. סביבה עקבית לכל הצוות — ואין יותר "זה עובד אצלי במחשב".
לפני זמן לא רב, צוות של 5 מפתחים פנה אלינו: כל אחד בילה עד 4 שעות בהגדרת MAMP לפרויקט שלו, וכשעברו בין משימות, נוצרו קונפליקטי גרסאות עבור PHP ו-PostgreSQL. לאחר יישום Docker Compose, זמן הפריסה ירד ל-10 דקות, ושגיאות הקשורות לסביבה ירדו ב-80%. דוגמה קונקרטית זו מראה כמה יעילה יותר קונטיינריזציה בהשוואה לכלים מסורתיים.
בעיות שאנו פותרים
- גיהנום גרסאות: PHP 8.1 בפרויקט אחד, 8.3 באחר — מעבר דרך brew/apt שובר תלויות. Docker מבודד כל פרויקט בקונטיינר משלו, ומאפשר כל גרסה ללא קונפליקטים.
-
תלויות Healthcheck: ללא
depends_onעם condition, שירותים מתחילים בצורה כאוטית — האפליקציה קורסת עד ש-PostgreSQL מוכן. הפתרון הוא הוספת healthcheck הבודק את מוכנות מסד הנתונים דרך pg_isready. - הרשאות קבצים: קבצים שנוצרים בתוך הקונטיינר שייכים ל-root — במארח, אי אפשר לערוך אותם. הפתרון הוא מיפוי UID/GID ב-Dockerfile דרך ארגומנטים של build.
בעיות אלה אופייניות לצוותים העוברים ל-Docker. הניסיון שלנו מראה שפתרון נכון שלהן מקצר את זמן הקליטה של מפתחים חדשים מיומיים ל-20 דקות.
למה Docker Compose מהיר יותר מ-XAMPP
| פרמטר | XAMPP | Docker Compose |
|---|---|---|
| בידוד גרסאות | גלובלי אחד | לפי פרויקט |
| PostgreSQL | לא נתמך | תמיכה מלאה |
| Redis/שירותים נוספים | לא כלול | כל תמונה |
| יכולת שחזור | תלוי מערכת הפעלה | זהה בכל מכונה |
| זמן הגדרה לצוות של 3 אנשים | 6 שעות | שעה |
Docker Compose מנצח פי 5 בזמן הגדרה עבור צוות של 3 מפתחים. בנוסף, הוא מפחית עלויות תשתית: אתם משתמשים רק במשאבים שהפרויקט צריך, במקום לתחזק ערימה גלובלית.
איך אנחנו עושים את זה
הערימה הסטנדרטית שלנו: PHP 8.3, PostgreSQL 16, Redis 7, Vite. אנו משתמשים ב-docker/dev/Dockerfile עם Composer ו-pdo_pgsql. ל-hot reload, אנו מתקינים קוד דרך volumes, למעט vendor ו-node_modules. Makefile מפשט פקודות: make up, make artisan, make test.
מקרה בוחן: פרויקט Laravel 11 עם Vite. בעבר מפתחים השתמשו ב-MAMP — מסד הנתונים קרס תחת עומס, Redis לא עבד ישירות מהקופסה. העברנו ל-Docker Compose תוך 4 שעות. זמן הגדרת הסביבה למפתח חדש ירד מיומיים ל-20 דקות. בנוסף, הגדרנו Xdebug דרך docker-compose.override.yml, מה שהאיץ את הניפוי ב-50%.
איך להגדיר Hot Reload עם Vite?
עבור Vite ב-Docker Compose, צריך להעביר פורט 5173 ולהשתמש בדגל --host. בדוגמה שלנו, שירות ה-vite מריץ npm run dev -- --host. זה מאפשר ל-hot reload לעבוד על המארח דרך localhost:5173. הערה חשובה אחת: ודאו שב-vite.config.js אתם לא מגדירים strictPort ושה-server.hmr מוגדר ל-'0.0.0.0'. אחרת HMR לא יעבוד בתוך הקונטיינר.
תהליך עבודה
- ניתוח — קביעת הערימה, הגרסאות והפרטים הספציפיים של הפרויקט.
- עיצוב — כתיבת
docker-compose.yml, Dockerfile, Makefile. - יישום — הגדרת healthcheck, volumes, משתני סביבה.
- בדיקות — אימות עלייה, מיגרציות, Vite hot reload.
- פריסה — מסירת הוראות ו-Makefile לצוות.
מה כלול
-
docker-compose.ymlעם שירותים: app, vite, db, redis, mailpit, adminer - Dockerfile לסביבת פיתוח (PHP 8.3, Composer, pdo_pgsql)
- Makefile עם פקודות: up/down/shell/artisan/test
-
docker-compose.override.ymlעבור Xdebug - הוראות לצוות (README)
- חודש תמיכה לאחר המסירה
שלבי הגדרת Docker Compose
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח | שעתיים | הערימה והגרסאות הוגדרו |
| עיצוב | יום אחד | docker-compose.yml, Dockerfile, Makefile מוכנים |
| יישום | יום אחד | Healthcheck, volumes, env הוגדרו |
| בדיקות | שעתיים | עלייה, מיגרציות, hot reload אומתו |
| תיעוד | שעה | README והוראות לצוות |
טעויות הגדרה טיפוסיות (ואיך להימנע מהן)
- השתמשו ב-
depends_onעםcondition: service_healthy— אחרת האפליקציה מתחילה לפני שמסד הנתונים מוכן. - תמיד התקינו
vendorו-node_modulesכ-volumes אנונימיים — אחרת הם נדרסים מהקונטיינר. - ב-macOS, הוסיפו
extra_hostsעבור Xdebug:host.docker.internal. - ודאו שפורטי המארח לא תפוסים: בדקו דרך
lsof -i :5432.
דוגמת תצורה
---
services:
app:
build:
context: .
dockerfile: docker/dev/Dockerfile
ports:
- "8000:8000"
volumes:
- .:/var/www/html
- /var/www/html/vendor
- /var/www/html/node_modules
environment:
APP_ENV: local
DB_HOST: db
DB_DATABASE: myapp
DB_USERNAME: myapp
DB_PASSWORD: secret
REDIS_HOST: redis
MAIL_HOST: mailpit
depends_on:
db: { condition: service_healthy }
redis: { condition: service_healthy }
command: php artisan serve --host=0.0.0.0 --port=8000
vite:
image: node:20-alpine
working_dir: /app
volumes:
- .:/app
- /app/node_modules
ports:
- "5173:5173"
command: npm run dev -- --host
db:
image: postgres:16-alpine
ports:
- "5432:5432"
environment:
POSTGRES_DB: myapp
POSTGRES_USER: myapp
POSTGRES_PASSWORD: secret
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myapp"]
interval: 5s
timeout: 3s
retries: 5
redis:
image: redis:7-alpine
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
mailpit:
image: axllent/mailpit:latest
ports:
- "1025:1025"
- "8025:8025"
adminer:
image: adminer:latest
ports:
- "8080:8080"
environment:
ADMINER_DEFAULT_SERVER: db
depends_on: [db]
volumes:
postgres_data:
# docker/dev/Dockerfile
FROM php:8.3-cli
RUN apt-get update && apt-get install -y \
git curl zip unzip libpq-dev \
&& docker-php-ext-install pdo_pgsql \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
WORKDIR /var/www/html # Makefile
.PHONY: up down shell artisan
up:
docker compose up -d --build
@echo "App: http://localhost:8000"
@echo "Mail: http://localhost:8025"
@echo "DB UI: http://localhost:8080"
down:
docker compose down
shell:
docker compose exec app bash
artisan:
docker compose exec app php artisan $(filter-out $@,$(MAKECMDGOALS))
tinker:
docker compose exec app php artisan tinker
test:
docker compose exec app php artisan test --parallel
migrate:
docker compose exec app php artisan migrate
fresh:
docker compose exec app php artisan migrate:fresh --seed
npm:
docker compose exec vite npm $(filter-out $@,$(MAKECMDGOALS))לאחר הרצת services: app: build: context: . dockerfile: docker/dev/Dockerfile ports: - "8000:8000" volumes: - .:/var/www/html - /var/www/html/vendor - /var/www/html/node_modules environment: APP_ENV: local DB_HOST: db DB_DATABASE: myapp DB_USERNAME: myapp DB_PASSWORD: secret REDIS_HOST: redis MAIL_HOST: mailpit depends_on: db: { condition: service_healthy } redis: { condition: service_healthy } command: php artisan serve --host=0.0.0.0 --port=8000 vite: image: node:20-alpine working_dir: /app volumes: - .:/app - /app/node_modules ports: - "5173:5173" command: npm run dev -- --host db: image: postgres:16-alpine ports: - "5432:5432" environment: POSTGRES_DB: myapp POSTGRES_USER: myapp POSTGRES_PASSWORD: secret volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U myapp"] interval: 5s timeout: 3s retries: 5 redis: image: redis:7-alpine ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s mailpit: image: axllent/mailpit:latest ports: - "1025:1025" - "8025:8025" adminer: image: adminer:latest ports: - "8080:8080" environment: ADMINER_DEFAULT_SERVER: db depends_on: [db] volumes: postgres_data: , האפליקציה זמינה ב-# docker/dev/Dockerfile FROM php:8.3-cli RUN apt-get update && apt-get install -y \ git curl zip unzip libpq-dev \ && docker-php-ext-install pdo_pgsql \ && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer WORKDIR /var/www/html , Mailpit ב-# Makefile .PHONY: up down shell artisan up: docker compose up -d --build @echo "App: http://localhost:8000" @echo "Mail: http://localhost:8025" @echo "DB UI: http://localhost:8080" down: docker compose down shell: docker compose exec app bash artisan: docker compose exec app php artisan $(filter-out $@,$(MAKECMDGOALS)) tinker: docker compose exec app php artisan tinker test: docker compose exec app php artisan test --parallel migrate: docker compose exec app php artisan migrate fresh: docker compose exec app php artisan migrate:fresh --seed npm: docker compose exec vite npm $(filter-out $@,$(MAKECMDGOALS)) , Adminer ב-make up. לביצוע פקודות Artisan, השתמשו ב-localhost:8000, לדוגמה, localhost:8025.
Override לסביבות שונות
---
# docker-compose.override.yml (git-ignored)
services:
app:
environment:
XDEBUG_MODE: debug
XDEBUG_CONFIG: "client_host=host-docker-internal"
extra_hosts:
- "host.docker.internal:host-gateway"
עבור שירותים אופציונליים, השתמשו ב-profiles: localhost:8080 מתחיל, לדוגמה, redis-commander.
ציר זמן ועלות
הגדרת ערימה טיפוסית (PHP + PostgreSQL + Redis + Vite) אורכת יום אחד. תצורות מורכבות (מספר פרויקטים, תמונות מותאמות אישית) אורכות עד 3 ימים. העלות מחושבת באופן אישי. הזמינו הגדרת Docker Compose לפרויקט שלכם — זה יחסוך זמן לצוות שלכם ויפחית כאבי ראש. קבלו ייעוץ עכשיו.
על הניסיון שלנו: מעל 5 שנים בשוק, 20+ פרויקטי Docker מוצלחים, 10 מהנדסים ברמת senior. אנו מבטיחים תאימות לכל תשתית.







