Docker Is the Engine, Portainer Is the Dashboard: Why I Use Portainer in Realm Labs

Portainer is probably one of the longest-running pieces of software in Realm Labs.

Long before the current Synology, Proxmox, Home Assistant and centralised automation setup existed, I was already using Docker on a Raspberry Pi.

And almost immediately, I put Portainer on top of it.

Over time, the hardware changed.

I moved from Raspberry Pi-based Docker hosts to a Synology DS224+ capable of running containers itself.

Synology eventually gave me its own Container Manager interface too.

Yet Portainer stayed.

The reason is simple.

I don’t really use Portainer instead of Docker.

I use Portainer because of Docker.

Docker is the engine underneath everything.

Portainer is the dashboard that makes managing it considerably more pleasant.

Where It Started: Docker on a Raspberry Pi

One of my earlier home-lab setups used a Raspberry Pi 4 as a Docker host.

The arrangement was fairly simple:

Raspberry Pi 4
     |
     v
   Docker
     |
     +-- OpenHAB
     +-- Node-RED
     +-- Other containers
     |
     v
  Portainer

Docker was doing the actual work.

Portainer simply gave me a web interface for controlling it.

Instead of spending all my time at:

docker ps
docker inspect
docker logs

and constructing increasingly long docker run commands, I could open a browser.

At the time, my Portainer interface was available on port:

9000

and that rapidly became my normal way of interacting with Docker.

Portainer Isn’t a Replacement for Docker

This is worth clearing up because the names are often spoken about as though they’re competing products.

They aren’t.

The stack is really:

Applications
     |
     v
Containers
     |
     v
Docker Engine
     ^
     |
 Portainer
     ^
     |
 Web Browser

Docker runs the containers.

Portainer talks to Docker and gives me a graphical way to manage them.

If I delete Portainer:

Docker keeps running.

The other containers keep running.

The networks remain.

The volumes remain.

Portainer is just the management layer.

I proved this to myself years ago when I needed to update Portainer on the Pi.

I stopped and removed the Portainer container, pulled a newer image and recreated it using the same persistent portainer_data volume.

Everything else continued running throughout.

That was the moment the distinction really clicked.

Why I Installed Portainer So Early

When I first started learning Docker, the command line wasn’t particularly difficult.

The problem was remembering everything surrounding a container.

An application might need:

Image
Ports
Volumes
Environment variables
Network mode
Restart policy
Container name

A command could quickly become:

docker run -d \
  --name application \
  --restart unless-stopped \
  -p 8080:80 \
  -v /some/path:/config \
  -e SOME_VARIABLE=value \
  application/image:latest

There’s nothing wrong with that.

But when you’re learning Docker while simultaneously learning whatever application you’re deploying, Portainer makes the whole arrangement much easier to visualise.

My Early OpenHAB Experiment

One of the earliest examples was OpenHAB on the Raspberry Pi.

Rather than building the entire deployment from the command line, I was using Portainer’s workflow:

Containers
    |
    v
Add Container

Then configure:

Image
Network
Volumes
Environment variables
Restart policy

and deploy it.

The OpenHAB attempt itself wasn’t completely painless.

I hit issues pulling:

openhab/openhab:latest

which led into questions around images, tags and ARM compatibility.

But Portainer made it much clearer which part of the deployment I was actually changing.

That helped while I was still getting comfortable with Docker.

Portainer Made Docker Visible

This is probably the biggest reason I kept it.

From one screen I can see:

Running containers
Stopped containers
Images
Volumes
Networks
Stacks
Logs
Resource usage

Without Portainer, all of that information still exists.

It’s just spread across Docker commands.

For example:

docker ps

shows containers.

Then:

docker images

shows images.

Then:

docker volume ls

shows volumes.

Then:

docker network ls

shows networks.

Portainer puts them together.

It Also Helped Me Understand Docker

Ironically, using a GUI didn’t stop me learning the command line.

It actually helped.

Portainer showed the relationship between:

Container
Image
Port
Volume
Network
Environment

in a way that was immediately visible.

Once I understood that relationship, the equivalent Docker and Compose configuration made much more sense.

It became:

Portainer teaches me what exists.

Docker CLI teaches me how it works.

I still use both.

Then Synology Entered the Picture

As Realm Labs developed, more of the infrastructure moved onto my Synology NAS.

The current storage platform is a:

Synology DS224+

Unlike some Synology models that don’t provide the same container capability, the DS224+ supports Synology’s container platform.

