Một vấn đề cực kỳ quen thuộc trong ngành phần mềm: developer viết xong code, chạy ngon lành trên máy cá nhân, nhưng khi đẩy lên server production thì toàn lỗi. Lý do? Sự khác biệt về phiên bản thư viện, cấu hình OS, biến môi trường – những thứ tưởng chừng nhỏ nhưng phá vỡ toàn bộ quy trình deployment.

Docker ra đời để giải quyết chính xác vấn đề đó. Vậy Docker là gì, và cơ chế nào giúp nó làm được điều đó? Kể từ khi AWS tích hợp sâu với hệ sinh thái container  thông qua ECS, Fargate, EKS – việc triển khai ứng dụng Docker trên cloud trở nên nhanh hơn, rẻ hơn và đáng tin cậy hơn bao giờ hết.

Docker là gì? Tại sao nó thay đổi cách chúng ta triển khai phần mềm

Docker là một nền tảng phần mềm cho phép bạn xây dựng, thử nghiệm và triển khai ứng dụng nhanh chóng thông qua các đơn vị tiêu chuẩn hóa gọi là container. Mỗi container chứa toàn bộ những gì ứng dụng cần để chạy: code, thư viện hệ thống, công cụ runtime và cấu hình.

Hiểu đơn giản hơn: Container là một chiếc hộp kín hoàn chỉnh. Bạn đóng gói ứng dụng vào đó, và nó chạy giống y hệt ở bất kỳ đâu – máy tính cá nhân, server on-premise hay môi trường cloud. Đây chính là triết lý “Write Once, Run Anywhere – Viết một lần, Sử dụng ở mọi nơi” mà Docker mang lại.

Docker được phát triển bởi Solomon Hykes như một dự án nội bộ tại DotCloud vào năm 2010, sau đó ra mắt công khai năm 2013. Đến năm 2017, Docker đã trở thành chuẩn mực toàn cầu cho Containerization (Container hóa). Theo Red Hat: Hơn 80% doanh nghiệp lớn hiện đang sử dụng Docker trong quy trình phát triển phần mềm.

>> Xem thêm: Containers đã và đang trở thanh một tiêu chuẩn dẫn đầu xu thế mới

Container khác Máy ảo (VM) như thế nào?

Cả Container và VM đều là công nghệ ảo hóa, nhưng chúng hoạt động ở các tầng khác nhau trong kiến trúc hệ thống.

  • VM ảo hóa phần cứng của máy chủ vật lý. Mỗi VM chạy một hệ điều hành đầy đủ riêng – có nghĩa là bạn cần vài phút để khởi động, và tốn nhiều tài nguyên hơn vì mỗi VM mang theo cả Kernel (Nhân hệ điều hành) riêng.
  • Container ảo hóa hệ điều hành của máy chủ. Các Container chia sẻ Kernel của host OS nhưng chạy trong môi trường cô lập riêng. Kết quả là container khởi động trong vài giây, nhẹ hơn đáng kể, và có mật độ triển khai cao hơn nhiều trên cùng một máy chủ vật lý.

Trong một cụm production thực tế, bạn hoàn toàn có thể chạy hàng chục container trên một EC2 instance – điều mà VM không làm được ở cùng mức hiệu suất và chi phí.

Các thành phần cốt lõi trong hệ sinh thái Docker

Trước khi bắt tay container hóa, bạn cần nắm rõ bốn khái niệm nền tảng:

  • Docker Engine là trái tim của hệ thống – bao gồm server (Docker Daemon), REST API và CLI. Daemon chịu trách nhiệm build, chạy và quản lý container trên máy chủ.
  • Docker Image là bản thiết kế bất biến (immutable) cho container. Image được xây dựng theo từng layer dựa trên các lệnh trong Dockerfile. Một khi image được tạo ra, nó không thể thay đổi – đây là nền tảng của tính nhất quán môi trường.
  • Docker Container là instance đang chạy của một image. Bạn có thể start, stop, restart hay xóa container bất cứ lúc nào thông qua Docker CLI hoặc API. Mỗi container hoạt động trong môi trường cô lập hoàn toàn với các container khác.
  • Dockerfile là tập tin văn bản chứa tập hợp các lệnh để build image. Từ image base, bạn định nghĩa thư mục làm việc, copy code, cài dependencies, expose port và chỉ định lệnh khởi động.
  • Ngoài ra còn có Docker Hub – registry công khai nơi bạn có thể tìm và tải về hàng triệu image có sẵn từ cộng đồng – từ nginx, postgres, redis cho đến các runtime phổ biến như node, python, java.

Các thành phần cốt lõi trong hệ sinh thái Docker

Quy trình Container hóa ứng dụng từ A đến Z

