So, over the past several months I have been using docker heavily. I started out with just plain vanilla Docker and then moved to primarily using Compose. This journey has been incredibly eye opening for me and I have come to the conclusion that Docker is ultimately a good thing. Here's my take:
The Good
Isolated environments without the cost. Absolutely beautiful. One of my greatest pains in building and maintaining applications is when you need to productionize and scale the app and you have to remember every package and config you needed installed. Sure there is Chef and Puppet which are great, but there is a certain discipline to the Dockerfile. I have taken it on myself to always build everything from the Dockerfile, and that discipline ensures you always have everything you need. For a guy who has 4-6 projects on his plate at a time, this is invaluable to me.
Rapid prototyping is hugely beneficial. I know the term 'ninja' is horribly overused today, but I really do feel like a ninja with Compose. The ability to spin up whole ecosystems in such a short amount of time has become very empowering for me. When looking for the right tool for the job, it really pays to be able to spin up different technologies quickly. I have gotten huge wins out of this in my current role. There is just nothing quite like seeing a tool in action before deciding on it, and Compose enables me to do that quickly.
The Bad
Increasing complexity. Docker ultimately adds a level of complexity in places. I always say that when you simplify one thing you are ultimately complicating another. This holds true with Docker. It is its own init system in a lot of ways, but then totally lacking in others. The logging situation can be difficult, networking can make your head hurt, and sometimes producing environments with minimalist kernels can have unexpected results. I have definitely put my head through a wall many times with Docker. It has great ambitions, but there are still gaps that need to be filled.
Microservices are not always good. With Docker inevitably comes the mantra of microservices. Personally, I really like the idea for a lot of stuff, but it is ultimately a dogma. The first application I built with Docker I adhered strictly to this doctrine. The service was really cool in the end and taught me a lot, but looking back I think it just took a lot more time than if I had allowed for more than one process per container. I think we will end up in a land somewhere in-between microservices and monoliths, I am heading that way now and its been good so far.
The Future
Fundamentally, I see Docker as solving the problem of process management that unix failed to. I think the energy just moved out of that world, probably because its not all that attractive from a top level. This left room for a new init on the block. With a rework this fundamental there has been a tremendous amount of effort poured back into this area. However, we are beginning to see a bit of a plateau in that today, and a lot of the cracks are beginning to get more attention. The Docker 'haters' are growing in numbers by the day, but I'm going to ice that fire a bit.
Docker is the future. I know people are probably tired of hearing that, but it's true. I imagine a reimagined hypervisor will return and microkernels will pick up steam, but at the heart of that movement is still the Docker brand. The are making smart acquisitions and seem well aware of the shortcomings of the current platform. I believe in the positives of the product, and see a lot of the negatives as solvable. So for now I'm sticking with the whale, full steam toward the containerization of everything.