Self-hosting sounds different, but it essentially is installing and using a package on a computer. It can be a Windows PC or a Linux system, and the installation steps can slightly vary, but the installation aspect remains nearly the same. When I first discovered lightweight, self-hosted tools that saved me from expensive monthly subscriptions, I never thought of using them as Docker containers. It was a complex idea, one that I found too intimidating and unnecessary at first, as a regular package install seemed more convenient.
I remember installing tools like NextCloud, Jellyfin, and more from DietPi’s software and then checking the appropriate port number to load the web portal. It was a process that initially worked without any problems, but soon became a little restrictive. Unimaginable problems like taking the whole system down just to troubleshoot one app, or the mangled mess of files, urged me to move to Docker.
Staying away from Docker was a huge mistake
I should’ve used it earlier
When you start digging around for self-hosted tools, techniques, and devices that can run them efficiently, the word “Docker” seems common in all the search results. Very few try to explain how it's different from a traditional install or the benefits you get with Docker deployment. The mere talk of concepts like containers makes you uneasy, and you try to skip it and just find a command that'll install the tool you want.
Docker is a CLI tool, and using a CLI tool is a difficult task, or rather used to be a difficult task for a Windows user like me. I had basic knowledge of Linux systems as I had a semester about the same in my college, and while the curriculum taught me all the OS commands, I stuck to the GUI aspect of Ubuntu. Linux didn't become a main thing for me until I started playing with lightweight server distros, where I didn't have any choice except the terminal.
Creating a Docker container is as easy as just pasting a Docker run command, and the container becomes live on a specific port. But the real problem comes when your container doesn't work as it should, and you have to view active containers, sort out port numbers or other networking caveats, ensure timely updates, or access data.
I'm glad that I learned the CLI techniques first and then moved to a GUI tool like Portainer, as it helped me understand how Docker does everything in the background. Using Portainer or Dockhand makes Docker a breeze for a beginner, but I won't suggest skipping CLI knowledge if you wish to build and maintain a home server in the long run.
Isolation is bliss for self-hosting
No more dependency conflicts or troubleshooting pains
One thing I didn't realize is that when you install a self-hosted tool, it downloads all the packages required to run it. Every time you install a new tool, it might ask for a different version of dependencies. For example, one tool could need an older version of Python while another would have no problem working with a new version. This creates dependency hell, as you need to keep different versions of Python to run both tools, and troubleshooting one breaks the other.
Docker effortlessly solves this problem with isolation. It creates separate containers, each with all the necessary dependencies, runtimes, libraries, and other things required for the app or tool. Each container has its own isolated filesystem, and other containers cannot access it unless you define shared volumes or networking. So, even if a tool has specific package requirements, it can still work inside a Docker container and never encounter conflicts like a traditional package install. This ability lets me experiment as much as I want without worrying about breaking my existing self-hosted tools.
I can always try a new tool, play with its settings, and discard it without worrying about its impact on other containers. A single Docker rm command can purge the container, and the rest of the batch keeps working as if nothing ever happened. During troubleshooting, I don't need to turn off my system or reboot it unless there is something wrong with Docker itself. Container isolation means I can force the restart of an individual container and use troubleshooting methods only on it.
Simplified updates and backups
Better than managing individual tools
Every tool that you use launches an update to either fix bugs or add new features. Installing new updates for an existing tool might not be as easy as you think. You’ll need the updates for dependencies as well, and often, conflicts can make the process infuriating. But Docker’s design makes updates very simple. Since each Docker container is an isolated filesystem, updating it generally means pulling the latest container image and recreating it. There’s a minimal chance of problems during updates. Since Docker keeps app data and files in persistent folders that aren’t a part of the container, you can even break the container and recreate it.
This flexibility is missing from a traditional package install, where changes can directly affect your personal data. You might have to make backups beforehand to avoid any tragedy. For a Docker container, you only need to preserve your bind-mounted folders or Docker volumes, along with the Docker Compose and other configuration files. Using these, you can recreate the container on the same or any other machine with ease. This trait makes Docker portable because the container itself is disposable, and your data remains separate.
Don’t skip Docker
I urge you not to make the same mistake I made at the beginning of my self-hosted journey. Approach it with curiosity and learn the CLI ropes before using a GUI tool like Dockhand. Most of the tasks that I described above become effortless with a GUI tool, and it’s better to take advantage of the containerized approach. It keeps everything organized, isolates files, and is easy to update, while keeping your system tidy.