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
| Aspect | VM | Container |
|---|---|---|
| Isolation | Full isolation | Process-level isolation |
| Resource | GB RAM, GB disk | MB RAM, MB disk |
| Startup | Minutes | Seconds |
| Density | Few per server | Dozens per server |
| Portability | Good | Excellent |
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
| Instruction | Description |
|---|---|
| FROM | Base image |
| RUN | Execute command during build |
| COPY | Copy files vào image |
| ADD | Similar to COPY, có thể extract URLs |
| WORKDIR | Set working directory |
| ENV | Environment variables |
| EXPOSE | Document ports |
| CMD | Default command khi container starts |
| ENTRYPOINT | Main process (can’t override) |
| VOLUME | Define 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
| Driver | Description | Use Case |
|---|---|---|
| bridge | Default, isolated network | Standalone containers |
| host | Share host network stack | High performance, no isolation |
| overlay | Connect containers across hosts | Docker Swarm clusters |
| none | No networking | Isolated containers |
| macvlan | Assign MAC addresses | Legacy 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
| Type | Description |
|---|---|
| Named volumes | Docker-managed, persist across container removal |
| Bind mounts | Host directory mapped to container |
| tmpfs mounts | Stored in memory, not persisted |
| npipe mounts | Named 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: