DEV Community

Cover image for Docker Explained: A Beginner's Guide for Laymen and Developers
Md Enayetur Rahman
Md Enayetur Rahman

Posted on

Docker Explained: A Beginner's Guide for Laymen and Developers

Have you ever faced a situation where your code works perfectly on your computer, but breaks when run elsewhere? Or perhaps you're tired of managing software installations for your development projects? If so, Docker is here to simplify your life.

Series Overview

Welcome to our 8-part Docker deep dive! In this series, we’ll start from the very basics and build up to running multi-service applications in containers. Here’s what you can expect:

  • Part 1: Docker Basics Learn what containers are, why Docker revolutionized software delivery, and how to install Docker on your machine. We’ll cover the core Docker CLI commands and build your first “Hello, World!” image.
  • Part 2: Containerizing an Express Service Take a simple Node/Express app, write a Dockerfile for it, build an image, and run your service in a container. You’ll see how easy it is to package your backend.
  • Part 3: Live-Reload with Volumes Discover how Docker volumes let you mount your local code into a running container so that every save triggers a live-reload—perfect for fast feedback during development.
  • Part 4: Multi-Stage Builds & Image Optimization Shrink your images with multi-stage Dockerfiles. We’ll split build and runtime concerns, remove unnecessary layers, and dramatically reduce image size.
  • Part 5: Debugging Inside Containers Dive into container internals: run an interactive shell, inspect logs, troubleshoot networking, and use docker exec to diagnose issues in a running container.
  • Part 6: Environment Variables & Configuration Learn best practices for passing secrets and configuration into containers using environment variables and .env files—without baking sensitive data into your images.
  • Part 7: Connecting Front-End & Back-End Containers Use Docker Compose to spin up a Vite/React front-end and an API side by side. We’ll wire them together on a user-defined network and enable seamless cross-container communication.
  • Part 8: Multi-Service Apps & Container Networking Orchestrate a full-stack microservice demo: multiple API containers, a message broker, and a database. You’ll master Docker networks, service discovery, and Compose overrides.

Whether you’re brand-new to containers or looking to level up your workflow, this roadmap will guide you step by step.

What is Docker?

Docker is a tool designed to make it easier to create, deploy, and run applications by using containers. Containers allow developers to package up an application with everything it needs—such as libraries, dependencies, and runtime environments—and ship it all as one complete package.

Why Use Docker?

  • Consistency: Ensures your app runs identically on every machine.
  • Portability: Easy to move your application between development, testing, and production.
  • Efficiency: Faster deployments and reduced overhead.

Basic Docker Concepts

Dockerfile

Think of a Dockerfile as a recipe. It contains instructions on how to build your Docker image, like installing dependencies and copying your source code.

Here's a simple example:

FROM node:18-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["npm", "start"]
Enter fullscreen mode Exit fullscreen mode

Docker Image

An image is like a snapshot or blueprint of your environment. It's created based on the Dockerfile.

Docker Container

Containers are running instances of images. If an image is a blueprint, the container is the actual building created from that blueprint.

Optimizing Dockerfile

Notice the order:

  • Copy package.json first
  • Run npm install
  • Then copy the rest of the code

This order allows Docker to cache the node modules, speeding up subsequent builds.

Running Docker Containers

You can run containers in different modes:

  • Attached Mode: See live output
  docker run image_name
Enter fullscreen mode Exit fullscreen mode
  • Detached Mode: Run in the background
  docker run -d image_name
Enter fullscreen mode Exit fullscreen mode
  • Interactive Mode: Enter container's shell
  docker run -it image_name sh
Enter fullscreen mode Exit fullscreen mode

Removing Docker Images and Containers

  • Remove an individual image:
  docker rmi image_name
Enter fullscreen mode Exit fullscreen mode
  • Remove all images:
  docker rmi $(docker images -q)
Enter fullscreen mode Exit fullscreen mode
  • Auto-remove container after stopping:
  docker run --rm image_name
Enter fullscreen mode Exit fullscreen mode

Naming and Tagging Docker Images

Give your images clear names and tags for easier management:

docker build -t myapp:latest .
Enter fullscreen mode Exit fullscreen mode

Docker Hub: Pushing and Pulling Images

Docker Hub is like GitHub but for Docker images.

  • Push image:
  docker push username/myapp:latest
Enter fullscreen mode Exit fullscreen mode
  • Pull image:
  docker pull username/myapp:latest
Enter fullscreen mode Exit fullscreen mode

Docker Volumes

  • Named Volumes: Preserve changes made in the container.
  docker run -v myvolume:/app nodeapp
Enter fullscreen mode Exit fullscreen mode
  • Anonymous Volumes: Keep node modules separate.
  docker run -v /app/node_modules nodeapp
Enter fullscreen mode Exit fullscreen mode

Docker Bind Mounts

Use your local files in a container for development:

docker run -v $(pwd):/app nodeapp
Enter fullscreen mode Exit fullscreen mode

VS Code Dev Containers

Visual Studio Code simplifies Docker integration using Dev Containers. Just create a .devcontainer.json to automate setup.

Using .dockerignore and .env

  • .dockerignore: Ignore files from being copied into images (like .git).
  • .env: Store sensitive data outside Dockerfiles for security.

Networking and Docker Compose

Docker allows:

  • Container-to-WWW connections.
  • Container-to-local machine connections.
  • Container-to-container connections through Docker networks.

Docker Compose simplifies multi-container apps setup with one YAML file.

Conclusion

Docker might initially seem overwhelming, but with basic concepts clear, it's straightforward to manage. Start small, experiment, and you'll soon experience streamlined, consistent development workflows.

Top comments (0)