DEV Community

Cover image for 🐳 Mastering Dockerfile: A Complete Beginner’s Guide to Building Containers
lalith_charan
lalith_charan

Posted on

🐳 Mastering Dockerfile: A Complete Beginner’s Guide to Building Containers

🐳 Mastering the Dockerfile: The Complete Beginner’s Guide

Docker is one of the most essential tools in DevOps and cloud-native development. At the heart of Docker is the Dockerfile — a simple text file with instructions to build a Docker image.

This guide will walk you through everything you need to know about Dockerfiles, from basics to best practices.


📦 What is a Dockerfile?

A Dockerfile is like a recipe 🧑‍🍳.

  • Each line is an instruction.
  • Docker processes it top to bottom.
  • The result is a Docker image, which you can run as a container.

Flow:


Dockerfile ➝ Docker Image ➝ Container

Enter fullscreen mode Exit fullscreen mode

🛠️ Basic Structure of a Dockerfile

Here’s a template:

FROM <base-image>
WORKDIR <directory>
COPY <src> <dest>
RUN <command>
CMD ["executable", "param1", "param2"]
Enter fullscreen mode Exit fullscreen mode

🔑 Key Instructions Explained

1. FROM

Sets the base image to start with.

FROM python:3.9-slim
Enter fullscreen mode Exit fullscreen mode

👉 Every Dockerfile must start with a base image (unless you’re building completely from scratch).


2. WORKDIR

Defines the working directory inside the container.

WORKDIR /app
Enter fullscreen mode Exit fullscreen mode

3. COPY

Copies files from your local machine into the container.

COPY requirements.txt .
COPY . .
Enter fullscreen mode Exit fullscreen mode

4. RUN

Executes commands at build time.

RUN pip install -r requirements.txt
Enter fullscreen mode Exit fullscreen mode

5. CMD

Specifies the default command to run when the container starts.

CMD ["python", "app.py"]
Enter fullscreen mode Exit fullscreen mode

6. ENTRYPOINT (advanced)

Defines the main process of the container. Unlike CMD, it cannot be overridden easily.

ENTRYPOINT ["python"]
CMD ["app.py"]
Enter fullscreen mode Exit fullscreen mode

👉 This runs as python app.py.


7. EXPOSE

Documents which ports the container will use.

EXPOSE 5000
Enter fullscreen mode Exit fullscreen mode

8. ENV

Sets environment variables.

ENV APP_ENV=production
Enter fullscreen mode Exit fullscreen mode

9. ARG

Sets build-time variables.

ARG VERSION=1.0
Enter fullscreen mode Exit fullscreen mode

📄 Full Example: Python Flask App

# Step 1: Start from base image
FROM python:3.9-slim

# Step 2: Set working directory
WORKDIR /app

# Step 3: Copy requirements and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Step 4: Copy the rest of the code
COPY . .

# Step 5: Expose port
EXPOSE 5000

# Step 6: Default command
CMD ["python", "app.py"]
Enter fullscreen mode Exit fullscreen mode

⚡ Build and Run

# Build the image
docker build -t myapp:1.0 .

# Run the container
docker run -p 5000:5000 myapp:1.0
Enter fullscreen mode Exit fullscreen mode

Now open 👉 http://localhost:5000


📸 Visual Overview

Dockerfile ➝ Image ➝ Container

Docker Build Process


✅ Best Practices

  • Use lightweight base images (e.g., alpine, slim).
  • Always use a .dockerignore file to avoid copying unnecessary files.
  • Combine commands to reduce layers:
  RUN apt-get update && apt-get install -y curl
Enter fullscreen mode Exit fullscreen mode
  • Pin versions of dependencies for reproducibility.
  • Use multi-stage builds to keep images small:
  FROM golang:1.18 as builder
  WORKDIR /src
  COPY . .
  RUN go build -o app

  FROM alpine:3.16
  COPY --from=builder /src/app /app
  CMD ["/app"]
Enter fullscreen mode Exit fullscreen mode

🚀 Wrap-up

A Dockerfile is the blueprint of your containerized application.
With a few simple instructions, you can package your code and run it anywhere.

In upcoming posts, we’ll explore multi-stage builds, caching, and security best practices for Dockerfiles.


💡 Question for you:
👉 What’s the most challenging part you faced when writing your first Dockerfile?

Drop your thoughts in the comments 👇

Top comments (0)