That meant the NAS could become a Docker host in its own right.

The architecture started changing from:

Raspberry Pi
     |
   Docker
     |
 Portainer

to:

Synology DS224+
      |
Container Platform
      |
   Containers

This was a fairly major step.

The Pi no longer had to be the machine running every service.

Synology Container Manager

Synology provides its own management interface for containers through DSM.

That interface is perfectly capable of performing the basics.

I can manage things such as:

Containers
Images
Projects
Networks
Resource usage

directly inside DSM.

So technically, I didn’t need Portainer anymore.

But I installed it anyway.

Why Keep Portainer If Synology Already Has a GUI?

Consistency.

That is probably the biggest reason.

Portainer works like Portainer regardless of whether the Docker host underneath it is:

Raspberry Pi
Linux server
Synology NAS
VM

The underlying hardware can change.

My management workflow doesn’t.

That became increasingly useful as Realm Labs expanded.

My Workflow Stayed the Same

On the Raspberry Pi I had learned:

Portainer
    |
    +-- Containers
    +-- Images
    +-- Networks
    +-- Volumes
    +-- Stacks

When I moved workloads to Synology, I could use exactly the same mental model.

I didn’t have to relearn container management around the NAS vendor’s interface.

That consistency matters more than I initially expected.

Stacks Became Particularly Useful

One Portainer feature I grew to like was stacks.

Instead of manually creating a container through dozens of individual fields, I could use Docker Compose-style YAML.

For example:

services:

  app:
    image: example/application:latest
    container_name: application

    ports:
      - "8080:80"

    volumes:
      - /volume1/docker/application:/config

    restart: unless-stopped

Then deploy it as a stack.

That gives me the convenience of Portainer while keeping the configuration visible.

This Is Better Than Clicking Everything Forever

The graphical Add Container workflow is excellent when experimenting.

But eventually I want the deployment itself documented.

A stack gives me that.

Instead of having to remember:

Which volume did I mount?
Which port did I use?
What environment variable did I add?

the YAML tells me.

That’s why my use of Portainer evolved.

Initially:

Portainer = easier way to create containers

Later:

Portainer = interface for managing Compose-based infrastructure

That’s a much healthier approach.

Synology Paths Fit Nicely into Stacks

The Synology also gave me a logical place for persistent container data.

For example:

/volume1/docker/

or similar project-specific directories.

A stack could contain:

volumes:
  - /volume1/docker/nodered:/data

That makes it immediately obvious where the data lives.

The container can disappear.

The data remains on the NAS.

Portainer Helped During Failed Deployments Too

Not every Realm Labs container worked first time.

Far from it.

One older example was a PXE experiment on the Synology.

I used Portainer to build a stack involving:

dnsmasq
nginx

with data stored beneath Synology paths.

Then I discovered that some of the Docker images I was trying to use either weren’t available or didn’t have the tags I expected.

Portainer made rebuilding and adjusting the stack quick while I worked through those issues.

That kind of experimentation is exactly where I find it useful.

Then There Was Pi-hole

Another Synology experiment involved trying to run Pi-hole through the container platform.

Again, Portainer/Container Manager wasn’t the actual limitation.

The underlying host was.

Pi-hole needed:

DNS port 53

and the Synology was already using it.

I could map its web interface:

8181 -> 80

without a problem.

But normal DNS still needed:

53

That eventually led to Pi-hole moving elsewhere.

This was an important Docker lesson.

A container management GUI can make deployment easy.

It cannot override the fundamental limitations of the host.

The Same Happened with WireGuard

WireGuard was another good example.

I could define the container perfectly well.

Portainer could deploy it.

But the Synology kernel didn’t provide what WireGuard needed.

The result was:

RTNETLINK answers: Not supported

Again:

Portainer wasn't broken.
Docker wasn't broken.

The host simply couldn’t provide the required kernel capability.

That distinction became much easier to understand as I got more comfortable with the layers.

Portainer Doesn’t Hide the Command Line

If something goes wrong, I still drop into SSH.

For example:

docker ps
docker logs container-name
docker inspect container-name
docker network inspect network-name

Portainer is not an excuse to avoid learning Docker.

It is simply my preferred normal management interface.

The CLI remains the troubleshooting tool underneath it.

I Use Both

My actual workflow is probably best described as:

Normal management
      |
      v
Portainer

Troubleshooting
      |
      v
Docker CLI

