DEV Community

Cover image for 🚀Docker Deployment for Beginners: A Simple and Practical Guide
Mahmudur Rahman
Mahmudur Rahman

Posted on

🚀Docker Deployment for Beginners: A Simple and Practical Guide

Introduction

Docker has transformed software deployment by allowing developers to package applications and their dependencies into lightweight containers. While beginners learn how to containerize a simple app, intermediate developers must understand how to optimize Dockerfiles, manage multi-container applications, and deploy effectively. This guide will expand on the basics, providing insights into best practices and real-world deployment strategies.


📌 What is Docker?

Docker is an open-source platform that enables developers to build, ship, and run applications in isolated environments called containers. Containers ensure consistency across different environments, eliminating the "works on my machine" problem.

🔹 Key Benefits of Docker:

  • Portability: Run applications consistently across different environments.
  • Efficiency: Uses fewer resources than virtual machines.
  • Scalability: Supports horizontal scaling with orchestration tools like Kubernetes.
  • Version Control: Allows you to track and roll back changes with image versions.
  • Security: Provides isolation, reducing dependency conflicts and system vulnerabilities.

🛠️ Installing Docker

Ensure you have Docker installed on your system.

  • Windows & macOS: Install Docker Desktop.
  • Linux: Install Docker via your package manager:
  sudo apt update
  sudo apt install docker.io
  sudo systemctl enable --now docker
Enter fullscreen mode Exit fullscreen mode

Verify the installation:

  docker --version
Enter fullscreen mode Exit fullscreen mode

📦 Building a Efficient Docker Container

Let's create a Node.js application with optimized Docker practices.

1️⃣ Create a Node.js App

First, initialize a Node.js project:

mkdir docker-demo && cd docker-demo
npm init -y
Enter fullscreen mode Exit fullscreen mode

Create an index.js file:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello, Docker!');
});

app.listen(3000, () => console.log('Server running on port 3000'));
Enter fullscreen mode Exit fullscreen mode

2️⃣ Write an Optimized Dockerfile

Instead of a single-layer image, use multi-stage builds to reduce image size and improve efficiency.

# Stage 1: Build the application
FROM node:18 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --only=production
COPY . .

# Stage 2: Run the application
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app .
EXPOSE 3000
CMD ["node", "index.js"]
Enter fullscreen mode Exit fullscreen mode

🔹 Optimizations Explained:

  • Multi-stage builds: Reduces final image size by only copying necessary files.
  • Alpine base image: Uses a minimal Node.js image for better performance.
  • npm ci --only=production: Installs only production dependencies, reducing image bloat.

3️⃣ Build and Run the Optimized Docker Container

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

# Run the container
docker run -d -p 3000:3000 --name my-node-app my-node-app
Enter fullscreen mode Exit fullscreen mode

Visit http://localhost:3000 to verify the deployment.


📤 Deploying a Docker Container with Best Practices

📌 Push Image to Docker Hub

# Login to Docker Hub
docker login

# Tag and push the image
docker tag my-node-app username/my-node-app
docker push username/my-node-app
Enter fullscreen mode Exit fullscreen mode

📌 Run a Container with Environment Variables and Logging

docker run -d -p 3000:3000 --name my-app -e NODE_ENV=production my-node-app
Enter fullscreen mode Exit fullscreen mode
  • -d: Runs the container in detached mode.
  • -e NODE_ENV=production: Sets an environment variable.
  • --name my-app: Assigns a container name for easier management.

📌 Managing Containers

# View running containers
docker ps

# Stop and remove a container
docker stop my-app && docker rm my-app
Enter fullscreen mode Exit fullscreen mode

📦 Running Multi-Container Applications with Docker Compose

For more complex applications requiring databases or services, use Docker Compose.

Create a docker-compose.yml file:

version: '3'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: production
  db:
    image: mongo
    ports:
      - "27017:27017"
Enter fullscreen mode Exit fullscreen mode

Run the multi-container application:

docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

🎯 Conclusion

By this stage, you should be able to:
✅ Write an optimized Dockerfile for production-ready applications

✅ Use multi-stage builds to reduce image size

✅ Deploy containers with environment variables and logging

✅ Manage multi-container applications with Docker Compose

Continue exploring Docker networking, volume management, and Kubernetes to deepen your expertise. 🚀


Follow for more!

Top comments (0)