Part of DevOps for JavaScript series

Hướng dẫn Docker và Kubernetes cho JavaScript Developer

Hướng dẫn từ cơ bản đến nâng cao về Docker và Kubernetes cho JavaScript Developer. Bao gồm containerization, orchestration, và deployment strategies trong môi trường production.

June 15, 2025
5 min read
By Leo Pham
dockerkubernetesjavascriptdevopsvietnamese
Share this post:

Docker and Kubernetes Photo by Ian Taylor on Unsplash

🐳 Hướng dẫn Docker và Kubernetes cho JavaScript Developer

🎯 Complete Guide: Từ containerization cơ bản với Docker đến orchestration nâng cao với Kubernetes. Được thiết kế đặc biệt cho JavaScript/Node.js developers với các ví dụ thực tế.

Trong thời đại DevOps hiện đại, việc nắm vững Docker và Kubernetes đã trở thành kỹ năng thiết yếu cho mọi JavaScript developer. Bài viết này sẽ hướng dẫn bạn từ những bước đầu tiên đến deployment production-ready.

📋 Tổng quan về Container Technology

🎯 Tại sao cần Docker & Kubernetes?

🔍 Các vấn đề thường gặp:

  • • **"Works on my machine"** syndrome
  • • **Environment inconsistency** giữa dev/staging/production
  • • **Dependency hell** với different Node.js versions
  • • **Scaling challenges** khi traffic tăng đột biến

🎯 Giải pháp Container

✅ Lợi ích của Docker & Kubernetes:

🐳 Docker Fundamentals

Bước 1: Dockerizing Node.js App

# Dockerfile
FROM node:18-alpine

# Set working directory
WORKDIR /app

# Copy package files
COPY package*.json ./

# Install dependencies
RUN npm ci --only=production

# Copy source code
COPY . .

# Expose port
EXPOSE 3000

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

# Start application
CMD ["npm", "start"]

Bước 2: Sample Express Application

// app.js
const express = require('express')
const cors = require('cors')
require('dotenv').config()

const app = express()
const PORT = process.env.PORT || 3000

// Middleware
app.use(cors())
app.use(express.json())

// Routes
app.get('/', (req, res) => {
  res.json({ 
    message: 'Hello from Dockerized Node.js App!',
    timestamp: new Date().toISOString(),
    environment: process.env.NODE_ENV || 'development',
    version: process.env.npm_package_version || '1.0.0'
  })
})

app.get('/health', (req, res) => {
  res.status(200).json({ status: 'healthy' })
})

// Error handling
app.use((err, req, res, next) => {
  console.error(err.stack)
  res.status(500).json({ error: 'Something went wrong!' })
})

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

Bước 3: Docker Compose Setup

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - PORT=3000
    volumes:
      - ./logs:/app/logs
    depends_on:
      - redis
      - postgres
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  redis_data:
  postgres_data:

☸️ Kubernetes Deep Dive

Kubernetes Architecture

🏗️ Core Components:

**Control Plane** - Master nodes managing the cluster
**Worker Nodes** - Running your application pods
**Pods** - Smallest deployable units
**Services** - Network abstraction layer

Deployment Configuration

# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-app
  labels:
    app: nodejs-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nodejs-app
  template:
    metadata:
      labels:
        app: nodejs-app
    spec:
      containers:
      - name: nodejs-app
        image: myregistry/nodejs-app:latest
        ports:
        - containerPort: 3000
        env:
        - name: NODE_ENV
          value: "production"
        - name: PORT
          value: "3000"
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "200m"
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5

🚀 Production Best Practices

⚡ Performance Tips:

  1. **Multi-stage builds** để giảm image size
  2. **Resource limits** để tránh resource starvation
  3. **Health checks** cho auto-healing
  4. **Horizontal Pod Autoscaler** cho auto-scaling
  5. **ConfigMaps & Secrets** cho configuration management

Security Checklist

Aspect Docker Kubernetes
Image Security Use official base images Image scanning policies
Runtime Security Non-root user Pod Security Standards
Network Security Internal networks only Network Policies
Secrets Management Docker secrets Kubernetes Secrets

📚 Tài liệu tham khảo

🔗 Useful Resources:

• **Docker Documentation**: [docker.com/get-started](https://docker.com/get-started)

• **Kubernetes Docs**: [kubernetes.io/docs](https://kubernetes.io/docs)

• **Docker Hub**: [hub.docker.com](https://hub.docker.com)

• **Minikube**: [minikube.sigs.k8s.io](https://minikube.sigs.k8s.io)


💡 Lời khuyên từ kinh nghiệm:

"Bắt đầu với Docker để hiểu containerization, sau đó chuyển sang Kubernetes khi cần orchestration. Đừng cố gắng học cả hai cùng lúc - hãy từng bước một cách có hệ thống."

Hãy thực hành với project thực tế để nắm vững kiến thức!


Bài viết được viết dựa trên kinh nghiệm thực tế triển khai ứng dụng JavaScript/Node.js trong môi trường production với Docker và Kubernetes. This post was generated using AI (Ollama) to help developers learn and grow. Feel free to edit and customize it further.

Last updated: June 15, 2025

Comments