Skip to main content

Docker

A complete reference for working with Docker — images, containers, networks, volumes, and best practices.


⚙️ Basics

What is Docker?

  • Docker is a containerization platform that packages applications and dependencies into containers.
  • Containers are lightweight, isolated environments that run the same regardless of host OS.

📦 Common Commands

CommandDescription
docker versionShow Docker version info
docker infoShow system-wide information
docker helpList commands or get help for a command

🧱 Images

CommandDescription
docker imagesList local images
docker pull <image>Download image from Docker Hub
docker rmi <image>Remove image
docker build -t <name>:<tag> .Build image from Dockerfile
docker tag <image> <repo>:<tag>Tag image
docker push <repo>:<tag>Push image to registry

Example:

docker build -t myapp:latest .
docker push myusername/myapp:latest

🧩 Containers

CommandDescription
docker psList running containers
docker ps -aList all containers (including stopped)
docker run <image>Run a new container
docker run -it <image> bashRun interactively
docker start <container>Start existing container
docker stop <container>Stop container
docker restart <container>Restart container
docker rm <container>Remove container
docker logs <container>Show logs
docker exec -it <container> bashRun command inside running container
docker inspect <container>Detailed info (JSON)

Example:

docker run -d -p 8080:80 --name web nginx
docker exec -it web bash

🗂️ Volumes (Data Persistence)

CommandDescription
docker volume create <name>Create volume
docker volume lsList volumes
docker volume inspect <name>Inspect volume
docker volume rm <name>Remove volume

Mounting volumes:

docker run -v mydata:/var/lib/mysql mysql

Bind mount (host ↔ container):

docker run -v $(pwd)/app:/usr/src/app node

🌐 Networks

CommandDescription
docker network lsList networks
docker network create <name>Create network
docker network inspect <name>Inspect network
docker network rm <name>Remove network
docker run --network <name>Attach container to network

Example:

docker network create mynet
docker run -d --network mynet --name db postgres
docker run -d --network mynet --name api myapp

🧰 Dockerfile

A Dockerfile defines how an image is built.

Example

# Use base image
FROM node:18

# Set working directory
WORKDIR /app

# Copy files
COPY package*.json ./
RUN npm install

COPY . .

# Expose port and run command
EXPOSE 3000
CMD ["npm", "start"]

Build and run:

docker build -t myapp .
docker run -p 3000:3000 myapp

⚡ Multi-Stage Builds

Reduce image size by building and running in separate stages.

# Stage 1 - Build
FROM node:18 as builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# Stage 2 - Run
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

🧩 Environment Variables

docker run -e NODE_ENV=production myapp

From .env file

docker run --env-file .env myapp

🧍 Docker Compose

docker-compose.yml allows managing multiple containers easily.

Example

version: "3.9"
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: postgres
environment:
POSTGRES_PASSWORD: example

Commands

CommandDescription
docker compose upStart all services
docker compose up -dDetached mode
docker compose downStop and remove containers
docker compose logsShow logs
docker compose psShow running services

🧼 Cleaning Up

CommandDescription
docker system pruneRemove unused data
docker container pruneRemove stopped containers
docker image pruneRemove unused images
docker volume pruneRemove unused volumes

Example (aggressive cleanup)

docker system prune -a --volumes

🧠 Useful Tips

  • Always use .dockerignore to speed up builds.
  • Use multi-stage builds to keep images small.
  • Prefer named volumes over anonymous ones for persistent data.
  • Run containers as non-root where possible.
  • Use docker logs -f for real-time log streaming.

🧾 Dockerfile Best Practices

✅ Use official base images ✅ Leverage caching (copy only needed files before npm install) ✅ Combine related RUN commands ✅ Clean up cache (apt-get clean, rm -rf /var/lib/apt/lists/*) ✅ Use lightweight images (e.g., alpine)


🧱 Example .dockerignore

node_modules
.git
.gitignore
Dockerfile
*.log
.env

📦 Pushing to Docker Hub

docker login
docker tag myapp username/myapp:latest
docker push username/myapp:latest

🧠 Troubleshooting

ProblemFix
Container exits immediatelyAdd -it or correct entrypoint
Port already in useStop existing service or use another port
Permission deniedCheck file permissions or use --user flag
DNS/network issuesRestart Docker daemon (sudo systemctl restart docker)

🧰 Useful Commands Summary

# Containers
docker ps -a
docker start|stop|rm <id>
docker exec -it <id> bash

# Images
docker build -t app .
docker rmi <id>

# Volumes
docker volume ls
docker volume rm <name>

# Networks
docker network ls
docker network create mynet

# Cleanup
docker system prune -a

🧾 References