We're moving a lot of our projects these days over to using docker for defining the development environment, where each project has its own docker-compose.yml definition file to provide an identical development environment for all devs on the project.
Take a look at the project over on Github - this contains the docker-compose file (and related helper scripts) along with the underlying docker image definitions. Our definition defines the following core services.
Along with, specifically for development -
And then optional images for third party services
A visualisation of this is below
Along with the docker-compose file, the project provides two helper scripts
Most importantly, docker-compose is defined in such a way as to be directly usable on Gitlab CI. That configuration is for another post...