T
Trinh Digital
Triển khai Giải pháp

Docker cho người mới: Containerize ứng dụng trong 30 phút

Trinh Digital · · 9 phút đọc

Docker là gì mà developer nào cũng nói, DevOps nào cũng dùng, và tại sao nó quan trọng với doanh nghiệp? Nếu bạn từng nghe “Máy em chạy được mà, sao server không chạy?” thì Docker chính là giải pháp cho vấn đề kinh điển này. Bài viết này hướng dẫn bạn hiểu Docker từ zero và containerize ứng dụng đầu tiên trong 30 phút — không cần kinh nghiệm DevOps.

Docker là gì? Giải thích bằng ví dụ thực tế

Vấn đề: “It works on my machine”

Hãy tưởng tượng bạn nấu phở. Ở nhà bạn nấu ngon tuyệt vời. Nhưng khi mang công thức sang nhà bạn thì vị khác hoàn toàn vì: nước khác, bếp khác, gia vị khác brand.

Phần mềm cũng vậy. Developer code trên máy mình — chạy tốt. Đưa lên server production — crash. Tại sao? Vì môi trường khác:

  • Máy dev: Windows, Node.js 20, PostgreSQL 16
  • Server: Ubuntu, Node.js 18, PostgreSQL 14
  • Version khác, config khác → behavior khác

Docker giải quyết ra sao?

Docker đóng gói ứng dụng cùng với toàn bộ môi trường (OS, runtime, dependencies, config) vào một container. Container này chạy giống hệt nhau trên mọi máy — laptop dev, server staging, hay production.

Quay lại ví dụ phở: Thay vì mang công thức, bạn mang cả cái bếp, nồi, nước, gia vị — đóng gói thành 1 thùng. Mở thùng ra ở đâu cũng nấu được phở y hệt.

Container vs Virtual Machine

Tiêu chíVirtual Machine (VM)Docker Container
Kích thước1-20 GB50-500 MB
Thời gian start1-5 phút1-5 giây
RAM sử dụng512 MB - 4 GB10-100 MB
OSMỗi VM có OS riêngShare OS kernel với host
IsolationHoàn toànProcess-level
Số lượng trên 1 server5-20 VMs50-200 containers

Kết luận: Container nhẹ hơn, nhanh hơn, và tiết kiệm tài nguyên hơn VM rất nhiều.

Các khái niệm cơ bản trong Docker

1. Docker Image

Image = bản thiết kế (blueprint). Chứa tất cả: OS base, code, dependencies, config. Không thay đổi được (immutable).

Ví dụ: node:20-alpine là image chứa Node.js 20 trên Alpine Linux (nhẹ ~50MB).

2. Docker Container

Container = instance chạy từ Image. Giống như Image là “khuôn bánh”, Container là “cái bánh” đã được tạo ra. Bạn có thể tạo nhiều container từ cùng 1 image.

3. Dockerfile

Dockerfile = file text chứa hướng dẫn để build Image. Giống như công thức nấu ăn — từng bước một.

4. Docker Compose

Docker Compose = tool để chạy nhiều container cùng lúc. Ví dụ: app cần web server + database + redis → 1 file docker-compose.yml chạy cả 3.

5. Docker Hub

Docker Hub = “App Store” cho Docker Images. Hàng triệu images sẵn có: Node.js, Python, MySQL, Nginx, Redis…

Hướng dẫn thực hành: Containerize web app trong 30 phút

Bước 1: Cài đặt Docker (5 phút)

Windows/Mac: Tải Docker Desktop từ docker.com → cài đặt → mở app.

Linux (Ubuntu):

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Kiểm tra: docker --version → Nếu hiện version number = thành công.

Bước 2: Chạy container đầu tiên (2 phút)

docker run -d -p 8080:80 nginx

Mở browser: http://localhost:8080 → Thấy trang “Welcome to nginx!” → Docker đang chạy!

Giải thích:

  • docker run: Chạy container
  • -d: Chạy background
  • -p 8080:80: Map port 8080 (máy bạn) → port 80 (container)
  • nginx: Image name (tự download từ Docker Hub)

Bước 3: Viết Dockerfile cho ứng dụng Node.js (10 phút)

Giả sử bạn có app Node.js/Express:

# Base image
FROM node:20-alpine

# Thư mục làm việc trong container
WORKDIR /app

# Copy package.json trước (tận dụng Docker cache)
COPY package*.json ./

# Cài dependencies
RUN npm ci --only=production

# Copy source code
COPY . .

# Expose port
EXPOSE 3000

# Lệnh chạy app
CMD ["node", "server.js"]

Build image:

docker build -t my-app:1.0 .

Chạy container:

docker run -d -p 3000:3000 my-app:1.0

Mở http://localhost:3000 → App của bạn đang chạy trong Docker!

Bước 4: Docker Compose cho full stack (10 phút)

App cần Node.js + PostgreSQL + Redis? Tạo file docker-compose.yml:

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis

  db:
    image: postgres:16-alpine
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=myapp
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

