Docker là gì? Tại sao Container đang thay đổi cách chúng ta dùng Virtual Machine (VM)?
Giải thích Docker là gì, Container hoạt động ra sao, khác Virtual Machine ở kernel, hiệu năng, bảo mật và deployment; kèm Dockerfile, workflow và ma trận lựa chọn thực tế.
ShanverseUpdated 12 min read— viewsLoading views
Docker
Deployment
Câu chuyện quen thuộc của developer:
“Code chạy trên máy tôi, nhưng lên server lại lỗi.”
Nguyên nhân có thể là version runtime khác, thiếu thư viện hệ thống, biến môi trường không đúng hoặc cách cấu hình khác nhau. Docker giải quyết phần lớn vấn đề này bằng cách biến môi trường chạy thành một artifact có thể version, kiểm thử và triển khai lặp lại.
Docker là gì?
Docker là một nền tảng và bộ công cụ để:
Mô tả môi trường chạy bằng Dockerfile.
Build môi trường đó thành Image.
Chạy Image thành một hoặc nhiều Container.
Comments
Phân phối Image qua Registry như Docker Hub hoặc registry riêng.
Mermaid
Loading diagram…
Docker không phải là Container duy nhất trên thị trường. Container dựa trên các khả năng của hệ điều hành, còn Docker cung cấp trải nghiệm developer, định dạng Image, CLI và workflow thuận tiện xung quanh chúng.
Các khái niệm cốt lõi
Docker Image
Image là template chỉ đọc chứa:
Application code.
Runtime như Node.js, Python hoặc Java.
System libraries cần thiết.
File cấu hình mặc định.
Metadata và startup command.
Image được tạo theo layer. Khi một layer không đổi, Docker có thể tái sử dụng cache để build và phân phối nhanh hơn.
Container
Container là một instance đang chạy của Image. Mỗi Container có:
Process riêng.
Network namespace riêng.
Filesystem view riêng.
Resource limit có thể cấu hình.
Writable layer tạm phía trên Image.
Khi xóa Container, dữ liệu trong writable layer có thể mất. Dữ liệu cần tồn tại lâu phải dùng Volume, bind mount hoặc dịch vụ storage bên ngoài.
Dockerfile
Dockerfile là công thức build Image.
Ví dụ ứng dụng Node.js:
Build và chạy:
Registry
Registry lưu và phân phối Image:
Không dùng tag latest như nguồn sự thật duy nhất trong production. Tag version hoặc digest giúp deployment có thể tái hiện.
Docker Engine và Docker Desktop
Docker Engine quản lý Image, Container, network và volume.
Docker CLI gửi command tới Engine.
Docker Desktop cung cấp môi trường tích hợp trên macOS/Windows và thường chạy Linux Container bên trong một VM nhẹ.
Container hoạt động như thế nào?
Container không mô phỏng toàn bộ máy tính. Nó cô lập process bằng các tính năng kernel.
Trên Linux, những nền tảng quan trọng gồm:
Namespaces: tách process, network, mount, hostname và user view.
cgroups: giới hạn/đo CPU, memory và I/O.
Capabilities: chia nhỏ quyền của root.
seccomp, AppArmor, SELinux: hạn chế hành vi hệ thống.
Layered filesystem: chia sẻ layer Image và thêm writable layer.
Mermaid
Loading diagram…
Container nhìn giống một máy riêng từ bên trong, nhưng process vẫn dùng kernel của host.
Virtual Machine hoạt động như thế nào?
VM ảo hóa phần cứng. Hypervisor tạo máy ảo với CPU, memory, disk và network ảo. Mỗi VM chạy một guest operating system riêng.
Mermaid
Loading diagram…
Ví dụ hypervisor/platform:
KVM.
Hyper-V.
VMware.
Cloud VM như EC2, Compute Engine hoặc Azure VM.
Mỗi VM có kernel riêng, vì vậy isolation boundary mạnh và linh hoạt hơn về hệ điều hành, nhưng tốn tài nguyên hơn.
Kiến trúc Container vs VM
Virtual Machine
Container
Điểm khác biệt quan trọng nhất: VM có guest OS/kernel riêng; Container chia sẻ host kernel.
Bảng so sánh Container và VM
Các con số kích thước/khởi động là xu hướng, không phải cam kết. Image lớn hoặc application nặng vẫn có thể khởi động chậm.
Tại sao Container được coi là “thay thế” VM?
Container không thay mọi VM, nhưng đã thay VM trong đơn vị đóng gói và triển khai ứng dụng ở nhiều hệ thống.
1. Khởi động nhanh
Container khởi động process thay vì boot cả guest OS:
Startup nhanh phù hợp:
Autoscaling.
CI job ngắn.
Serverless/container jobs.
Rollout và rollback nhanh.
2. Nhẹ và mật độ cao
Nhiều Container dùng chung kernel và Image layers. Một host có thể chạy nhiều workload hơn so với mỗi workload một VM đầy đủ.
Điều này giảm:
RAM dành cho guest OS.
Disk chứa OS image trùng lặp.
Thời gian provision.
Chi phí với workload nhỏ.
3. “Build once, run consistently”
Image đóng gói runtime và dependencies:
Khác biệt môi trường vẫn có thể tồn tại ở kernel, architecture, secret, network và external services, nhưng phạm vi “works on my machine” giảm đáng kể.
4. Immutable deployment
Thay vì SSH vào server và sửa trực tiếp:
Deployment trở nên có version và dễ audit hơn.
5. Phù hợp CI/CD
Pipeline có thể:
Build Image.
Scan dependency/vulnerability.
Chạy test.
Push Image.
Deploy cùng artifact đã test.
Không phải cài runtime thủ công trên từng server.
6. Tách ứng dụng thành service nhỏ
Mỗi service có thể có:
Runtime riêng.
Dependency riêng.
Release cycle riêng.
Resource limit riêng.
Một service Python và một service Node.js có thể chạy cạnh nhau mà không làm bẩn dependency của host.
7. Scale và orchestration
Container là đơn vị phù hợp cho các nền tảng orchestration như Kubernetes:
Orchestrator xử lý scheduling, health check, restart, service discovery và rollout. Docker tự nó không thay toàn bộ vai trò của Kubernetes.
Nhưng Container không hoàn toàn thay thế VM
1. Isolation bảo mật khác nhau
Container chia sẻ kernel. Kernel vulnerability hoặc cấu hình quyền sai có thể tăng blast radius.
Biện pháp giảm rủi ro:
Chạy non-root user.
Drop Linux capabilities.
Read-only filesystem khi có thể.
Resource limits.
seccomp/AppArmor/SELinux.
Image scanning và patching.
Không mount Docker socket tùy tiện.
Không dùng --privileged nếu không thật sự cần.
VM cung cấp kernel boundary riêng, thường phù hợp hơn cho multi-tenant không tin cậy hoặc yêu cầu isolation cao.
2. Không chạy tùy ý mọi kernel
Linux Container cần Linux kernel; Windows Container cần Windows kernel tương thích. Bạn không thể chạy một kernel khác chỉ bằng Image.
VM có thể chạy guest OS khác với host trong phạm vi hypervisor hỗ trợ.
3. Legacy và desktop workload
Ứng dụng cần:
Full desktop environment.
Driver/kernel module riêng.
Legacy OS cụ thể.
Hardware passthrough phức tạp.
có thể phù hợp với VM hơn.
4. Stateful workload cần thiết kế cẩn thận
Database có thể chạy trong Container, nhưng production cần:
Persistent volume.
Backup/restore.
Replication.
IOPS và latency phù hợp.
Upgrade strategy.
Failure-domain planning.
Container không tự giải quyết durability.
5. Compliance và tenancy
Một số policy yêu cầu boundary VM, dedicated host hoặc hardware isolation. Container vẫn có thể chạy bên trong mỗi VM để kết hợp hai lớp.
Mô hình phổ biến nhất: Container chạy trong VM
Trên cloud, kiến trúc thường là:
Mermaid
Loading diagram…
VM cung cấp:
Tenant/infrastructure isolation.
Kernel boundary.
Node lifecycle.
Container cung cấp:
App packaging.
Fast deployment.
High density.
Scaling unit.
Đây không phải lựa chọn “VM hoặc Container”; thường là “VM và Container”.
Docker workflow thực tế
1. Viết .dockerignore
Không gửi secret hoặc file thừa vào build context.
2. Build Image
3. Kiểm tra Image
4. Chạy Container
Không truyền production secret trực tiếp trong command được lưu vào shell history. Dùng secret manager/cơ chế secret của platform.
5. Xem trạng thái và log
6. Dừng và xóa
Với --rm, Container được xóa sau khi dừng.
Multi-stage build để Image nhỏ hơn
Lợi ích:
Không đưa compiler/dev dependencies vào runtime Image.
Giảm attack surface.
Image nhỏ hơn, pull nhanh hơn.
Tách build environment khỏi runtime.
Docker Compose cho môi trường local
Chạy:
Password demo không dùng cho production. Production secret phải được quản lý bằng cơ chế phù hợp.
Những hiểu lầm phổ biến
“Container là VM siêu nhẹ”
Container và VM có abstraction khác nhau. Container cô lập process; VM ảo hóa máy tính và chạy OS riêng.
“Image chạy ở đâu cũng giống 100%”
Image giúp nhất quán user space, nhưng host architecture, kernel, network, volume, secret và external service vẫn ảnh hưởng.
“Container tự động an toàn”
Image không rõ nguồn, process root, socket mount hoặc privileged mode có thể rất nguy hiểm.
“Xóa Container là mất Image”
Image và Container là hai object khác nhau. Bạn có thể xóa Container nhưng vẫn dùng Image để tạo Container mới.
“Dữ liệu nằm an toàn trong Container”
Writable layer không phải persistent storage đáng tin cậy. Dùng Volume/managed database và backup.
“Docker và Kubernetes là một”
Docker tập trung vào build/run Container và developer workflow; Kubernetes điều phối workload trên cluster.
Khi nào nên dùng Container?
API, web app và microservice.
Worker/background job.
CI/CD job cần môi trường lặp lại.
Local development nhiều dependency.
Batch processing.
Ứng dụng cần scale ngang nhanh.
Phân phối software dưới dạng Image.
Khi nào VM phù hợp hơn?
Cần guest OS/kernel riêng.
Chạy legacy application khó containerize.
Isolation mạnh giữa tenant không tin cậy.
Desktop/GUI hoặc driver đặc thù.
Policy/compliance yêu cầu VM boundary.
Cần quản trị một máy hoàn chỉnh thay vì một application process.
Khi nào dùng cả hai?
Kubernetes nodes chạy trên cloud VM.
Mỗi khách hàng/tenant có VM riêng, bên trong có nhiều Container.
CI runner VM tạm thời chạy build Container.
VM làm security boundary, Container làm deployment boundary.
Checklist trước khi đưa Docker vào production
Image dùng base image tin cậy và pin version/digest phù hợp.
Không có secret trong Image layer hoặc build context.
Process chạy non-root.
Image được scan vulnerability.
Resource request/limit được đặt.
Health check và graceful shutdown đã test.
Log được gửi ra stdout/stderr hoặc hệ thống tập trung.
Dữ liệu persistent dùng Volume/managed storage.
Backup và restore đã được diễn tập.
Network exposure tối thiểu.
Không mount Docker socket tùy tiện.
Image có version và có kế hoạch rollback.
Base image/runtime được cập nhật định kỳ.
Cách chọn trong 30 giây
Mermaid
Loading diagram…
Tổng kết
Docker là nền tảng build, phân phối và chạy Container.
Container đóng gói ứng dụng và user-space dependencies, nhưng dùng chung host kernel.
VM ảo hóa phần cứng và chạy guest OS/kernel riêng.
Container nhanh, nhẹ, mật độ cao và phù hợp CI/CD.
VM mạnh về OS flexibility và isolation boundary.
Kiến trúc hiện đại thường chạy Container bên trong VM.
Hướng dẫn tự động deploy ứng dụng Docker lên VPS Ubuntu và cloud providers bằng GitHub Actions: AWS ECS/App Runner/EC2, Vercel, Render, secrets, healthcheck, rollback và zero-downtime strategy.
Hướng dẫn Docker Networks toàn diện: bridge, host, none, overlay, service discovery, port publishing, Compose network segmentation, internal networks, bảo mật và debug kết nối.