Building Developer-First Docker Environments
Good developer experience isn't a luxury — it's a productivity multiplier. When local environment setup is slow and fragile, developers spend time fighting their tools instead of building things.
At RNID, we were managing multiple WordPress sites with different configurations, PHP versions, and dependencies. Each developer had a slightly different setup. "Works on my machine" was a genuine weekly problem.
The Problem
The environment involved:
- Multiple WordPress sites with different PHP versions
- Large media libraries stored in Azure Blob Storage
- Production databases that needed sanitisation before local use
- Azure-specific configurations not easy to replicate locally
Setting up a local environment took significant time and required coordination. Debugging was inconsistent because environments differed between developers.
The Goal: Environment Parity
The goal was straightforward: your local environment should behave like production.
Architecture Overview
Azure Blob Storage (Production)
│
│ Sync Script
▼
Docker Compose
├── PHP (matched to production)
├── MySQL
└── WordPress
│
▼
Developer Machine
Key Components
Docker Compose per site
Each site got a docker-compose.yml defining:
- PHP version matched to production
- MySQL configuration
- WordPress core and plugins
- Volume mounts for code and media
Automated Sync Script
A Bash script handled:
- Downloading sanitised database dumps from Azure Blob Storage
- Syncing media files
- Setting up local configuration
- Running any required migrations
One-command setup
./setup.sh site-name
From there, you'd have a running local environment without manual steps.
What Improved
Setup time dropped from something that used to take the better part of a day to something that ran in minutes. Environment inconsistencies became rare rather than routine. Onboarding new team members became straightforward.
More importantly, it became possible to reproduce production issues locally — which made debugging faster and more reliable.
Lessons
DX is an engineering problem. Painful manual processes are usually good candidates for automation. The setup friction wasn't just annoying — it had a real cost in time and debugging accuracy.
Make it obvious. The best tooling is the kind that developers actually use because it's easy. A single command that does the right thing consistently is more valuable than something elaborate that requires knowledge to operate.
Security in the details. Database dumps should be sanitised before leaving production. Credentials belong in environment variables, not in images or scripts.
If you're dealing with inconsistent local environments or slow setup processes, Docker-based environment parity is usually worth the investment.