For the last few years, I’ve used Docker and Docker Compose exclusively on all of my projects. When I start a new project or onboard a new client, usually one of the first things that I need to do is get an application running in Docker so that I can work on it.
I’ve inherited projects with no environment configuration or documentation at all and I need to start from scratch to get it running. Ideally, each project would have it’s local environment configuration in the same Git repository as the application code.
For my own projects, these days I prefer to use Docker and Docker Compose - creating my own Dockerfiles for each project so that the correct dependencies are present and the required build steps are executed, as well as acting as documentation.
It’s lean as the environment is built specifically for each project, and easy to configure using Docker and Docker Compose directly using native patterns such as override files, environment variables and interpolation, and multi-stage builds.
The configuration can be as simple or complicated as it needs to be for each project rather than using “a one size fits all” approach. If I’m working with Drupal, Fractal, Vue.js, a PHP library, a Go command line tool, or something else entirely, I can use the most appropriate starting point.
As well as local developments, it’s easy to use Docker and Docker Compose in CI environments with tools like GitHub Actions and Bitbucket Pipelines. They will either be present by default or will be easy to install, and it’s simple to run a
docker-compose build or
docker-compose run command within a pipeline to check that the project builds correctly and to execute tasks such as automated tests or static analysis.
As well as using it for projects, Docker has been useful for me in other situations where I need to run small tools such as rst2pdf for generating presentation slides, and ADR Tools for working with architectural decision records.
For some situations like an open-source contribution day, using an off-the-shelf solution would probably be a better option, and some teams will have their own preferences, but I prefer to use Docker and Docker Compose when I can.
Personally, I like to invest time into learning tools that provide reusable knowledge, such as Docker and Docker Compose. I’d prefer to spend time learning something, even if it may take longer compared to other tools, if it’s going to give me a return on that investment in the medium- to long-term.
For some examples of how I work with Docker and Docker Compose, you can see my public GitHub repositories and how things are put together there.