published: true
description: "From Docker to Kubernetes β how I built, deployed, debugged, and verified a Node.js app locally using Minikube on Windows. A full hands-on DevOps learning experience."
tags: ["devops", "kubernetes", "docker", "node", "git", "minikube", "windows"]
cover_image: "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fq4x1xx7y9p8vyt3z8im.png"
π My DevOps Journey: Node.js + Kubernetes (Minikube) on Windows
A personal hands-on walkthrough of Docker, Kubernetes, and Git β how I containerized and deployed a Node.js app locally using Minikube, explored versioning, debugging, and real DevOps workflows.
π± Why I Did This
I wanted to move beyond tutorials and actually build and debug something real with Kubernetes.
So I set up Minikube on Windows, deployed a Node.js web app, managed Docker containers, and learned how everything connects β from YAML to running pods.
This project became a deep dive into how DevOps engineers really work.
π§© Project Overview
Hereβs what I built and tested:
- π³ Containerized a Node.js app using Docker
- βΈοΈ Deployed it inside Kubernetes (Minikube) cluster
- π Exposed the app externally using NodePort
- π§ͺ Verified version metadata (
version.json) like in real CI pipelines - π§° Managed everything using Git + PowerShell on Windows 11 Home
βοΈ Tools I Used
| Category | Tools & Versions |
|---|---|
| OS | Windows 11 Home |
| Runtime | Node.js (LTS) |
| Containers | Docker |
| Cluster | Kubernetes (Minikube v1.37.0) |
| Base Image | kicbase:v0.0.48 |
| Version Control | Git + GitHub |
| Testing | Go (iso_test.go concept) |
π§± Step 1: Setting up Minikube
I started my cluster using Docker as a driver:
minikube start
Minikube downloaded the base image (kicbase:v0.0.48) and booted a control-plane node.
Everything ran on Windows Home β no Hyper-V needed.
π³ Step 2: Dockerize the Node.js App
I wrote a simple Node.js server (app.js):
const http = require("http");
const PORT = 3000;
const server = http.createServer((req, res) => {
res.end("Hello from Node.js running inside Kubernetes!");
});
server.listen(PORT, () => console.log(`Server running on port ${PORT}`));
Then, I created a Dockerfile:
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
Built the image:
docker build -t node-k8s-demo .
βΈοΈ Step 3: Deploy on Kubernetes
Deployment YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-k8s-deployment
spec:
replicas: 1
selector:
matchLabels:
app: node-k8s
template:
metadata:
labels:
app: node-k8s
spec:
containers:
- name: node-k8s
image: node-k8s-demo
ports:
- containerPort: 3000
Service YAML
apiVersion: v1
kind: Service
metadata:
name: node-k8s-service
spec:
type: NodePort
selector:
app: node-k8s
ports:
- port: 3000
targetPort: 3000
nodePort: 30080
Applied configs:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
π Step 4: Expose and Access the App
Used Minikube to expose it externally:
minikube service node-k8s-service
β
Output:
NAMESPACE β NAME β TARGET PORT β URL
default β node-k8s-service β 3000 β http://192.168.49.2:30080
Then, visiting http://192.168.49.2:30080 opened my app π
π§ͺ Step 5: Version Verification (ISO Test Concept)
From a real Minikube test example (iso_test.go):
{
"iso_version": "v1.37.0-1758198818-20370",
"kicbase_version": "v0.0.48",
"minikube_version": "v1.37.0",
"commit": "a4f96d0469d67330691be52a99ff1f91e31ba77f"
}
I learned how build metadata (ISO version, commit IDs) ensures consistency in CI/CD β just like in real production releases.
π§ Step 6: Debugging, Logs & Restarts
Things didnβt always go perfectly.
- Sometimes the tunnel didnβt start β fixed by restarting Minikube
- Verified pods using
kubectl get pods - Checked logs with
kubectl logs <pod> - Cleaned up with
kubectl delete -f <file>
This taught me real DevOps problem-solving, not just running commands.
π§Ύ Step 7: Git & Documentation
I documented everything in Git and GitHub:
git init
git add .
git commit -m "Node.js Kubernetes demo setup"
git branch -M main
git remote add origin https://github.com/<your-username>/<repo>.git
git push -u origin main
Also added .gitignore and this detailed README.md (youβre reading the same content now π).
π‘ What I Learned
- Kubernetes architecture & Minikube internals
- Docker image creation & reusability
- YAML configuration & rolling updates
- Exposing services via NodePort
- Debugging tunnels and IP routing
- CI version validation (
version.jsoncheck) - Proper Git commits and repo structuring
- Documenting DevOps work cleanly
π Full Stack of What I Explored
β
Minikube lifecycle
β
Docker build, run, inspect
β
Kubernetes Deployments & Services
β
NodePort & local networking
β
ISO versioning and metadata validation
β
Windows compatibility handling
β
Git workflows
β
Debugging tunnels and pods
β
CI/CD thinking & test verification
π§ Final Thoughts
This wasnβt just a βMinikube tutorial.β
It was my complete DevOps learning journey β from writing code to deploying and validating it inside a Kubernetes cluster, all on Windows.
I learned that real DevOps is not about memorizing commands β itβs about understanding how every piece connects.
π§βπ» Author
Sheik
π‘ DevOps | Kubernetes | Docker | Git | Cloud Automation
π¦ Hands-on with containers, clusters, and CI/CD pipelines
π¬ Connect: GitHub | LinkedIn
If you found this post helpful, drop a β€οΈ or comment your Minikube experience!
Top comments (0)