What a container is
Installing an app the old way scatters its files across the system, and two apps that need different versions of the same library can break each other. A container avoids that. It’s a sealed package holding one app and everything it needs to run, kept in its own space on your server. Remove it and nothing is left behind.
Docker is the program that downloads and runs containers. The package you download is called an image, and a running copy of it is a container. Projects publish their images on sites such as Docker Hub, and the same image runs the same way on any Linux machine. That’s why the install instructions for almost every self-hosted app start with Docker.
Where the data lives: understand this first
A container is meant to be thrown away. When you update an app, Docker deletes the old container and makes a new one from the new image, and anything stored inside the old container goes with it.
So every app that keeps data is given a folder on your server to write into. This is called a volume, or a bind mount when it points at a folder you chose. The app sees the folder as part of itself, but it really lives on your server’s disk, so it survives updates. That folder is the thing you back up.
Before you trust an app with photos or passwords, find out where its folder is and make sure your backups include it.
How a compose file works
Each app is described by a short text file called compose.yaml. You don’t need to write one from scratch, because projects publish them, but it helps to be able to read one. This is the official file for Uptime Kuma, a small app that checks your other apps are still up:
services:
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- ./data:/app/data
ports:
- "3001:3001"
imagesays what to download. The part after the colon is the tag, which picks the version: here, the version 2 series.restart: unless-stoppedstarts the app again after a crash or a reboot, unless you stopped it yourself.volumesis the data folder. The left side is a folder on the server (here, one calleddatanext to the compose file), and the right side is where the app sees it.portsconnects the server to the app. The left number is the port on the server and the right is the port inside the container, so you’d openhttp://your-server:3001. Two apps can’t share the same left-hand number, so change the left side if it’s taken.
That file is everything ZimaOS, Dockge or Portainer need to install the app for you.
What it needs
- A 64-bit Linux system for Docker Engine. On a Windows or Mac computer, Docker Desktop runs the same containers in a window, and it’s free for personal use, but the apps stop when the computer sleeps.
- Memory for the apps. Each container uses only what its app needs. Small tools use very little; photo, media and AI apps want much more.
- The right image for your chip. A Raspberry Pi needs images built for Arm chips. Most popular apps publish both kinds, and the image’s page says which it has.
- Somewhere to keep compose files, one folder per app, alongside its data.
How Docker Engine with Compose fits in
- One file per app. Each app’s whole setup is a short file in its own folder, easy to read, copy and back up.
- The same few commands for everything. Start, stop and update work the same way for every app.
- The same file everywhere. A compose file from a project’s instructions works on Ubuntu, Debian or Raspberry Pi OS, and it’s what ZimaOS imports.
- Apps kept apart. One app’s update can’t break another app’s libraries.
- Clean removal. Delete the container and its folder, and the app is gone.
- Buttons if you want them. Dockge, Portainer and the other options below put a web page on top of the same files.
The easy way to set it up
ZimaOS has Docker built in, and its App Store is a catalogue of ready-made compose files. Nothing here needs the terminal:
- Install ZimaOS on a spare computer. The server operating systems page shows how.
- Install from the App Store. Search for the app and install it. Its icon appears on the dashboard.
- Add anything else from its compose file. Press + on the dashboard, choose Install a customized app, then Import, and paste the project’s compose file. Check the ports and folders it shows before you install.
- See everything in detail, if you want to, by installing Portainer from the App Store.
ZimaOS also marks apps that have an update waiting.
On a Windows or Mac computer, install Docker Desktop with its normal installer. Its window lists your containers and images with start, stop and delete buttons. Starting a compose file still takes one typed command, docker compose up -d, run in the file’s folder.
The terminal route. On Ubuntu, Debian or Raspberry Pi OS, install Docker Engine by following the steps for your system on docs.docker.com, put each compose.yaml in its own folder, and start it with that same command. The Linux command line page covers moving between folders.
Questions people ask
Is Docker safe?
Containers are kept apart from each other, but they aren’t as sealed off as a virtual machine, and anything that controls Docker can control the whole server. Use images from the project itself or from LinuxServer.io, publish only the ports you need, and reach admin pages from outside the house through remote access rather than opening them to the internet.
How do I update an app?
Download the new image and recreate the container. ZimaOS, Dockge and Portainer do it from the app’s page, and in the terminal it’s the two commands in the pick above. Data in volumes survives. Before a big version jump, read the app’s release notes and make a backup.
What does “latest” mean in an image name?
It’s a tag meaning “whatever the newest version is”. That’s convenient, but an update can jump a major version without warning. A version tag, like :2 in the example above, keeps you on one series until you choose to move.
Where do I find a compose file for an app?
In the project’s own install instructions; search its documentation for “Docker Compose”. If a project only gives a docker run command, Dockge can turn it into a compose file. LinuxServer.io publishes compose examples for every image it builds.
How is a container different from a virtual machine?
A container shares the server’s core, the kernel, and holds one app. A virtual machine carries a whole operating system of its own. Use containers for apps, and a VM when you need a different system, such as Windows.