Repeatable deployments
      |
      v
Compose / Stacks

I don’t see any need to choose one.

They complement each other.

Why Not Just Use Synology Container Manager?

There is nothing particularly wrong with Synology Container Manager.

In fact, it’s useful to have.

If Portainer itself breaks, I still have another way into the container environment.

But I prefer Portainer for day-to-day management because it isn’t tied to Synology.

That’s especially relevant to Realm Labs.

Today a container may live on:

Seido

Tomorrow I could move it to:

Proxmox

or:

A Raspberry Pi

or:

Another Linux host

The application changes location.

Portainer’s workflow doesn’t need to change.

Portainer Also Makes Migration Easier to Think About

A good container should be portable.

The architecture I aim for is:

Container
    |
    +-- Image
    +-- Environment
    +-- Ports
    +-- Persistent volume

If all of that is documented in a stack, moving the workload becomes much easier.

For example:

Old Docker Host
      |
      v
Copy persistent data
      |
      v
New Docker Host
      |
      v
Deploy same stack

That’s exactly the kind of flexibility I want in a home lab.

Why I Don’t Treat the Synology as Special

This might sound odd because the DS224+ is one of the most important machines in Realm Labs.

But for containers, I don’t particularly want application configuration that only makes sense inside DSM.

I want:

Docker-style configuration

that I can understand and move elsewhere.

Portainer helps maintain that separation.

The Synology provides:

Compute
Storage
Networking

Portainer manages:

Containers

The application doesn’t need to care that the hardware happens to be a NAS.

Portainer Itself Is Disposable

Another thing I like is that Portainer follows the same rule as the containers it manages.

The Portainer container itself can be deleted.

Its persistent state lives separately in:

portainer_data

So an update is essentially:

Stop Portainer
      |
      v
Remove old container
      |
      v
Pull new image
      |
      v
Recreate container
      |
      v
Reconnect portainer_data

The managed Docker environment carries on underneath it.

That is a reassuring design.

My Container Management Evolution

Looking back, my own progression was roughly:

Stage 1

Raspberry Pi
   |
Docker CLI

Then:

Stage 2

Raspberry Pi
   |
Docker
   |
Portainer

Then:

Stage 3

Synology DS224+
   |
Container platform
   |
Portainer

And now:

Stage 4

Multiple infrastructure platforms
       |
       v
Docker / Containers
       |
       v
Compose-style definitions
       |
       v
Portainer for management

The technology became more complicated.

My management interface actually became more consistent.

Would I Start with Portainer Again?

Absolutely.

Especially for somebody learning Docker.

Not because the command line is too difficult.

But because Portainer makes the architecture visible.

You can see:

This container uses this image.

This port maps here.

This folder maps there.

This network connects these containers.

This volume contains the persistent data.

Once that makes sense visually, Docker Compose becomes considerably less mysterious.

But Learn Docker Underneath It

I wouldn’t recommend treating Portainer as magic.

Eventually, you need to understand:

Host port vs container port

Bind mount vs volume

Container vs image

Bridge vs host networking

Environment variables

Restart policies

Persistent data

When something goes wrong, those concepts matter far more than which button you clicked in Portainer.

Why I Still Use It Today

Portainer has survived several generations of Realm Labs because it solves a very simple problem well.

Docker is incredibly powerful.

But I don’t need every interaction with Docker to be a terminal session.

Sometimes I just want to open a browser and see:

Home Assistant     Running

Node-RED           Running

Mosquitto          Running

Grafana            Running

Portainer          Running

Then open a container, inspect its logs, restart it or edit a stack.

Portainer makes that effortless.

The Realm Labs Takeaway

I sometimes describe the setup as:

I use Portainer instead of Docker.

But technically that isn’t right.

The better description is:

Docker runs Realm Labs containers.

Portainer is how I prefer to manage Docker.

The relationship is:

                   Portainer
                       |
                       v
                    Docker
                       |
        +--------------+--------------+
        |              |              |
        v              v              v
    Node-RED        Mosquitto       Grafana

I started using that arrangement on a Raspberry Pi.

Later, Synology models such as my DS224+ gave me a capable container host with its own management interface.

But Portainer stayed because the hardware underneath stopped mattering.

Whether I’m running containers on a Pi, NAS or another Linux system, I get the same familiar interface and the same workflow.

Docker is the engine.

Portainer is the dashboard.

And after years of using both, that’s still the combination I prefer.