$ cat post/december-14,-2015:-a-tale-of-containers,-crashes,-and-code.md

December 14, 2015: A Tale of Containers, Crashes, and Code


December 14, 2015 was a day like any other in the world of tech. I remember it as a typical Tuesday, though the year 2015 seemed to be a watershed moment for containers and microservices. Docker had been around for a couple of years, and Kubernetes, that Google monolith, was just getting off the ground.

A Week That Changed Containers

It was mid-November when I first dipped my toes into Docker. My team at the time was evaluating it to see if we could get away from our heavy VM-based infrastructure and streamline our development workflow. We were excited about the promise of containers—lightweight, portable, and flexible.

By December 14th, we had a working prototype in production, running several microservices inside Docker containers. Everything seemed smooth until I received an email at midnight with a stack trace. Our app was crashing in the middle of processing payments for our users.

The Crash

The error message pointed to a file handling issue within one of the services. It was clear that we had hit a bug, but it took us hours to figure out where exactly it was coming from. We had containerized multiple services and they were talking to each other via Docker’s inter-container communication. Debugging this kind of setup is a nightmare.

The Search for Solutions

We tried every trick in the book: logging to stdout, adding more error handling code, and even reverting back to our old VM-based system just to see if it was an issue with containers themselves. After hours of frustration, we finally pinpointed the problem to how we were managing file descriptors across container restarts.

Lessons Learned

This experience taught us a lot about the limitations and gotchas in Docker’s early days. We realized that while containers offer incredible flexibility and portability, they come with their own set of challenges. One major lesson was the importance of robust error handling and good logging practices.

Reflection on the Era

Looking back, 2015 was a fascinating time for infrastructure. The SRE book by Google was just being published, and everyone was trying to figure out what it meant for operations in the cloud era. At the same time, companies like CoreOS were pushing forward with their own container solutions, and Kubernetes was gaining traction.

That day of debugging taught me that while new technologies are exciting, they also bring a host of new problems to solve. And sometimes, those problems can be quite unexpected.

In Memoriam

One of the other stories that caught my eye this month was the passing of Ian Murdock, one of the creators of Debian. His contributions to Linux and open source will not be forgotten, but it made me realize how much we owe these pioneers in our field.

Closing Thoughts

As 2015 drew to a close, I found myself reflecting on both the challenges and the excitement of working with containers. The tech world was moving rapidly, and every day felt like there were new lessons to learn. It’s been over ten years since I started this journey, and each step has taught me something valuable.

And so, as 2015 fades into memory, I’m grateful for the experiences that shaped our current infrastructure landscape—and hopeful about what tomorrow will bring.


This is a personal reflection on a specific day in tech history. It highlights the challenges of working with containers early on and reflects on the broader context of technology trends at the time.