Docker lets you create containers that work as individual entities, and you can manage multiple containers inside a single Docker installation. While you can create and use as many self-hosted app containers as you wish, the hardware resources are always limited. I have a spare old laptop with just 4GB DDR3 memory, and it serves as a good machine to run some of my essential self-hosted services.

With such a limited memory capacity, all the Docker containers behave nicely and rarely encounter a problem. I use a combination of a backup tool, an image browser, a container monitoring tool, a general and PDF toolkit, and a media streaming server. Let’s explore how I benefit from each of these services and the overall performance while using them on such trivial hardware.

A small collection of self-hosted tools

Only the ones that I need

I get overenthusiastic about the number of containers I can deploy, but the approach was different due to resource limitations. I want to upgrade the laptop with an 8GB RAM module, but I haven’t got the time to do it. One of the RAM slots doesn't work, and I don't have another DDR3 memory-supported system to swap from.

So the memory limitation forced me to carefully think about what to put on it. Heavy self-hosted services like Home Assistant were a no-go for this one. I chose services that I would use daily and would work under the memory limit. My host system is MX Linux Fluxbox, which uses around 500MB to work, so I had to keep that number in mind while creating new containers.

OmniTools

OmniTools is a new favorite because I was tired of using web tools for basic tasks. These included image, audio/video, and file conversion tasks that I would accomplish via free online tools. If you’ve used them, you can understand the pain of browsing through ads, pop-ups, and a tricky system to do something.

Even removing the image background bombards you with unnecessary options, which sometimes require a paid plan to download. OmniTools has a background remover tool and an array of image, document, and media-related tools that eliminate the need to visit a website.

I was overwhelmed by the tool list and stuck to the search bar to find what I needed. The processing on my 4GB system is snappy, and it has a very small memory and storage footprint. I assure you that the OmniTools suite has everything you need, and the joy of doing it locally preserves your data from sketchy websites.

BentoPDF

While OmniTools has a PDF toolkit with a few basic utilities, it's no match for BentoPDF. I never need to visit the Adobe Acrobat website or pay for the app after adding the BentoPDF container, and it works flawlessly.

This self-hosted PDF tool uses about 3 MB when active and is among the least resource-intensive containers on my list. I don’t need to worry about it at all, and the tool list is equally impressive.

I have used Stirling-PDF in the past, but the tracking fiasco was a sour experience for me. I can turn off the tracking now, but BentoPDF is sufficient on limited system resources.

NextCloud

It's one of the demanding Docker containers on my list, but it is an excellent file backup solution. I don't play much with the additional apps that the service offers and only use them to back up select folders from my PC and phone.

I've automated the backups from crucial folders like Documents and my camera folder. NextCloud takes nearly 400MB of memory to work, but that's still low compared to the Immich container.

Immich

Immich is my absolute favorite tool that I previously used as a Google Photos alternative. But now I’ve integrated my NextCloud library with Immich and added an external library inside the tool. So, all my image backups go to NextCloud, and then Immich can access the uploaded data from NextCloud.

I get an image viewing interface that I like, with the perks of additional tools like ML and OCR support. NextCloud image preview is basic, which is why Immich holds a special place in my Docker containers. However, it’s one of the biggest memory hogs that can sometimes cross the 1GB mark on my system due to database and ML integration.

Jellyfin

I have a lot of personal media, including images and videos from family functions and special occasions. Jellyfin serves as a perfect tool to stream them whenever I want to, without the hassle of reconnecting the hard drives to my system.

I can watch them on my phone via the browser or app, and it needs about 400MB to work. Since it is not a very high-quality media (1080p being the highest), streaming on multiple devices is not an issue. However, my server rarely has two or more concurrent users and can handle it.

Portainer, Uptime Kuma, and Beszel

I use Uptime Kuma to glance at all the container states quickly. It can tell me the status of each Docker container and monitor its uptime with a detailed graph. It’s sometimes better than opening Portainer and then finding what each container is up to.

However, it doesn’t show system resource usage, which is why I also use Beszel (a difficult name to pronounce). Beszel can show overall system resource usage and your Docker container stats with stunning graphs and tables.

I like the minimalist approach, where you can add multiple Docker instances from your other systems, like a Raspberry Pi or a mini PC, to visualize everything on one page. It’s fairly easy to set up with a Docker compose file and start logging everything.

These two containers use about 200MB, which is not bad for such extensive monitoring and live metrics. Portainer uses under 100MB, but it is essential to manage my containers because I hate using the terminal.

Flawless performance with limited resources

It’s absolutely possible

I use the self-hosted service for myself only, and the system works nicely. I can use any tool I like and not overload the system so much that it stops responding. Even with all of this, there’s 1 GB of memory always available when any service needs it.

Even if I want to use the MX Linux system for routine testing or maintenance, I have enough memory to run a browser or an app. I always have the option to halt some containers temporarily, but that’s a rare case.

Jellyfin, NextCloud, and Immich are the most resource-hungry services on my list, but other lightweight ones like OmniTools, BentoPDF, and Portainer make a perfect balance. I had to swap out Stirling-PDF for multiple reasons, one of which was its astoundingly high 500MB memory usage under an idle state.

Choosing the correct containers

Picking the right set of containers can help you efficiently utilize the available memory and not break the server. For instance, if I were to put NextCloud and Jellyfin on a Pi Zero 2W, both would be unusable. So, it’s necessary to choose the ones that fit your system's hardware capabilities and also adopt the lightweight alternatives, if available.