DEV Community

Cover image for From Chaos to Containers: Journey of Dockerizing a React App
Debajit Mallick
Debajit Mallick

Posted on

2

From Chaos to Containers: Journey of Dockerizing a React App

Introduction

Let me tell you a secret: containerization used to sound like rocket science to me. Docker? More like "Docker-what?" But after wrestling with inconsistent environments and deployment headaches, I discovered how Docker can be a developer's best friend. In this blog, I will share how you can start moving your React app to Docker and why you should do that.

Why Bother with Docker?

Picture this: You've built a killer React app, and it works perfectly on your machine. But when you try to deploy it? Suddenly, it's like trying to fit a square peg in a round hole. Different dependencies, configuration nightmares, environment quirks - sound familiar?

That's where Docker comes in. It's basically a magic box that packages your entire application with all its dependencies, ensuring it runs exactly the same everywhere. No more "But it works on my computer!" excuses.

Getting Started: Our Dockerization Adventure

Step 1: Setting Up Our React Playground

First things first, we'll create a fresh React project using Vite. Think of Vite as that cool, lightweight build tool that makes your development experience smooth:

npm create vite@latest my-react-app -- --template react-ts
cd my-react-app
npm install
Enter fullscreen mode Exit fullscreen mode

Step 2: The Production Build Dance

Before we containerize, we need to create a production-ready build. It's like polishing your app before a big presentation:

npm run build
Enter fullscreen mode Exit fullscreen mode

Step 3: The Docker Preparation

We'll create a .dockerignore file - think of it as a bouncer that keeps unnecessary files out of our Docker party. No node_modules, no build artifacts, just the essentials.

Step 4: Crafting the Dockerfile - Our Container's Blueprint

Here's where the magic happens. We'll use a multi-stage build that's both clever and efficient:

# Stage 1: Build our application
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Stage 2: Serve with Nginx
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Enter fullscreen mode Exit fullscreen mode

This isn't just a Dockerfile; it's a lean, mean, deployment machine. The first stage builds our app, and the second stage serves it using Nginx - lightweight and fast.
Explanation:

  • Stage 1: Uses the official Node.js Alpine image to build the React application. It sets the working directory, installs dependencies, copies the source code, and runs the build process. 
  • Stage 2: Uses the official Nginx Alpine image to serve the built application. It copies the contents of the dist directory from the builder stage to Nginx’s default HTML directory, exposes port 80, and starts Nginx.

Step 5: Building and Running Our Container

Now for the moment of truth:

# Build the Docker image
docker build -t my-react-app .

# Run the container
docker run -d -p 8080:80 my-react-app
Enter fullscreen mode Exit fullscreen mode

Open your browser, navigate to http://localhost:8080, and voilà! Your app is running inside a container.

Pro Tips for the Docker-Curious

  1. Consistency is King: Your app will run identically everywhere.
  2. Scalability Made Simple: Want to spin up multiple instances? Docker's got your back.
  3. Environment Isolation: Keep your dependencies clean and separated.

Bonus: Docker Compose

For more complex setups, Docker Compose lets you orchestrate multiple services. It's like conducting an orchestra of containers.

version: '3.8'
services:
  frontend:
    build: .
    ports:
      - "8080:80"
    container_name: my-react-frontend
Enter fullscreen mode Exit fullscreen mode

Conclusion

Dockerizing isn't just a technical skill; it's a mindset. It's about creating robust, portable, and scalable applications. Containerize your apps, simplify your workflows, and enjoy the magic of predictable deployments. If you like this blog and want to learn more about Frontend Development and Software Engineering, you can follow me on Dev.to.

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Cloudinary image

Video API: manage, encode, and optimize for any device, channel or network condition. Deliver branded video experiences in minutes and get deep engagement insights.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay