Start here
What is Docker and why use it on a NAS?
Docker lets you run self-hosted apps in isolated containers. Instead of installing Jellyfin, Nextcloud, or Home Assistant directly on your NAS (which can break things), each app runs in its own box. They cannot interfere with each other, and they are easy to remove if you change your mind.
💡Think of Docker containers like apps on your phone. Each one is self-contained, easy to update, and easy to delete. Your NAS operating system stays clean underneath.
bash — the 5 Docker commands you need every day
$
docker ps
$
docker ps -a
$
docker logs -f jellyfin
$
docker restart jellyfin
$
docker stats
The right way
Using Docker Compose — a beginner guide
Docker Compose lets you define a container in a simple text file instead of typing a long command every time. It is much easier to manage, update, and back up.
Step 1Create a folder for your app
Keep each app in its own folder. This keeps things organised.
$
mkdir -p /opt/docker/jellyfin && cd /opt/docker/jellyfin
$
nano docker-compose.yml
Step 2Write a basic compose file
docker-compose.yml — Jellyfin example services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
ports:
- "8096:8096"
volumes:
- /opt/docker/jellyfin/config:/config
- /mnt/data/media:/media
environment:
- PUID=1000
- PGID=1000
Step 3Start it up
$
docker compose up -d
Container jellyfin started
Most common problem
Permission denied — container cannot write files
This is the number one Docker problem on NAS systems. The container tries to write to a folder but Linux says no. The fix is making the container user match the folder owner.
bash — fix permission errors in 3 steps
$
id
uid=1000(yourname) gid=1000(yourname) ← use these in PUID/PGID
$
sudo chown -R 1000:1000 /opt/docker/jellyfin/config
$
docker restart jellyfin
Keeping things fresh
How to update containers safely
Updating is easy but blindly pulling latest can sometimes break things. Here is the safe way.
bash — safe update process
$
docker pull jellyfin/jellyfin:latest
$
docker compose down && docker compose up -d
$
docker logs jellyfin --tail 30
image: jellyfin/jellyfin:latest
image: jellyfin/jellyfin:10.8.13 ← pin this in compose file
$
docker compose down && docker compose up -d