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:**  
Enter fullscreen mode Exit fullscreen mode

Dockerfile ➝ Docker Image ➝ Container


![Dockerfile Flow](https://i.ibb.co/3FZK3Bp/dockerfile-flow.png)

---

## 🛠️ Basic Structure of a Dockerfile

Here’s a template:

```

dockerfile
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.


dockerfile
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.


dockerfile
WORKDIR /app


Enter fullscreen mode Exit fullscreen mode

3. COPY

Copies files from your local machine into the container.


dockerfile
COPY requirements.txt .
COPY . .


Enter fullscreen mode Exit fullscreen mode

4. RUN

Executes commands at build time.


dockerfile
RUN pip install -r requirements.txt


Enter fullscreen mode Exit fullscreen mode

5. CMD

Specifies the default command to run when the container starts.


dockerfile
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.


dockerfile
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.


dockerfile
EXPOSE 5000


Enter fullscreen mode Exit fullscreen mode

8. ENV

Sets environment variables.


dockerfile
ENV APP_ENV=production


Enter fullscreen mode Exit fullscreen mode

9. ARG

Sets build-time variables.


dockerfile
ARG VERSION=1.0


Enter fullscreen mode Exit fullscreen mode

📄 Full Example: Python Flask App


dockerfile
# 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


bash
# 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:

dockerfile
  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:

dockerfile
  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)