Docker là nền tảng containerization cho phép đóng gói ứng dụng và dependencies vào container để chạy nhất quán trên bất kỳ environment nào. Container giống như lightweight VM nhưng share kernel với host OS, hiệu quả hơn về resource và startup time.

Docker được phát triển bởi Solomon Hykes và Sebastian Pahl, ra mắt năm 2013. Ban đầu build trên LXC (Linux Containers), sau đó phát triển thành containerd và runtime riêng. Docker trở thành standard cho containerization và được sử dụng rộng rãi trong DevOps và microservices architectures.

Container vs Virtual Machine

Virtual Machine

  • Mỗi VM chạy full OS riêng biệt (Guest OS)
  • Hypervisor (VMware, Hyper-V) phân chia hardware
  • Isolation cao nhưng resource-heavy (GB RAM, GB disk)
  • Startup time: phút

Containers

  • Container share host OS kernel
  • Lightweight, chỉ cần application + dependencies
  • Resource usage thấp (MB RAM)
  • Startup time: seconds

So sánh chi tiết

AspectVMContainer
IsolationFull isolationProcess-level isolation
ResourceGB RAM, GB diskMB RAM, MB disk
StartupMinutesSeconds
DensityFew per serverDozens per server
PortabilityGoodExcellent

Docker Architecture

Docker sử dụng client-server architecture. Docker Client giao tiếp với Docker Daemon (dockerd) qua REST API. Daemon chịu trách nhiệm build, run, và manage Docker objects (images, containers, networks, volumes).

Docker Daemon (dockerd)

Background service quản lý containers: building, running, networking. Listen for Docker API requests. Đây là core engine của Docker.

Docker Client

CLI tool (docker command) giao tiếp với daemon qua Docker API. User chạy docker run, docker build… Client gửi request đến daemon.

Docker Registry

Storage cho Docker images. Docker Hub là default public registry. Private registries như AWS ECR, Google GCR, hoặc self-hosted.

Docker Objects

  • Images: Read-only template để create containers
  • Containers: Runnable instance của image
  • Networks: Virtual networks cho containers communicate
  • Volumes: Persistent data storage

Dockerfile – Building Images

Dockerfile là script định nghĩa cách build Docker image. Mỗi instruction tạo một layer trong image:

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
ENV NODE_ENV=production
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:3000/health || exit 1
CMD ["node", "server.js"]

Dockerfile Instructions

InstructionDescription
FROMBase image
RUNExecute command during build
COPYCopy files vào image
ADDSimilar to COPY, có thể extract URLs
WORKDIRSet working directory
ENVEnvironment variables
EXPOSEDocument ports
CMDDefault command khi container starts
ENTRYPOINTMain process (can’t override)
VOLUMEDefine volumes

Docker Commands cơ bản

Building Images

docker build -t myapp:1.0 .
docker build --build-arg VERSION=1.0 -t myapp:latest .
docker tag myapp:1.0 registry.com/myapp:1.0

Running Containers

docker run -d --name myapp -p 3000:3000 myapp:1.0
docker run -d -e NODE_ENV=production -e DB_HOST=localhost myapp
docker run -d -v /host/data:/container/data myapp
docker run -it ubuntu bash
docker run --network mynetwork myapp

Managing Containers

docker ps
docker ps -a
docker stop myapp
docker start myapp
docker rm myapp
docker logs -f myapp
docker exec -it myapp bash
docker inspect myapp

Docker Networking

Docker cung cấp multiple network drivers để containers communicate với nhau và với outside world.

Network Drivers

DriverDescriptionUse Case
bridgeDefault, isolated networkStandalone containers
hostShare host network stackHigh performance, no isolation
overlayConnect containers across hostsDocker Swarm clusters
noneNo networkingIsolated containers
macvlanAssign MAC addressesLegacy apps requiring direct network

Creating Networks

docker network create --driver bridge mynetwork
docker network create --driver overlay myoverlay
docker run --network mynetwork myapp
docker network connect mynetwork myapp

Docker Volumes

Container filesystem là ephemeral — data mất khi container removed. Docker Volumes giải quyết vấn đề persistent data.

Volume Types

TypeDescription
Named volumesDocker-managed, persist across container removal
Bind mountsHost directory mapped to container
tmpfs mountsStored in memory, not persisted
npipe mountsNamed pipes (Windows)

