Lauv Logo
Back to Blogs

Docker: A Complete Guide to Containerization

2025-09-1512 min read
DockerDevOpsContainerizationLinux
Docker: A Complete Guide to Containerization

Docker: A Complete Guide to Containerization

Docker has transformed the way we develop, ship, and run applications. In this comprehensive guide, we'll explore Docker's core concepts and practical usage.

What is Docker?

Docker is a platform that enables developers to package applications into containers—standardized executable components that combine application source code with all the operating system libraries and dependencies required to run that code in any environment.

Why Use Docker?

Consistency Across Environments

Docker ensures your application runs the same way in development, testing, and production environments.

Isolation

Each container runs in isolation, preventing conflicts between applications and their dependencies.

Portability

Containers can run on any system that supports Docker, making deployment seamless across different platforms.

Resource Efficiency

Containers share the host system's kernel, making them more lightweight than virtual machines.

Core Docker Concepts

Images

A Docker image is a read-only template that contains a set of instructions for creating a container. Think of it as a snapshot of your application and its dependencies.

Containers

A container is a runnable instance of an image. You can create, start, stop, move, or delete a container using the Docker API or CLI.

Dockerfile

A text file that contains instructions for building a Docker image.

Getting Started with Docker

Installing Docker

Visit the official Docker website and download Docker Desktop for your operating system.

Your First Dockerfile

# Use an official Node.js runtime as the base image FROM node:18-alpine # Set the working directory in the container WORKDIR /app # Copy package.json and package-lock.json COPY package*.json ./ # Install dependencies RUN npm install # Copy the rest of the application code COPY . . # Expose the port the app runs on EXPOSE 3000 # Define the command to run the app CMD ["npm", "start"]

Building and Running a Container

# Build the Docker image docker build -t my-app:1.0 . # Run the container docker run -p 3000:3000 my-app:1.0 # List running containers docker ps # Stop a container docker stop <container-id> # Remove a container docker rm <container-id>

Docker Compose

Docker Compose is a tool for defining and running multi-container Docker applications. Here's an example:

version: '3.8' services: web: build: . ports: - "3000:3000" depends_on: - db db: image: postgres:14 environment: POSTGRES_PASSWORD: example POSTGRES_DB: myapp volumes: - postgres-data:/var/lib/postgresql/data volumes: postgres-data:

Run with: docker-compose up

Best Practices

  1. Use Official Base Images: Start with official images from Docker Hub
  2. Keep Images Small: Use alpine variants and multi-stage builds
  3. One Process Per Container: Each container should have a single responsibility
  4. Use .dockerignore: Exclude unnecessary files from your image
  5. Don't Run as Root: Create and use a non-root user in your containers
  6. Version Your Images: Always tag images with specific versions

Advanced Features

Multi-Stage Builds

Reduce image size by using multiple FROM statements in your Dockerfile:

# Build stage FROM node:18 AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Production stage FROM node:18-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules CMD ["node", "dist/index.js"]

Docker Volumes

Persist data beyond container lifecycle:

docker volume create my-data docker run -v my-data:/app/data my-app

Docker Networks

Enable communication between containers:

docker network create my-network docker run --network my-network my-app

Common Commands Reference

# Images docker images # List all images docker pull <image> # Pull an image from Docker Hub docker rmi <image> # Remove an image docker image prune # Remove unused images # Containers docker ps # List running containers docker ps -a # List all containers docker logs <container> # View container logs docker exec -it <container> sh # Execute command in running container # System docker system df # Show Docker disk usage docker system prune # Remove unused data

Conclusion

Docker has become an essential tool in modern software development. By containerizing your applications, you gain consistency, portability, and efficiency. Whether you're working on microservices, deploying to the cloud, or setting up local development environments, Docker simplifies the process and eliminates the "it works on my machine" problem.

Start small, experiment with simple containers, and gradually explore advanced features. The Docker ecosystem is vast and constantly evolving, offering solutions for almost any deployment scenario.

Want to read more?

Check out other blog posts for more insights on software development and technology.

View All Posts
GitHub iconLinkedIn iconGmail icon