Docker increases app flexibility, but it also adds complexity in many ways. To migrate successfully to containers, you need to have a plan for handling that additional complexity.
Docker adds flexibility because it makes it easier to deploy an app wherever you want. That creates portability and scalability.
Yet, containers also make app deployment complicated in several ways. They include:
- Monitoring. Docker provides some basic app performance statistics in the /stats directory of a running container. But to monitor application health and performance fully, you’ll probably want more information than what you can find in /stats. For this, container-ready third-party monitoring solutions are currently the only good option, unless you want to build a complex Docker monitoring tool by hand.
- Orchestration. If you use virtual machines, you probably orchestrate them with whichever orchestrator comes with your virtualization solution of choice—such as VMware Orchestrator, in the case of VMware. But with Docker, you have to choose from a variety of orchestration tools, including but not limited to Swarm, Mesos and Kubernetes.
- Data storage. With virtual machines or bare-metal servers, persistent data storage is pretty straightforward. It becomes much more complex with Docker. To store container data persistently, you have to move the data out of the container to the host or somewhere else with a persistent file system.
- Security. While the attack surface of a Dockerized application is arguably smaller because Docker has less overhead, a Docker stack has more layers you need to secure than a traditional stack. In addition to the containerized app itself, you also have to secure the container registry, the Docker daemon and the host operating system.
This added complexity is not an argument against using containers. For most people, the benefits of Docker will outweigh the extra complication. Still, it’s important to recognize this additional complexity before making your Docker migration plan.