Một khi đã nắm rõ Docker là gì và bốn thành phần cốt lõi ở trên, bạn đã sẵn sàng để thực hành. Dưới đây là quy trình làm việc cơ bản khi bạn container hóa một ứng dụng Node.js:

Bước 1: Viết Dockerfile

Bắt đầu bằng việc tạo file Dockerfile ở root của dự án. Một Dockerfile production-ready cho Node.js trông như thế này:

dockerfile

# Stage 1: Build

FROM node:20 AS build

WORKDIR /app

COPY package*.json ./

RUN npm ci

COPY . .

RUN npm run build

# Stage 2: Production image

FROM node:20-slim

WORKDIR /app

RUN useradd -m appuser

COPY –from=build /app/dist ./dist

USER appuser

EXPOSE 3000

CMD [“node”, “dist/index.js”]

Đây là ví dụ multi-stage build – một best practice quan trọng giúp giữ image production nhỏ gọn bằng cách chỉ copy artifacts cuối cùng vào image chạy thực tế, loại bỏ toàn bộ build tools.

Bước 2: Build image

bash

docker build -t my-app:1.0 .

Bước 3: Kiểm thử cục bộ 

bash

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

Bước 4: Push lên registry

Nếu deploy lên AWS, bạn sẽ push image lên Amazon ECR (Elastic Container Registry):

bash

aws ecr get-login-password –region ap-southeast-1 | docker login –username AWS –password-stdin <account-id>.dkr.ecr.ap-southeast-1.amazonaws.com

docker tag my-app:1.0 <account-id>.dkr.ecr.ap-southeast-1.amazonaws.com/my-app:1.0

docker push <account-id>.dkr.ecr.ap-southeast-1.amazonaws.com/my-app:1.0

Bước 5: Deploy lên AWS

Sau khi image đã có trên ECR, bạn có thể deploy thông qua ECS, Fargate hoặc EKS – tùy theo nhu cầu kiến trúc.

4 Dịch vụ bạn cần biết khi chạy Docker trên AWS

AWS cung cấp hệ sinh thái container đầy đủ và phát triển nhất trong các nhà cung cấp cloud hiện nay. Theo AWS, các dịch vụ chính để chạy Docker bao gồm:

Amazon ECS (Elastic Container Service)

Là dịch vụ container orchestration được quản lý hoàn toàn, cho phép bạn chạy Docker container trên hạ tầng AWS với hiệu suất cao và khả năng mở rộng tự động. ECS đặc biệt phù hợp khi bạn muốn kiểm soát tốt cấu hình nhưng không muốn tự vận hành Kubernetes từ đầu.

AWS Fargate

Là compute engine serverless dành cho container. Với Fargate, bạn không cần quan tâm đến việc provision, patch hay scale EC2 instances – AWS lo toàn bộ phần hạ tầng. Bạn chỉ cần định nghĩa CPU và memory cho task, rồi để Fargate lo phần còn lại.

Amazon EKS (Elastic Kubernetes Service)

Dành cho các team đã quen với Kubernetes hoặc cần chạy các workload phức tạp với nhiều yêu cầu tùy chỉnh hơn. EKS cho phép bạn chạy Kubernetes trên AWS mà không cần tự cài đặt và vận hành Kubernetes masters.

Amazon ECR (Elastic Container Registry)

Là private registry cho Docker images, tích hợp sẵn với IAM để kiểm soát quyền truy cập, tự động mã hóa images khi lưu trữ và tối ưu tốc độ pull trong môi trường AWS.

Instance types và cấu hình Fargate: Chọn đúng cho đúng workload

Đây là điểm nhiều đội kỹ thuật hay bỏ qua khi bắt đầu với Docker trên AWS. Khi dùng ECS với EC2 launch type, bạn hoàn toàn kiểm soát instance type. AWS cung cấp nhiều dòng instance phù hợp với các loại workload khác nhau:

  • Dòng t3/t4g (burstable) phù hợp với ứng dụng có tải không đều như dev/staging environments hoặc web API nhỏ.
  • Dòng m6g/m6i (general purpose) tốt cho production với tải ổn định. 
  • Dòng c6g/c6i (compute-optimized) dành cho các container xử lý tính toán nặng.
  • Dòng r6g/r6i (memory-optimized) phù hợp với database container hoặc cache in-memory.

Khi dùng AWS Fargate, bạn không chọn instance type mà định nghĩa trực tiếp CPU và memory cho từng task. Fargate hỗ trợ các cấu hình sau:

  • Với 0.25 vCPU: memory từ 0.5 GB đến 2 GB.
  • Với 0.5 vCPU: memory từ 1 GB đến 4 GB.
  • Với 1 vCPU: memory từ 2 GB đến 8 GB.
  • Với 2 vCPU: memory từ 4 GB đến 16 GB.
  • Với 4 vCPU: memory từ 8 GB đến 30 GB.
  • Với 8 vCPU: memory từ 16 GB đến 60 GB.
  • Với 16 vCPU: memory từ 32 MB đến 120 GB.

