- Tác giả

- Name
- Nguyễn Đức Xinh
- Ngày xuất bản
- Ngày xuất bản
Docker là gì? Giới thiệu toàn diện về Containerization
Trong thế giới phát triển phần mềm hiện đại, việc triển khai ứng dụng một cách nhất quán và đáng tin cậy trên nhiều môi trường khác nhau luôn là một thách thức lớn. Câu nói kinh điển "It works on my machine" đã trở thành nỗi ám ảnh của rất nhiều developer và DevOps engineer. Docker ra đời để giải quyết triệt để vấn đề này. Trong bài viết đầu tiên của chuỗi khóa học Docker, chúng ta sẽ tìm hiểu Docker là gì, tại sao nó lại quan trọng đến vậy, và lộ trình học tập mà bạn sẽ theo suốt khóa học.
Docker là gì?
Docker là một containerization platform mã nguồn mở (open-source) giúp bạn đóng gói ứng dụng cùng toàn bộ môi trường chạy (dependencies, libraries, cấu hình, runtime environment…) vào một “container” để chạy nhất quán trên mọi máy, từ laptop dev đến server production.
Hãy tưởng tượng bạn muốn gửi một món đồ chơi phức tạp cho bạn bè ở nhiều nơi khác nhau. Thay vì gửi linh kiện rời và hy vọng họ tự lắp đúng, bạn đóng tất cả vào một hộp chuẩn (có sẵn hướng dẫn, ốc vít, pin...). Chỉ cần mở hộp là chạy được ngay, dù người nhận dùng máy tính Windows, Mac hay Linux.
Docker làm đúng việc đó với phần mềm:
- Image = cái hộp đã đóng gói sẵn (ứng dụng + thư viện + cấu hình).
- Container = hộp đang chạy thực tế trên máy bạn.
- Docker = bộ công cụ để bạn: tạo image, chạy container từ image, chia sẻ image qua registry (ví dụ Docker Hub), và orchestrate nhiều container.
Lợi ích lớn nhất:
“Chạy được trên máy tôi” → “Chạy được ở mọi nơi” (máy dev, máy test, server production).
Nói dễ hiểu: thay vì bảo “cài Python 3.11, cài thư viện A/B/C, biến môi trường X=Y”, bạn đưa cho máy một image đã có sẵn tất cả, rồi ra lệnh docker run là chạy được ngay
Lịch sử phát triển
Docker được Solomon Hykes giới thiệu lần đầu tại PyCon 2013 dưới dạng một dự án nội bộ của dotCloud. Ban đầu, Docker được xây dựng dựa trên LXC (Linux Containers), nhưng sau đó đã phát triển runtime riêng gọi là libcontainer (nay là runc). Từ một dự án nhỏ, Docker đã nhanh chóng trở thành tiêu chuẩn công nghiệp cho containerization, thay đổi hoàn toàn cách chúng ta xây dựng, phân phối và chạy phần mềm.
Các khái niệm cốt lõi
Image & Container
- Image: gói read-only gồm code, runtime, libraries, config; được xây dựng từ các layer (mỗi layer là một tập hợp thay đổi trên filesystem).
- Container: instance đang chạy của một image; bạn có thể start/stop/move/delete container mà không ảnh hưởng đến image gốc.
- Layer & immutability: các layer không thể sửa đổi (immutable); khi có thay đổi, Docker sẽ tạo một layer mới chồng lên trên, giúp tái sử dụng layer và tối ưu kích thước image.
Dockerfile & Build
Dockerfile là một file văn bản mô tả cách build image: chọn base image, copy code, cài đặt dependencies, expose port, và định nghĩa lệnh khởi động container.
Khi bạn chạy docker build, Docker đọc Dockerfile và tạo ra image mới từ các layer tương ứng.
Registry & Docker Hub
Registry là nơi lưu trữ và phân phối image (public hoặc private).
Docker Hub là registry công khai lớn nhất, chứa rất nhiều official image (Node, Python, Postgres, Nginx…) mà bạn có thể dùng ngay.
Docker Compose
Compose dùng một file YAML để định nghĩa nhiều container cùng lúc (app + DB + cache…), rồi khởi động tất cả chỉ bằng một lệnh.
Rất tiện cho microservices hoặc những stack có nhiều thành phần.
Kiến trúc Docker (góc nhìn kỹ thuật)
- Docker Client (CLI) gửi lệnh tới Docker Daemon (
dockerd). - Daemon quản lý image, container, network, volume; giao tiếp qua API.
- Container chạy như một tiến trình ở user-space, dùng namespace/cgroup của Linux để cô lập tài nguyên.
Tại sao nên học Docker?
1. Consistency across environments
Một trong những lợi ích lớn nhất của Docker là đảm bảo tính nhất quán giữa các môi trường. Khi bạn đóng gói ứng dụng vào container, nó sẽ hoạt động giống hệt nhau trên máy development, staging server, và production server. Không còn tình trạng "works on my machine" nữa.
Development → Staging → Production
↓ ↓ ↓
[Container] [Container] [Container]
(identical) (identical) (identical)
2. Portability
Docker container có thể chạy trên bất kỳ nền tảng nào hỗ trợ Docker: Linux, macOS, Windows, các cloud provider như AWS, Google Cloud, Azure, hay thậm chí là Raspberry Pi. Bạn build một lần và chạy ở mọi nơi — đây chính là triết lý "Build once, run anywhere" của Docker.
3. Microservices Architecture
Docker là nền tảng lý tưởng cho kiến trúc microservices. Mỗi service có thể được đóng gói trong một container riêng biệt với dependencies riêng, scaling độc lập, và deploy riêng lẻ mà không ảnh hưởng đến các service khác.
4. CI/CD Integration
Docker tích hợp hoàn hảo với các CI/CD pipeline. Bạn có thể build Docker image trong CI, chạy test trong container, và deploy chính xác image đã được test lên production. Điều này đảm bảo rằng những gì bạn test là chính xác những gì sẽ chạy trên production.
5. DevOps và Cloud-Native
Docker là thành phần cốt lõi trong hệ sinh thái DevOps và cloud-native. Hầu hết các công cụ DevOps hiện đại như Kubernetes, Jenkins, GitLab CI, GitHub Actions đều có tích hợp sâu với Docker. Nắm vững Docker là bước đệm quan trọng để tiến vào thế giới DevOps và cloud-native.
6. Nhu cầu thị trường
Theo các khảo sát từ Stack Overflow và các nền tảng tuyển dụng, Docker consistently nằm trong top những kỹ năng được yêu cầu nhiều nhất cho các vị trí Backend Developer, DevOps Engineer, SRE (Site Reliability Engineer), và Cloud Engineer. Học Docker không chỉ nâng cao kỹ năng kỹ thuật mà còn tăng giá trị của bạn trên thị trường lao động.
Các tính năng chính của Docker
Process Isolation
Docker sử dụng các tính năng của Linux kernel như namespaces và cgroups để tạo ra môi trường cô lập cho mỗi container. Mỗi container có process tree, network stack, filesystem riêng, giống như một máy tính thu nhỏ nhưng nhẹ hơn rất nhiều so với virtual machine.
Lightweight và Fast Startup
Khác với virtual machine cần boot cả một hệ điều hành, Docker container chia sẻ kernel với host OS và chỉ chứa những gì ứng dụng cần. Điều này khiến container khởi động trong vài giây (thậm chí mili giây), so với vài phút của VM.
# Khởi động một container Nginx chỉ mất chưa đầy 1 giây
time docker run -d nginx
# Output: real 0m0.832s
Image Layering System
Docker sử dụng hệ thống layer (tầng) để xây dựng image. Mỗi instruction trong Dockerfile tạo ra một layer mới. Các layer được cache và chia sẻ giữa các image, giúp tiết kiệm disk space và tăng tốc build time.
Layer 4: COPY app/ /app (Application code)
Layer 3: RUN npm install (Dependencies)
Layer 2: RUN apt-get update (System packages)
Layer 1: FROM node:18 (Base image)
Docker Hub và Registry
Docker Hub là registry công cộng lớn nhất cho Docker image, với hàng triệu image sẵn có. Bạn có thể pull image chính thức (official image) của hầu hết mọi phần mềm phổ biến: nginx, postgres, redis, node, python, và nhiều hơn nữa. Ngoài ra, bạn cũng có thể push image của mình lên Docker Hub hoặc sử dụng private registry.
Docker Compose
Docker Compose cho phép bạn định nghĩa và quản lý multi-container application bằng một file YAML duy nhất. Đây là công cụ không thể thiếu khi làm việc với ứng dụng có nhiều service.
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
Use Cases thực tế
Development Environment
Docker giúp đồng bộ môi trường phát triển cho cả team. Thay vì viết hướng dẫn cài đặt dài dòng, bạn chỉ cần share Dockerfile hoặc docker-compose.yml. Developer mới chỉ cần chạy docker compose up là có ngay môi trường phát triển hoàn chỉnh.
Microservices Deployment
Các công ty lớn như Netflix, Uber, Spotify đều sử dụng Docker để triển khai hàng nghìn microservices. Mỗi service được đóng gói trong container riêng, có thể scale độc lập và deploy không downtime.
CI/CD Pipelines
Docker đóng vai trò quan trọng trong CI/CD pipeline. Ví dụ trong GitHub Actions:
# .github/workflows/ci.yml
jobs:
test:
runs-on: ubuntu-latest
container:
image: node:18
steps:
- uses: actions/checkout@v4
- run: npm install
- run: npm test
build:
needs: test
steps:
- name: Build Docker Image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to Registry
run: docker push myapp:${{ github.sha }}
Cloud Migration
Docker giúp đơn giản hóa quá trình migration lên cloud. Bạn có thể containerize ứng dụng hiện tại và triển khai lên bất kỳ cloud provider nào hỗ trợ container: AWS ECS, Google Cloud Run, Azure Container Instances, hoặc Kubernetes cluster.
Testing và QA
Docker cho phép tạo môi trường test cô lập và reproducible. Bạn có thể spin up database, message queue, và các service phụ thuộc trong vài giây để chạy integration test, sau đó tear down tất cả khi xong.
So sánh Docker với công nghệ tương tự
Docker vs Virtual Machines
| Tiêu chí | Docker Container | Virtual Machine |
|---|---|---|
| Startup time | Vài giây | Vài phút |
| Resource usage | Thấp (MB) | Cao (GB) |
| Isolation | Process-level | Hardware-level |
| OS | Chia sẻ kernel | Riêng biệt |
| Portability | Cao | Trung bình |
| Performance | Gần native | Overhead đáng kể |
Docker vs Podman
Podman là một container engine do Red Hat phát triển, tương thích với Docker nhưng có một số khác biệt quan trọng:
- Podman chạy daemonless (không cần background daemon như dockerd)
- Podman hỗ trợ rootless containers tốt hơn
- Podman tương thích CLI với Docker (alias docker=podman)
- Podman hỗ trợ pods concept tương tự Kubernetes
Docker vs LXC/LXD
LXC (Linux Containers) là công nghệ container trước Docker, tập trung vào việc chạy toàn bộ hệ điều hành trong container (system container), trong khi Docker tập trung vào application container. LXD là lớp quản lý phía trên LXC, cung cấp trải nghiệm giống VM hơn.
Yêu cầu tiên quyết
Trước khi bắt đầu học Docker, bạn nên có kiến thức cơ bản về:
Linux Basics
Docker được xây dựng trên Linux kernel technologies. Hiểu biết cơ bản về Linux sẽ giúp bạn làm việc hiệu quả hơn với Docker:
- Filesystem hierarchy (
/,/var,/etc,/tmp) - File permissions (
chmod,chown) - Process management (
ps,top,kill) - Package management (
apt,yum)
Command Line
Hầu hết các thao tác với Docker được thực hiện qua command line. Bạn cần thoải mái với:
- Navigation:
cd,ls,pwd - File operations:
cp,mv,rm,mkdir - Text editing:
vim,nano - Pipe và redirect:
|,>,>>
Basic Networking
Hiểu biết cơ bản về networking sẽ hữu ích khi làm việc với Docker networking:
- IP address, port, protocol (TCP/UDP)
- DNS resolution
- HTTP/HTTPS basics
- Firewall concepts
Cài đặt Docker
Để chuẩn bị cho các bài học tiếp theo, bạn nên cài đặt Docker trên máy tính:
macOS và Windows
Cách đơn giản nhất là cài Docker Desktop từ docker.com. Docker Desktop bao gồm Docker Engine, Docker CLI, Docker Compose, và GUI để quản lý container.
Linux (Ubuntu/Debian)
# Cập nhật package index
sudo apt-get update
# Cài đặt prerequisites
sudo apt-get install -y ca-certificates curl gnupg
# Thêm Docker GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Thêm Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Cài đặt Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Thêm user vào docker group (không cần sudo)
sudo usermod -aG docker $USER
Kiểm tra cài đặt
# Kiểm tra Docker version
docker --version
# Output: Docker version 27.x.x, build xxxxxxx
# Kiểm tra Docker hoạt động
docker run hello-world
Nếu bạn thấy thông báo "Hello from Docker!" thì việc cài đặt đã thành công.
Ví dụ thực tế
Mức cơ bản: chạy một app có sẵn
# Kéo image nginx chính chủ và chạy container
docker run -d -p 8080:80 --name my-nginx nginx
-d: chạy nền; -p 8080:80: map port; --name: đặt tên.
Mức trung bình: tự build image cho app của bạn
Tạo Dockerfile (ví dụ Node.js):
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Build & chạy:
docker build -t my-node-app .
docker run -d -p 3000:3000 --name my-app my-node-app
FROM chọn base image; COPY/RUN xây layer; CMD là lệnh khởi động.
Mức nâng cao: nhiều service với Compose
File docker-compose.yml:
services:
web:
build: .
ports: ["3000:3000"]
environment:
- DATABASE_URL=postgres://user:pass@db:5432/app
db:
image: postgres:16
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Khởi động toàn bộ stack:
docker compose up -d
Compose tạo mạng nội bộ, kết nối web với db qua tên service, và quản lý volume bền vững.
Mẹo & lưu ý quan trọng
- Chọn base image nhỏ (
alpine,distroless) để giảm kích thước và bề mặt tấn công. - Tối ưu layer: gom lệnh, tránh
RUNthừa, dùng.dockerignoređể không copy file không cần. - Không lưu secret trong image: dùng biến môi trường, secret manager, hoặc Docker secrets.
- Stateless container: dữ liệu bền vững nên đưa ra ngoài qua volume/bind mount.
Kết luận
Docker đã cách mạng hóa cách chúng ta xây dựng, phân phối và triển khai phần mềm. Từ một dự án open-source nhỏ vào năm 2013, Docker đã trở thành công nghệ không thể thiếu trong hệ sinh thái phát triển phần mềm hiện đại. Dù bạn là developer, system administrator, hay DevOps engineer, việc nắm vững Docker sẽ giúp bạn làm việc hiệu quả hơn và mở ra nhiều cơ hội nghề nghiệp.
Trong bài tiếp theo, chúng ta sẽ đi sâu vào cách Docker hoạt động bên trong — từ Linux namespaces, cgroups đến union filesystem — để hiểu rõ container thực sự là gì và tại sao nó lại nhẹ và nhanh đến vậy.
Hãy đảm bảo bạn đã cài đặt Docker thành công trước khi chuyển sang bài tiếp theo. Nếu gặp vấn đề trong quá trình cài đặt, hãy kiểm tra Docker documentation hoặc đặt câu hỏi trong phần comment bên dưới.