Volume Commands

docker volume create mydata
docker run -v mydata:/data myapp
docker run -v /host/path:/container/path myapp
docker volume ls
docker volume inspect mydata
docker volume prune

Docker Compose

Docker Compose định nghĩa và chạy multi-container applications. Thay vì chạy từng container manually, bạn mô tả toàn bộ stack trong một file YAML:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=db
      - REDIS_HOST=redis
    depends_on:
      - db
      - redis
    networks:
      - app-network
  db:
    image: postgres:15
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=myapp
    networks:
      - app-network
  redis:
    image: redis:7-alpine
    networks:
      - app-network
networks:
  app-network:
    driver: bridge
volumes:
  db-data:

Docker Compose Commands

docker-compose up -d
docker-compose logs -f
docker-compose up -d --scale web=3
docker-compose down
docker-compose up -d --build

Docker Registry và Images

Docker Registry là storage cho Docker images. Docker Hub là public registry lớn nhất, chứa hàng nghìn official images.

docker search nginx
docker pull nginx:1.25
docker push myusername/myapp:1.0
docker images
docker rmi nginx:1.25
docker image prune

Best Practices khi dùng Docker

1. Use Multi-stage Builds

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

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]

2. Don’t Run as Root

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

3. Use .dockerignore

node_modules
.git
.env
*.log
dist
coverage

4. Minimize Layers

RUN apt-get update && apt-get install -y nginx curl && rm -rf /var/lib/apt/lists/*

5. Health Checks

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

Docker Security

  • Scan images: docker scan myapp (Snyk)
  • Don’t store secrets in images: Use secrets management
  • Read-only root filesystem: docker run --read-only myapp
  • Limit capabilities: docker run --cap-drop ALL myapp
  • Use minimal base images: alpine, distroless

Docker trong Production

Khi deploy Docker trong production, cần quan tâm đến orchestration và resource management:

Container Orchestration

  • Docker Swarm: Built-in orchestration, simple
  • Kubernetes: Industry standard, complex setup
  • Amazon ECS/EKS: AWS container services
  • Google GKE: Google Kubernetes Engine

Resource Limits

docker run -m 512m myapp
docker run --cpus=1.5 myapp
docker run -m 512m --cpus=1.5 myapp

FAQ – Các câu hỏi thường gặp về Docker

  • Docker và Container khác nhau thế nào? Docker là platform và container runtime. Container là isolated execution environment để chạy ứng dụng. Docker cung cấp tooling để build, run, và manage containers. Alternatives như Podman, containerd, rkt tồn tại nhưng Docker là most widely used.
  • Làm sao debug container không start? Check logs: docker logs container_id. Inspect container: docker inspect container_id. Run interactively: docker run -it image_name bash. Check port conflicts: docker port container_id.
  • Container có persistent data không? Mặc định container filesystem là ephemeral. Dùng Docker volumes để persist data: docker run -v mydata:/data myapp. Named volumes: docker run -v mydata:/data myapp.
  • Multi-stage build có lợi ích gì? Cho phép tách build environment khỏi production image. Build stage có full tooling, production stage chỉ có runtime. Kết quả: image nhỏ hơn, bảo mật tốt hơn, deploy nhanh hơn.
  • Khi nào nên dùng Docker Compose vs Kubernetes? Docker Compose phù hợp cho development, testing, và small deployments. Kubernetes cho production với hundreds of containers, complex scaling, service mesh. Start với Compose, migrate sang K8s khi cần.

Kết luận

Docker đã thay đổi cách deploy applications. Containerization enable consistent deployments across environments từ development đến production. Hiểu Docker fundamentals là essential cho modern DevOps engineers và developers.

Key takeaways: Use Dockerfile để define image, Docker Compose cho multi-container apps, implement security best practices, và leverage container orchestration for production workloads.

Tìm hiểu thêm về các chủ đề liên quan trên vnhte.com:

Chào các bạn mình là Quốc Hùng , mình sinh ra thuộc cung song tử ,song tử luôn khẳng định chính mình ,luôn luôn phấn đấu vượt lên phía trước ,mình sinh ra và lớn lên tại vùng đất võ cổ truyền ,đam mê của mình là coder ,ngày đi học tối về viết blog ...