
Docker & Containers: Beginner's Blog Tutorial
Docker & Containers: Beginner's Blog Tutorial
Containers package apps with their dependencies for consistent deployment anywhere. Docker is the #1 container platform used by 13M+ developers.
This tutorial builds from "hello world" to a production-ready web app + database stack.
Containers package apps with their dependencies for consistent deployment anywhere. Docker is the #1 container platform used by 13M+ developers.
This tutorial builds from "hello world" to a production-ready web app + database stack.
Why Docker in 2026?
Consistency: Same app behavior on laptop, server, cloud
Speed: Containers start in milliseconds vs. VM minutes
Scale: Run 100s of microservices efficiently
Jobs: Docker skills boost resumes 40% (LinkedIn data)
Consistency: Same app behavior on laptop, server, cloud
Speed: Containers start in milliseconds vs. VM minutes
Scale: Run 100s of microservices efficiently
Jobs: Docker skills boost resumes 40% (LinkedIn data)
Quick Setup (3 Minutes)
Windows/Mac: Download Docker Desktop from docker.com
Linux:
bashcurl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER # Logout/login
Verify: docker --version + docker run hello-world
Windows/Mac: Download Docker Desktop from docker.com
Linux:
bashcurl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # Logout/login
Verify: docker --version + docker run hello-world
Docker Basics: Images vs Containers
Concept What It Is Analogy Image App + dependencies blueprint Recipe Container Running instance of image Cooked meal Dockerfile Instructions to build image Recipe card
First container:
bashdocker run -d -p 80:80 nginx
Visit localhost → Nginx welcome page running!
| Concept | What It Is | Analogy |
|---|---|---|
| Image | App + dependencies blueprint | Recipe |
| Container | Running instance of image | Cooked meal |
| Dockerfile | Instructions to build image | Recipe card |
First container:
bashdocker run -d -p 80:80 nginx
Visit localhost → Nginx welcome page running!
Write Your First Dockerfile
Create a simple Node.js app:
package.json:
json{"name": "docker-demo", "version": "1.0.0", "dependencies": {"express": "^4.18.0"}}
app.js:
javascriptconst express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello Docker!'));
app.listen(3000, () => console.log('Running on port 3000'));
Dockerfile:
textFROM node:22-alpine # Lightweight base image
WORKDIR /app # Set working directory
COPY package*.json ./ # Copy package files
RUN npm install # Install dependencies
COPY . . # Copy source code
EXPOSE 3000 # Document port
CMD ["node", "app.js"] # Default command
Build & run:
bashdocker build -t my-node-app .
docker run -p 3000:3000 my-node-app
localhost:3000 shows "Hello Docker!"
Create a simple Node.js app:
package.json:
json{"name": "docker-demo", "version": "1.0.0", "dependencies": {"express": "^4.18.0"}}
app.js:
javascriptconst express = require('express'); const app = express(); app.get('/', (req, res) => res.send('Hello Docker!')); app.listen(3000, () => console.log('Running on port 3000'));
Dockerfile:
textFROM node:22-alpine # Lightweight base image WORKDIR /app # Set working directory COPY package*.json ./ # Copy package files RUN npm install # Install dependencies COPY . . # Copy source code EXPOSE 3000 # Document port CMD ["node", "app.js"] # Default command
Build & run:
bashdocker build -t my-node-app . docker run -p 3000:3000 my-node-app
localhost:3000 shows "Hello Docker!"
Essential Docker Commands
bashdocker ps # List running containers
docker ps -a # All containers
docker stop <container> # Stop container
docker rm <container> # Remove container
docker images # List images
docker rmi <image> # Remove image
docker logs <container> # View logs
Clean everything:
bashdocker rm -f $(docker ps -aq) # Remove all containers
docker rmi -f $(docker images -aq) # Remove all images
bashdocker ps # List running containers docker ps -a # All containers docker stop <container> # Stop container docker rm <container> # Remove container docker images # List images docker rmi <image> # Remove image docker logs <container> # View logs
Clean everything:
bashdocker rm -f $(docker ps -aq) # Remove all containers docker rmi -f $(docker images -aq) # Remove all images
Persistent Data with Volumes
Containers lose data when stopped. Volumes persist it.
bash# Create named volume
docker volume create mydata
# Run with volume
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=pass -v mydata:/var/lib/postgresql/data postgres
List volumes: docker volume ls
Containers lose data when stopped. Volumes persist it.
bash# Create named volume docker volume create mydata # Run with volume docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=pass -v mydata:/var/lib/postgresql/data postgres
List volumes: docker volume ls
Docker Compose: Multi-Container Apps
Real apps need web server + database. Docker Compose orchestrates them.
docker-compose.yml:
textservices:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DB_HOST=db
db:
image: postgres:15
environment:
- POSTGRES_DB=app
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Run everything:
bashdocker compose up --build
Now you have web (localhost:3000) + database connected!
Real apps need web server + database. Docker Compose orchestrates them.
docker-compose.yml:
textservices: web: build: . ports: - "3000:3000" depends_on: - db environment: - DB_HOST=db db: image: postgres:15 environment: - POSTGRES_DB=app - POSTGRES_USER=user - POSTGRES_PASSWORD=pass volumes: - postgres_data:/var/lib/postgresql/data volumes: postgres_data:
Run everything:
bashdocker compose up --build
Now you have web (localhost:3000) + database connected!
Production Deployment
Push to Docker Hub:
bashdocker tag my-node-app yourusername/my-node-app
docker push yourusername/my-node-app
Deploy to Render/DigitalOcean:
Connect GitHub repo with Dockerfile
Auto-builds on push
Zero-config deployment
Push to Docker Hub:
bashdocker tag my-node-app yourusername/my-node-app docker push yourusername/my-node-app
Deploy to Render/DigitalOcean:
Connect GitHub repo with Dockerfile
Auto-builds on push
Zero-config deployment
Project: Full-Stack Todo App
Complete docker-compose.yml:
textservices:
frontend:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./dist:/usr/share/nginx/html # React build
backend:
build: ./backend
ports:
- "3001:3001"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/todos
db:
image: postgres:15
environment:
POSTGRES_DB: todos
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
redis:
image: redis:alpine
One command runs everything: docker compose up -d
Complete docker-compose.yml:
textservices: frontend: image: nginx:alpine ports: - "80:80" volumes: - ./dist:/usr/share/nginx/html # React build backend: build: ./backend ports: - "3001:3001" environment: - DATABASE_URL=postgresql://user:pass@db:5432/todos db: image: postgres:15 environment: POSTGRES_DB: todos POSTGRES_USER: user POSTGRES_PASSWORD: pass redis: image: redis:alpine
One command runs everything: docker compose up -d
Common Errors & Solutions
Error Fix port already allocateddocker ps → docker stop <container>no space leftdocker system prune -apermission deniedsudo chown -R $USER ~/.dockerimage pull failedCheck internet + Docker Hub login
| Error | Fix |
|---|---|
port already allocated | docker ps → docker stop <container> |
no space left | docker system prune -a |
permission denied | sudo chown -R $USER ~/.docker |
image pull failed | Check internet + Docker Hub login |
Docker Cheat Sheet
bash# Daily workflow
docker compose up -d # Start stack
docker compose logs -f web # Follow web logs
docker compose down # Stop everything
# Debug
docker exec -it <container> sh # Shell access
docker stats # Resource usage
bash# Daily workflow docker compose up -d # Start stack docker compose logs -f web # Follow web logs docker compose down # Stop everything # Debug docker exec -it <container> sh # Shell access docker stats # Resource usage
Next Steps
Convert existing project: Add Dockerfile to your repo
CI/CD: GitHub Actions auto-deploy
Kubernetes: Scale to 1000s of containers
Challenge: Dockerize your current app, share link!
Starter repo: GitHub search "docker-compose fullstack example"
Containers unlock DevOps superpowers. Bookmark, practice daily, deploy weekly. Share your first containerized app URL below! 🚢
Convert existing project: Add Dockerfile to your repo
CI/CD: GitHub Actions auto-deploy
Kubernetes: Scale to 1000s of containers
Challenge: Dockerize your current app, share link!
Starter repo: GitHub search "docker-compose fullstack example"
Containers unlock DevOps superpowers. Bookmark, practice daily, deploy weekly. Share your first containerized app URL below! 🚢
Comments
No comments yet. Be the first to share your thoughts.


