Your Docker Learning Roadmap
It’s easy to get started with Docker, but once you go beyond very basic usage you can start running into issues and questions which are hard to ask or answer.
It can feel like banging your head against the wall. Simple things you expected to “just work” turn out to be really hard or not to make sense.
Lots of struggles are caused by superficial understanding of Docker - the tool, its parts and the concepts behind them.
If you can’t wrap your head around Docker
“Just one more tutorial” isn’t the answer. Talks and tutorials often focus on happy paths, or go straight into technical details without understanding WHY those steps are the way they are, or why you would use Docker in the first place.
If you are running into issues, you might just be missing a more abstract understanding and an overview of the domain.
If your learning stagnates, that might mean that you happen to approach Docker using a chellenging learning path. Missing context and tackling complex details early on can confuse anybody.
Starting with an overview and slowly ramping up the difficulty
Just as you should have a map before you start a longer journey, it can be helpful to break the Docker learning journey down into small, achievable parts.
A good roadmap can show you a manageable learning curve towards building a good understanding at a steady pace. Making sure you are prepared for the each segment ahead - challenging your understanding just the right amount.
I’d like to share my roadmap to understand Docker basics - subdivided into stages of understanding. You can use it when starting out, but also in hindsight to fill in knowledge gaps you might have missed.
Let’s dive into the stages. For each one, try to get started gently. With a curiosity for the new step ahead, looking for the smallest and simplest part of the stage ahead.
For each stage, you could go into lots of depth. Focus on building an approximate understanding and basic skills first. Don’t get too hung up on each stage. If you feel like you have a rough understanding and some confidence.
Don’t worry too much about learning “everything there is” about every single stage. Instead, aim for a practical level of understanding so you can casually discuss those topics with another person you know. As soon as you feel like you have a good-enough understanding, continue to the next stage.
You might find out that your understanding wasn’t quite correct as you learn more, but that’s fine and expected. The point of each stage is to make the next one easier to grasp. You can always cycle back.
If you want a pdf overview with additional hints and questions to guide your learning, make sure to enter your email address at the end of this article.
The beginning: actual real-world shipping containers
Yep, the real metal things which are lifted on ships with cranes. They have done wonders to the world of logistics, and their effects have been quite comparable. It’s a helpful metaphor to keep in mind.
What issues come up if you run many processes on a machine?
Now we’re getting closer to the “why” behind containers, but without mentioning them. I think it’s important to know about the problems which arise if (multiple people) try to run their processes on one and the same machine. “Dependency hell” is one possible term to get started.
Isolation - VMs vs containers
They are often compared and there’s a lot of confusion around that fact. Containers and VMs are very similar in some ways, and really different when it comes to the way they are used and what they are best suited for.
Containers and how they (approximately) work
A bit of a historical view, but also a look under the hood of containers. What were people doing before containers became popular? What were the limitations and reasons to come up with containers? Who contributed? Learn about cgroups and namespaces - the tech that makes containers possible.
Learn about Docker - the tool
Imagine a Swiss army knife. Docker is pretty similar - a useful tool, able to help you do different types of tasks. This is one reason why there is so much confusion around it.
Three different jobs are hiding behind Docker-the-tool. You can use Docker for packaging apps, distributing those packages apps to other machines and running your packaged apps. You can read more in this article.
Get familiar with fundamental components of Docker
This article is a start to get an intuitive understanding of some parts of the Docker world - containers, images, Dockerfiles most notably. Docker registries are useful to look up as well. Just to know that those things exist.
Intermission: get friendly with the terminal
Getting to know Docker works well if you can experiment and try some things. Unfortunately, the command line interface is the best way to go here.
If you want to work with containers, getting friendly with a terminal is a good time investment, and will make it easier to get to know Docker, as containerized applications are living in terminal-land.
Learn to use the Docker CLI, experiment with basic tasks
Trying basic interactions and going through the usual “Hello World!” type interactions you used to see in Docker-related talks. Once again, hands-on experience with these basic building blocks will help you to learn by doing. Start an interactive ubuntu container, take a look around. Let your curiosity guide you. Build your own (as simple as possible) Docker image from a short Dockerfile.
Dive deeper into the Docker CLI
After basic interactions, it can get a bit more interesting. How do you detach from a container? How can you run it in the background. How can you “enter” an existing container? This stage will help you to get an even better feeling for how containers behave. It’s not result-oriented, but focused on exploration instead.
Less boring containers - volumes and port publishing
Now that you have explored basic interactions, we can switch back to a more goal-oriented approach. Making containers interesting by publishing ports (so we can interact with web servers running on them), making data persistent with volumes and sharing data with the host using bind-mounts.
Stop using the Docker CLI to make your workflows less manual and tedious
The Docker CLI is great for playing around, and to investigate issues, but I’m a big fan of NOT using it for day-to-day work. Now that you have a feeling for how containers work through hands-on exercises you can switch to a more convenient and practical way to configure them.
Docker-compose is a fantastic tool to get you out of writing 100+ character commands in your terminal. Compare how it feels to work with docker-compose.yml files, how they can help you type less and configure multiple containers at once. That’s your first step towards making Docker workflows less manual and tedious in the future.
The way forward
That’s it for the basics! If you go through all those stages, and build your understanding step by step, you will have a good foundation to boost your future Docker learning curve. It takes a while to build understanding. A time investment ranging from days and weeks of research can be expected until you have a complete overview.
But it’s worth it! Docker can be a very useful and powerful tool in your tool-belt once you get over the confusion-barrier.
What to do once you’re comfortable with the basics? One good next step could be to focus on Docker images, how they work and how to build them. If you’re interested in expanding your understanding, check out the free “5 Days to Better Docker Images” email course over at https://vsupalov.com/courses.
I hope that this roadmap will help you learn Docker quicker and to help you level-up your Docker skills.