Still clinging to WAMP? Docker's already at the bar
Seriously, you still launch WAMP?
WAMP, XAMPP, and MAMP helped when we were poking PHP in 2010, but today they feel like diners serving flat soda. Need a production-like stack locally? Want to version your config? Want to stop port roulette while juggling three projects? Docker solved it all while your Apache installer blinked red.
Why WAMP/XAMPP/MAMP keep burning you
- Frozen environments: every bundle locks you to its PHP, MySQL, and Apache versions. Want to try PHP 8.3? Enjoy detonating three other projects.
- Config nobody can share: try pasting
.inifiles on Slack for your teammates or CI. Adorable, still useless. - Zero isolation: enable one Apache module and it bleeds everywhere. Hello phantom bugs.
Docker flips the table
- Stacks as YAML: a versioned
compose.ymlrebuilds the environment on any laptop or CI pipeline with one command. - Service isolation: each container ships its exact PHP, Redis, PostgreSQL, whatever. Mix, match, delete.
- Observability by default: logs, metrics, healthchecks—no more guessing whether
mysqldwoke up. - Portability: Linux, macOS, Windows, ARM, x86… Docker shrugs as long as the kernel runs containers.
Modern Compose beats dusty docker-compose.yml
Docker's docs scream the basics: call the file compose.yml, skip the version field, stash variables in .env, and describe services declaratively. Here's a drop-in snippet:
yaml
A few must-knows:
namemakesdocker compose lsand logs easier to read.pull_policy: alwaysdodges outdated images when the stack evolves.depends_onpluscondition: service_healthyensures MariaDB is ready before FrankenPHP boots.- Declared volumes at the bottom keep MySQL data alive between redeploys.
FrankenPHP is Apache's smug replacement
Why bother with Apache or Nginx inside a container when FrankenPHP bundles a modern SAPI, HTTP worker, and native Symfony/Laravel support?
- Performance: persistent worker mode, pre-warmed OPCache, HTTP/2 and soon HTTP/3.
- Simplicity: no herd of
.conffiles; drop the app in/app, expose port 80, done. - Dev integration: hot reload without
symfony serve; FrankenPHP keeps the loop alive.
CI/CD without the “works on my machine” prayer
Run docker compose run --rm lint to check code and deploy the exact stack in production. No divergent environments, no port 3306 scavenger hunt.
Cynical but honest wrap-up
Keep stroking the green WAMP icon if you enjoy pain. But if you want faster delivery, versioned infra, and ridiculous combos (Redis + Meilisearch + FrankenPHP + PostgreSQL) spun up in three lines, Docker is already waiting. Ditch the prehistoric installers, commit your compose.yml, and say thanks when onboarding drops to five minutes.