Best 5 Home Server Projects to start learning Docker in 2025
I am a huge fan of projects to get started with using and becoming familiar with Docker. I think we will continue to see a shift to containerization from VMs due to the massive cost hikes from Broadcom. Most organizations will look to see how they can refactor their apps, minimize their VM estate and start becoming more efficient. Learning Docker in 2025 is a key to success moving forward. Let’s look at the best 5 home server projects to start learning in 2025.
Table of contents
- Why learn Docker as a home server project?
- 1. Pick a VM and migrate your application to a container
- 2. Stand up a reverse proxy container like Nginx Proxy Manager or Traefik
- 3. Spin up a Docker GUI management tool
- 4. Spin up a Docker Dashboard as a home server project
- 5. Spin up a Gitea code repo
- Wrapping up
Why learn Docker as a home server project?
Docker is the de facto standard for containerization. Its container technology is the foundation of what started the containerization movement. Docker hub has millions of container images and is the go to tool for developers, DevOps professionals, and those looking to streamline running their applications.
By learning docker, you are setting yourself up for understanding many other concepts and tools that will accelerate your journey into DevOps, Kubernetes, and other tools.
1. Pick a VM and migrate your application to a container
This is my favorite Docker home server project that I think anyone can embark on for learning. In your home lab, pick a solution that you are running inside a full virtual machine. I like to use the example of Pi-Hole since it is a favorite solution that runs in many home networks/home labs.
If you have your Pi-Hole container running in a virtual machine, spin this up in a container and then backup your configuration on your virtual machine instance, and restore this in your containerized Pi-Hole instance.
Your Pi-hole docker-compose code might look something like this:
pihole:
image: pihole/pihole:latest
container_name: pihole
restart: always
ports:
- "53:53/tcp"
- "53:53/udp"
dns:
- 127.0.0.1
- 1.1.1.1
environment:
TZ: 'America/Chicago'
WEBPASSWORD: 'password'
PIHOLE_DNS_: 1.1.1.1;9.9.9.9
DNSSEC: 'false'
WEBTHEME: default-dark
volumes:
- '~/homelabservices/pihole/pihole:/etc/pihole/'
- '~/homelabservices/pihole/dnsmasq.d:/etc/dnsmasq.d/'
networks:
- pihole
networks:
pihole:
driver: bridge
name: pihole
2. Stand up a reverse proxy container like Nginx Proxy Manager or Traefik
Spinning up a solution like Nginx Proxy Manager (NPM) or Traefik as one of your home server projects is a great way to introduce powerful SSL certificate management in your environment, both for containers, but also for your external hosts outside of your containerized environment.
We all know how much of a pain manually managing certificates can be. With a reverse proxy solution, you can terminate your SSL certificates in the proxy and have certificate automation that will automatically pull Let’s Encrypt certificates for your hostnames you have configured.
The simple code to configure Nginx Proxy Manager in docker-compose:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- npm
networks:
npm:
driver: bridge
name: npm
Code for Traefik in Docker compose will look like the following example:
version: '3.8'
services:
traefik2:
image: traefik:latest
restart: always
command:
# Discover containers using the Docker API
- --providers.docker=true
# Enable the Traefik dashboard
- --api.dashboard=true
# Set up Let's Encrypt with Cloudflare DNS challenge
- --certificatesresolvers.letsencrypt.acme.dnschallenge=true
- --certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare
- --certificatesresolvers.letsencrypt.acme.email=<your_cloudflare_email>
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
# Set up HTTP listener to redirect all traffic to HTTPS
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
# Set up HTTPS listener with TLS configuration
- --entrypoints.websecure.address=:443
- --entrypoints.websecure.http.tls=true
- --entrypoints.websecure.http.tls.certResolver=letsencrypt
- --entrypoints.websecure.http.tls.domains[0].main=<your_domain>
- --entrypoints.websecure.http.tls.domains[0].sans=*.<your_domain>
- --serverstransport.insecureskipverify=true
environment:
CLOUDFLARE_EMAIL: "<your_cloudflare_email>"
CLOUDFLARE_DNS_API_TOKEN: "<your_cloudflare_token>"
ports:
- "80:80"
- "443:443"
networks:
- traefik
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /yourvolumemountfolder/letsencrypt:/letsencrypt
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.middlewares=strip"
- "traefik.http.middlewares.strip.stripprefix.prefixes=/traefik"
container_name: traefik
networks:
traefik:
driver: bridge
name: traefik
3. Spin up a Docker GUI management tool
When most are learning Docker from the command line, it can be challenging to manage everything from the command line, especially when you are starting out. There are a couple of really good tools I would recommend. These are Portainer and Komodo.
Portainer is my favorite as it has the most features and functionality. Portainer also has a free 3-node version for Business Edition that has additional features you can take advantage of. Komodo is another solution that is free and open source. There is no charge to run Komodo and it provides many similar features as Portainer.
To install Portainer:
version: '3.8'
services:
portainer:
image: portainer/portainer-ce:2.21.5
container_name: portainer
restart: always
ports:
- "8000:8000"
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- portainer
volumes:
portainer_data:
networks:
portainer:
driver: bridge
name: portainer
To install Komodo, see my detailed blog post here on the steps:
4. Spin up a Docker Dashboard as a home server project
There are many “home lab dashboard” solutions out there that you can choose to spin up in the home lab as a Docker project. These are very handy. However, I found they lacked what I was trying to do in my home lab. So, I built my own Docker Dashboard container that connects to the docker hosts you specify and it pulls the information about containers running on the hosts.
When you are getting started with Docker you may quickly spin up dozens of containers and may not know exactly where you have which container running in the environment. This is where a docker dashboard comes in handy.
See my Github repo here on how to build your simple docker dashboard container:
After you build your container image, you can stand up the dashboard using the command:
version: "3.8"
services:
docker-dashboard:
image: docker-dashboard
container_name: docker-dashboard
environment:
- CRON_SCHEDULE=*/5 * * * *
- DOCKER_HOSTS=root@cldocker,root@cldocker01
- TZ=America/Chicago
ports:
- "8080:80"
volumes:
- ./data:/var/www/html
networks:
dashboard:
driver: bridge
name: dashboard
5. Spin up a Gitea code repo
Once you start getting into Docker, it lends itself very well to git processes, since you are working with Docker-compose code quite a bit. I like to keep up with my stacks and other Docker-compose code with Git since it is easy to forget where you placed certain compose code or you can’t remember how you have something configured.
Plus in the process, you will learn Git and Git repos methdologies, which is a great step in conjunction with learning docker as a home server project.
A basic template of docker-compose code for Gitea will look like the following that you can customize:
version: "3.8"
services:
gitea:
image: gitea/gitea:latest
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=gitea-db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
- GITEA__service__DISABLE_REGISTRATION=true
- [email protected]
- GITEA__mailer__ENABLED=true
- GITEA__mailer__SMTP_ADDR=<your-server-ip-and-port>
- [email protected]
- GITEA__mailer__PROTOCOL=mail
networks:
- gitea
volumes:
- /yourvolumemountpath/gitea/data:/data
restart: always
gitea-db:
image: mysql:8
environment:
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks:
- gitea
volumes:
- /yourvolumemountpath/gitea-db/mysql-data:/var/lib/mysql
restart: always
networks:
gitea:
driver: bridge
name: gitea
Wrapping up
Are these 5 home server projects the only projects that you can tackle to learn Docker in 2025? Absolutely not. However, I think these projects listed above are ones that spring board into additional learning opportunities quickly and get you on your way to being proficient with Docker. Adding things like Git along with Docker learning will help you as well understand Git concepts and start using it in practical ways such as storing your docker-compose code.