Chạy toàn bộ stack:

docker compose up -d

1 lệnh → 3 services chạy, kết nối sẵn. Không cần cài PostgreSQL hay Redis trên máy.

Bước 5: Deploy lên server (3 phút)

Trên server production:

# Clone code
git clone https://github.com/your-repo/my-app.git
cd my-app

# Chạy
docker compose up -d

Xong! App chạy trên production giống hệt trên laptop dev.

Best Practices khi viết Dockerfile

1. Dùng multi-stage build (giảm 80% image size)

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

# Stage 2: Production (chỉ chứa build output)
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]
Kiểu buildImage size
Single stage850 MB
Multi-stage180 MB

2. Dùng .dockerignore

Tạo file .dockerignore để không copy file không cần:

node_modules
.git
.env
*.md
tests/

3. Không dùng root user

# Tạo user non-root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

4. Health check

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:3000/health || exit 1

5. Đặt version cụ thể

# ❌ Không nên
FROM node:latest

# ✅ Nên
FROM node:20.11-alpine3.19

Docker cho các tech stack phổ biến

Python/Django

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000"]

React (Static build + Nginx)

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

PHP/Laravel

FROM php:8.3-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql
WORKDIR /var/www
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader
COPY . .
RUN php artisan config:cache && php artisan route:cache
EXPOSE 9000

🎁 Lead magnet: Tải miễn phí Dockerfile + Docker Compose templates cho web app — bao gồm templates cho Node.js, Python, PHP, React, và full-stack combo. Copy-paste và chạy ngay.

Chi phí và ROI khi dùng Docker

Chi phí

Hạng mụcChi phí
Docker Desktop (dev)Free (cá nhân/SME <250 nhân viên)
Docker Hub (image registry)Free (unlimited public, 1 private repo)
VPS để chạy Docker100K - 2 triệu VND/tháng
Học Docker (developer)1-2 tuần tự học

ROI

Lợi íchGiá trị
Giảm thời gian setup môi trường devTừ 1-2 ngày → 10 phút
Giảm bug “works on my machine”-90%
Onboard developer mới nhanh hơnTừ 3-5 ngày → 1 giờ (docker compose up)
Deploy nhanh hơnTừ 30-60 phút → 5 phút
Scale horizontal dễ dàngThêm container, không thay đổi code

FAQ — Câu hỏi thường gặp

1. Docker có khó học không?

Không. Cơ bản (Dockerfile + Docker Compose) học trong 1-2 ngày. Developer có kinh nghiệm 1 năm trở lên đều có thể tự học qua tutorial. Nâng cao (networking, orchestration, security) cần thêm 2-4 tuần.

2. Docker có an toàn không? Data mất khi container restart?

Container là ephemeral (tạm thời) — data trong container mất khi container bị xóa. Nhưng dùng Docker Volumes để lưu data persistent (database, uploads). Volume tồn tại độc lập với container lifecycle.

3. Docker vs Kubernetes — khác nhau sao?

Docker chạy container trên 1 server. Kubernetes orchestrate container trên nhiều server (cluster). SME nên bắt đầu với Docker Compose. Khi scale lên 10+ servers hoặc cần auto-scaling, mới cần Kubernetes.

4. Shared hosting có dùng Docker được không?

Không. Docker cần quyền root trên server. Nên dùng VPS (DigitalOcean, Vultr từ 100K/tháng) hoặc cloud (AWS, GCP). Nếu muốn đơn giản hơn, dùng PaaS hỗ trợ Docker: Railway, Render, Fly.io.

5. App cũ đang chạy trên server, có nên chuyển sang Docker?

Có, nhưng step by step. Bước 1: Containerize app trên staging, test kỹ. Bước 2: Chạy song song Docker + non-Docker trên production 1-2 tuần. Bước 3: Switch traffic sang Docker version. Bước 4: Tắt non-Docker version. Nếu cần hỗ trợ chuyển đổi, liên hệ Trinh Digital.

Kết luận

Docker không phải trend nhất thời — nó đã trở thành tiêu chuẩn ngành cho việc đóng gói và triển khai phần mềm. Với chi phí gần như bằng 0 để bắt đầu và lợi ích rõ ràng (deploy nhanh hơn, ít bug hơn, onboard dễ hơn), Docker là investment xứng đáng cho mọi team phát triển phần mềm.

Nếu bạn cần hỗ trợ containerize ứng dụng hiện tại hoặc thiết kế kiến trúc Docker cho dự án mới, hãy liên hệ Trinh Digital — chúng tôi sẽ giúp bạn từ Dockerfile đến production deployment.

#deployment#container#DevOps#Docker
Chia sẻ: Z

Sẵn sàng chuyển đổi số cùng Trinh Digital?

Liên hệ ngay để nhận tư vấn miễn phí. Đội ngũ chuyên gia sẽ phân tích nhu cầu và đề xuất giải pháp tối ưu.

Zalo