Fargate cũng hỗ trợ kiến trúc ARM (Graviton2/Graviton3) – một lựa chọn đáng để cân nhắc vì chi phí ARM thấp hơn khoảng 20% so với x86 ở mức hiệu năng tương đương. Thêm vào đó, hầu hết Linux container đều tương thích với ARM mà không cần thay đổi code.

Chi phí thực tế khi dùng Docker trên AWS

Chi phí là yếu tố quan trọng trong bất kỳ quyết định kiến trúc nào. Dưới đây là cái nhìn tổng quan dựa trên chi phí chia sẻ từ AWS.

ECS không tính phí riêng, mà bạn chỉ trả cho tài nguyên compute thực tế sử dụng.

  • Với EC2 launch type, bạn trả phí EC2 instance bình thường theo giờ.
  • Với Fargate, bạn trả theo vCPU và memory consumed, tính từng giây với mức tối thiểu 1 phút.

Chi phí Fargate (Linux/x86, us-east-1) tại thời điểm hiện tại:

  • vCPU: khoảng $0.04048 mỗi vCPU/giờ.
  • Memory: khoảng $0.004445 mỗi GB/giờ.
  • Storage: 20 GB ephemeral storage miễn phí; phần thêm tính $0.000111/GB/giờ.

Chi phí Fargate Linux/ARM (Graviton2) thấp hơn khoảng 20%:

  • vCPU: khoảng $0.03238 mỗi vCPU/giờ.
  • Memory: khoảng $0.00356 mỗi GB/giờ.

Ví dụ: Một service chạy 5 ECS tasks trên Fargate ARM, mỗi task dùng 1 vCPU và 2 GB memory, chạy 10 phút/ngày trong 30 ngày – tổng chi phí khoảng $0.99/tháng. Để so sánh, cùng workload đó chạy Windows container sẽ tốn khoảng 3 – 4 lần do Microsoft licensing fees (phí cấp phép).

Fargate Spot là lựa chọn tiết kiệm chi phí đến 70% cho các workload chịu được gián đoạn như batch jobs, CI/CD pipelines hoặc môi trường dev/test. AWS có thể thu hồi Spot capacity sau 2 phút thông báo, nhưng ECS sẽ tự động tìm capacity thay thế ở Availability Zone khác.

ECS Managed Instances ra mắt năm 2025, là lựa chọn trung gian: Bạn có EC2 pricing nhưng AWS lo toàn bộ việc provision, patching và scaling. Phí quản lý là $0.02/giờ/instance, áp dụng cho mọi instance type từ t3.micro đến m5.24xlarge.

Savings Plans có thể giảm chi phí Fargate đến 50% nếu bạn cam kết lượng compute (tính bằng $/giờ) trong 01 hoặc 03 năm.

Nguyên tắc vàng khi container hóa ứng dụng

Dưới đây là những nguyên tắc đã được Renova Cloud chứng minh tính hiệu quả qua các dự án trong thực tế:

Giữ image nhỏ gọn

Theo báo cáo Cloud-Native Security 2025 từ Sysdig: Số lượng package trong container images tăng 300% trong năm qua.

Image càng lớn, attack surface càng rộng và thời gian pull càng lâu. Dùng Alpine hoặc distroless base images, kết hợp với multi-stage build để loại bỏ build dependencies khỏi production image.

Không chạy container với quyền root

Theo hướng dẫn bảo mật từ AWS: Docker sẽ được mặc định chạy container với user root nếu bạn không chỉ định khác.

Luôn tạo một user không có quyền admin trong Dockerfile và switch sang user đó trước khi chạy ứng dụng.

Pin phiên bản cụ thể cho base image

Tránh dùng tag latest trong production vì nó có thể kéo về phiên bản mới nhất không tương thích với ứng dụng của bạn. Thay vào đó, pin cụ thể: node:20-slim thay vì node:latest.

Thêm .dockerignore

Tương tự .gitignore, file này ngăn các thư mục không cần thiết như node_modules, .git, file .env được copy vào image – vừa giảm kích thước image, vừa tránh lộ secrets.

Không hardcode secrets trong Dockerfile hay environment variables

Dùng AWS Secrets Manager hoặc AWS Systems Manager Parameter Store để Inject secrets (chèn thông tin bí mật) vào container runtime. Đây là nguyên tắc bắt buộc cho mọi môi trường production trên AWS.

Thêm Healthcheck

Không có healthcheck, Docker và ECS không thể phát hiện khi service bên trong container bị lỗi. Khai báo healthcheck ngay trong Dockerfile hoặc task definition để orchestrator có thể tự động restart container khi cần.

