5-how-to-deploy-a-full-stack-application-with-docker-and-kubernetes.html

How to Deploy a Full-Stack Application with Docker and Kubernetes

In today's fast-paced tech landscape, deploying applications efficiently and reliably is more crucial than ever. If you’re a developer looking to streamline your deployment process, understanding Docker and Kubernetes is essential. This guide will walk you through deploying a full-stack application using these powerful tools, providing actionable insights and code examples along the way.

Understanding Docker and Kubernetes

What is Docker?

Docker is a platform designed to automate the deployment of applications within lightweight, portable containers. A container encapsulates an application and its dependencies, ensuring it runs consistently across different environments. This eliminates the "it works on my machine" problem, making development and operations (DevOps) more seamless.

What is Kubernetes?

Kubernetes, often abbreviated as K8s, is an open-source orchestration platform that manages containerized applications across clusters of machines. It automates deployment, scaling, and operations of application containers, offering powerful tools for managing complex applications.

Use Cases for Docker and Kubernetes

  • Microservices Architecture: Ideal for applications built as microservices, where different parts of the application can be developed, deployed, and scaled independently.
  • Continuous Integration/Continuous Deployment (CI/CD): Automates the software release process, making it easier to deliver updates and features.
  • Resource Management: Efficiently manages resources, scaling applications up or down based on demand.

Step-by-Step Guide to Deploying a Full-Stack Application

We'll walk through deploying a simple Node.js and React full-stack application using Docker and Kubernetes.

Prerequisites

  1. Docker: Make sure Docker is installed on your machine.
  2. Kubernetes: Install Kubernetes (Minikube for local development or a cloud provider).
  3. kubectl: The command-line tool for managing Kubernetes clusters.

Step 1: Create Your Full-Stack Application

First, we'll set up a basic Node.js backend and a React frontend.

Backend (Node.js)

Create a folder named backend and add a file called server.js:

const express = require('express');
const cors = require('cors');
const app = express();
const PORT = process.env.PORT || 5000;

app.use(cors());
app.use(express.json());

app.get('/api', (req, res) => {
    res.send({ message: 'Hello from the backend!' });
});

app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

Frontend (React)

In a separate folder named frontend, create a simple React application:

npx create-react-app my-app
cd my-app

Edit src/App.js to call the backend API:

import React, { useEffect, useState } from 'react';

function App() {
    const [message, setMessage] = useState('');

    useEffect(() => {
        fetch('http://localhost:5000/api')
            .then((response) => response.json())
            .then((data) => setMessage(data.message));
    }, []);

    return (
        <div>
            <h1>{message}</h1>
        </div>
    );
}

export default App;

Step 2: Dockerize Your Applications

Create a Dockerfile for the backend:

Backend Dockerfile

# Use the official Node.js image.
FROM node:14

# Set the working directory.
WORKDIR /usr/src/app

# Copy package.json and install dependencies.
COPY package*.json ./
RUN npm install

# Copy the rest of the application.
COPY . .

# Expose the application port.
EXPOSE 5000

# Start the application.
CMD ["node", "server.js"]

Create a Dockerfile for the frontend:

Frontend Dockerfile

# Use the official Node.js image.
FROM node:14 as build

# Set the working directory.
WORKDIR /app

# Copy package.json and install dependencies.
COPY package*.json ./
RUN npm install

# Copy the rest of the application and build it.
COPY . .
RUN npm run build

# Serve the app with a static server.
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

# Expose the application port.
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Step 3: Build Docker Images

In your terminal, navigate to the backend and frontend folders and run the following commands:

# For backend
docker build -t my-backend .

# For frontend
docker build -t my-frontend .

Step 4: Create Kubernetes Manifests

Create a deployment.yaml file for both applications.

Deployment Manifest

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: my-backend
        ports:
        - containerPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: my-frontend
        ports:
        - containerPort: 80

Step 5: Expose Your Services

Create a service.yaml file to expose your applications:

apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  type: ClusterIP
  selector:
    app: backend
  ports:
    - port: 5000
      targetPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: LoadBalancer
  selector:
    app: frontend
  ports:
    - port: 80
      targetPort: 80

Step 6: Deploy to Kubernetes

Run the following commands to deploy your application to Kubernetes:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

Step 7: Access Your Application

To access your application, use:

kubectl get services

Find the external IP of frontend-service and open it in your browser. You should see your React app displaying the message from the backend.

Troubleshooting Tips

  • Check Logs: Use kubectl logs <pod-name> to view logs for troubleshooting.
  • Port Issues: Ensure your services are properly exposed and ports are correctly mapped.
  • Configuration Errors: Check your YAML files for syntax errors.

Conclusion

Deploying a full-stack application with Docker and Kubernetes can significantly enhance your development workflow. By containerizing your applications, you ensure consistency across environments and simplify scaling. With this guide, you now have the foundational knowledge to leverage these powerful tools effectively. Start building, deploying, and scaling your applications like a pro!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.