If you could read the mind of a developer and find out what their worst fear is when pushing their changes live you'd most likely hear:
"What if my code is fine on my development and UAT servers but not in production?! How bad could it get? Can I even?"
Yes, it's our worst fear, especially when working with huge Customer Relationship Management (CRM) systems which are so data heavy and reliant on every bit of code executing as intended across all environments. Naturally, as developers, we adopt Murphy's Law - "Whatever can go wrong, will go wrong" so our anxiety is more than justified when it comes to pushing our changes to live systems!
Thankfully, some geniuses in the Open Source community have invalidated our concerns with a fantastic solution called Docker.
So what is Docker? It's the new thing that's in fashion within the development community and it is certainly justified. Docker is a container which allows you to replicate the conditions you would experience in production on ANY server... Yeah you're damn right it does!
Essentially what it does is hold ALL of your application in something called a Docker Image. The image will hold:
This image is then responsible for the program - when you execute this image it becomes part of a container which consists of the Docker image itself, the execution environment and a set of instructions. All the container will do is run the Docker image - absolutely NOTHING else is required, meaning everything you define in your image is what the application relies on, instead of depending on server configurations and updates, which is a huge worry off a developer's shoulders.
Docker was built based on the logistics of shipment (as you can see from their logo, GG on the branding guys), which you will find is very similar to the workflow of development. Let's explain.
Let's say you're the head of logistics at Amazon and you need to ship out a TV from India to England. Your TV is contained in its packaging which came from the original manufacturers of - fully secured, ergonomic and safe from damage. This package will need to be shipped via air transport and then driven hundreds of miles to its destination. Do you:
a) Unpackage the TV and repackage it as it goes through each phase.
b) Leave the TV in its original packaging and pass the package through each phase of transport.
c) All of the above?
Yep - it's b! Docker makes it as simple as that. In the context of Docker, your application is in a container which can essentially be passed through each server, guaranteeing the integrity of the application. Instead of rebuilding your applications across servers and having to depend on different servers recompiling and composing the project, you can ensure that your application is safe from external issues.
The bottom line is - instead of your application being server-oriented, the application becomes oriented to... itself!
No more nail-biting and coffee overdosing! No longer do we have to rely on gut calls and those awkward "Erm... Yeah that should be fine when we push it live..." thoughts and dreading an email labelled "URGENT!" with your name all over it. That relaxes both the developer and the client because they can be certain that everything they test in UAT will execute in the EXACT same way when it goes live - and when you have a happy developer you will see that reflects in their code. Everyone wins!
For one of our big CRMs which deal with mortgages, we made the brave yet necessary migration to Docker. Already we have noticed an acceleration in turnaround for development and a drop-off in issues coming back from UAT. Often a problem that happens is an issue may exist in UAT but not in our development server. Now because we can replicate the conditions across servers seamlessly with Docker, we can seamlessly solve such issues which is pretty damn cool.
We have certainly experienced benefits with Docker at Totally Communications and we cannot wait to see what other technologies we can use to optimise workflows!