Before Docker, deploying applications was a nightmare called "Dependency Hell". "It works on my machine but not on production" was the most common excuse in the industry.
Docker changed everything. It standardized how we package, ship, and run software. In this guide, we'll look at the history of this revolution and how to use it today.
1. History: From dotCloud to World Domination

The Beginning (2013)
The story begins at a small PaaS startup called dotCloud. Solomon Hykes, the founder, presented a demo at PyCon US 2013. He showed a tool that could wrap an application and its dependencies into a lightweight, portable container.
It was originally just an internal tool built on top of LXC (Linux Containers). But when they open-sourced it as "Docker", it exploded.
Why did it win?
At the time, Virtual Machines (VMs) like VMware and VirtualBox were the standard. But they were heavy.
- VM: Requires a full Guest OS (GBs of size, minutes to boot).
- Container: Shares the Host OS kernel (MBs of size, milliseconds to boot).
Docker made containers accessible to mere mortals. It provided a simple command-line interface and a standard file format (Dockerfile).
2. Installation: Docker Desktop vs OrbStack
To use Docker on your Mac or Windows machine, you need a runtime.
- Docker Desktop: The official, standard tool. Feature-rich but can be heavy on resources.
- OrbStack: The new challenger for macOS. It's blazing fast, lightweight, and native. If you are on a Mac, I highly recommend OrbStack.
3. Basic Commands You Must Know
Open your terminal and try these commands.
My First Container
docker run hello-world
This fails locally first, downloads the image from Docker Hub, runs it, prints a message, and exits. All in seconds.
Running a Web Server
# Run Nginx in background (-d) and map port 8080 to 80 (-p) docker run -d -p 8080:80 --name my-nginx nginx
Now open http://localhost:8080 in your browser. You have a web server running without installing Nginx on your Mac!
Checking Status
# List running containers docker ps
Go Inside the Container
# Execute bash inside the running container docker exec -it my-nginx bash
Cleanup
# Stop the container docker stop my-nginx # Remove the container docker rm my-nginx
4. Infrastructure as Code: Dockerfile
Running commands manually is hard to reproduce. We use a Dockerfile to define the image.
# Dockerfile FROM node:20-alpine WORKDIR /app COPY package.json . RUN npm install COPY . . CMD ["npm", "start"]
Then build it:
docker build -t my-app .
5. Orchestration: Docker Compose
Real apps have a database, a cache, and a backend. Managing them with docker run is painful. Enter Docker Compose.
# compose.yaml services: web: build: . ports: - "3000:3000" db: image: postgres environment: POSTGRES_PASSWORD: password
Just type docker compose up, and your entire environment is ready.
Conclusion
Docker is no longer just a "DevOps tool". It is a fundamental skill for every developer. It guarantees that your code runs exactly the same way everywhere. Start containerizing your projects today!