Docker is the fastest way to self-host applications in a home lab. This guide walks through installing Docker on Ubuntu and deploying a base stack of five essential containers using Docker Compose — no prior Docker experience required.
Add your user to the
Paste in the full compose file from the GitHub repository. Here’s the structure covering all five services:
Check everything is running:
🎥 Watch the Video Tutorial
💡 Why Docker Compose?
Running containers one at a time withdocker run gets messy fast. Docker Compose lets you define your entire stack in a single YAML file. One command brings the whole stack up; one command tears it down. It’s the right way to manage a multi-container home lab from day one.
ℹ️ Note: Environment used in this guide: Proxmox VM running Ubuntu 24.04.3 LTS. The steps work on any Ubuntu or Debian system, bare-metal or VM.
🛠 What You’ll Need
- Ubuntu 22.04 or 24.04 (VM or bare-metal)
- SSH access or terminal on the Ubuntu machine
- Internet connection for pulling images
- Files from this guide (GitHub)
📋 Step-by-Step Setup
1. Install Docker
The quickest way to install Docker on Ubuntu is the official convenience script:curl -fsSL https://get.docker.com | sh
docker group so you can run Docker commands without sudo:
sudo usermod -aG docker $USER newgrp docker
2. Create the Docker Compose file
mkdir ~/homelab-stack && cd ~/homelab-stack nano docker-compose.yml
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
it-tools:
image: corentinth/it-tools:latest
container_name: it-tools
restart: unless-stopped
ports:
- "8080:80"
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_SCHEDULE=0 0 4 * * *
- WATCHTOWER_CLEANUP=true
syncthing:
image: lscr.io/linuxserver/syncthing:latest
container_name: syncthing
restart: unless-stopped
ports:
- "8384:8384"
volumes:
- syncthing_config:/config
- ~/sync:/data
tailscale:
image: tailscale/tailscale:latest
container_name: tailscale
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
volumes:
- tailscale_state:/var/lib/tailscale
environment:
- TS_AUTHKEY=your-tailscale-auth-key
volumes:
portainer_data:
syncthing_config:
tailscale_state:
3. Start the stack
docker compose up -d
docker compose ps
4. Access your containers
Replaceserver-ip with your Ubuntu machine’s IP address:
- Portainer (container management UI) →
http://server-ip:9000 - IT-Tools (browser toolkit) →
http://server-ip:8080 - Syncthing (file sync) →
http://server-ip:8384 - Watchtower runs silently in the background, updating containers on schedule
- Tailscale — authenticate with:
docker exec tailscale tailscale up
⚠️ Warning: Replace
your-tailscale-auth-key in the compose file with a real ephemeral auth key from your Tailscale admin console at tailscale.com/admin/settings/keys.💡 Tip: Store your
docker-compose.yml in a private GitHub or Gitea repo. Combined with named volumes, this means you can rebuild your entire stack on a new machine in minutes.✅ Conclusion
You now have a running Docker stack with five essential home lab containers — all managed by a single Compose file. Add new containers by appending services to the Compose file and runningdocker compose up -d again.
📺 Watch the full video guide here: https://youtu.be/kE0wreAUPqQ
If you found this helpful, like and subscribe to IT HomeLab Online on YouTube for more tutorials.
☕ Support the channel: Patreon · Buy Me a Coffee