Scan image trước khi deploy

Tích hợp công cụ scan như Trivy, Snyk hoặc Amazon Inspector vào CI/CD pipeline để tự động phát hiện CVE trong base image và dependencies trước khi ứng dụng lên production.

Một container – một tiến trình

Thiết kế mỗi container để chạy một tiến trình chính – đây là nguyên tắc cốt lõi của container và microservices. Điều này giúp scaling, monitoring và debugging trở nên đơn giản và độc lập hơn nhiều.

Cần nắm rõ các nguyên tắc quan trọng để container hóa ứng dụng trên AWS thành công

Fargate hay EC2 Launch Type? Cách chọn đúng cho dự án của bạn

Câu hỏi thường gặp nhất: Nên dùng Fargate hay tự quản lý EC2?

  • Chọn Fargate khi: workload có tải biến động hoặc không dự đoán được, team không có dedicated platform engineer, bạn muốn tập trung vào phát triển ứng dụng thay vì vận hành hạ tầng, hoặc workload ngắn hạn như batch jobs và CI/CD pipelines.
  • Chọn EC2 launch type khi: bạn cần GPU instances cho AI/ML workloads, cần instance types đặc thù (compute-optimized, memory-optimized), có khối lượng container ổn định và đủ lớn để amortize chi phí EC2, hoặc cần privileged containers.
  • Chọn ECS Managed Instances (2025+) khi: bạn muốn EC2 flexibility nhưng không muốn tự quản lý fleet. Đặc biệt phù hợp với GPU workloads hay khi cần instance types cụ thể mà không muốn overhead vận hành.

Lưu ý quan trọng: Fargate đắt hơn EC2 khoảng 20-30% về raw compute cost, nhưng chi phí vận hành (engineering time quản lý EC2 fleet, patching, scaling) thường cao hơn mức chênh lệch đó đối với hầu hết các team.

Bắt đầu hành trình container hóa cùng Renova Cloud

Renova Cloud là AWS Premier Tier Partner, AWS Partner of the Year for Vietnam năm 2023, 2024 và 2026 – đối tác được AWS công nhận với đầy đủ chứng chỉ về AWS DevOps Competency, AI Services Competency, AWS Well-Architected Partner…. Đội ngũ kỹ thuật của Renova Cloud có kinh nghiệm thực chiến trong việc container hóa ứng dụng doanh nghiệp trên AWS – từ kiến trúc ECS/Fargate cho đến EKS ở quy mô lớn.

Nếu bạn đang cân nhắc containerize ứng dụng hoặc muốn tối ưu hóa chi phí container workloads hiện có – Renova Cloud cung cấp dịch vụ tư vấn kỹ thuật và AWS Well-Architected Review để đánh giá kiến trúc và đề xuất lộ trình phù hợp nhất với nhu cầu doanh nghiệp.

Hãy liên hệ Renova Cloud để được tư vấn chi tiết về dịch vụ và triển khai sớm nhất!

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

Docker có khác Kubernetes không?

Đầu tiên, bạn cần hiểu Docker là gì theo cách đơn giản nhất? 

Docker là công nghệ container hóa – nó tạo và chạy container. Kubernetes (và Amazon EKS) là hệ thống orchestration – nó quản lý nhiều container trên nhiều máy chủ, xử lý scaling, networking và service discovery. Bạn thường dùng Docker để build image, còn Kubernetes hay ECS để orchestrate chúng.

Có cần học Docker trước khi dùng AWS ECS không?

Có. ECS và Fargate vẫn cần bạn viết Dockerfile và build Docker images. Hạ tầng được AWS quản lý, nhưng bạn vẫn cần hiểu cách container hóa ứng dụng đúng cách để tận dụng hết tính năng của platform.

Amazon ECR có phải trả phí không?

Có. ECR tính phí dựa trên dung lượng lưu trữ và số lần pull/push images. Tuy nhiên, sẽ được miễn phí 500MB/tháng trong năm đầu với AWS Free Tier. Chi phí thực tế thường không đáng kể so với compute costs.

Docker Compose có dùng được trên AWS không?

Có. AWS và Docker đã hợp tác để cho phép deploy Docker Compose artifacts trực tiếp lên Amazon ECS và Fargate từ Docker CLI. Điều này giúp bạn dùng cùng workflow local để deploy lên cloud mà không phải viết lại cấu hình.

Fargate Spot có an toàn cho production không?

Điều này sẽ phụ thuộc vào workload. Batch jobs, CI/CD pipelines, và stateless services là lý tưởng cho Fargate Spot.

Production services cần high availability thì nên mix giữa Fargate On-Demand và Spot, với ECS tự động failover sang Availability Zone khác khi Spot bị thu hồi.