Danh sách bài viết trong series Sử dụng Docker từ cơ bản đến nâng cao
- Bài 1. Cơ Bản Docker: Hiểu Container và Vai Trò trong DevOps
- Bài 2. Docker Image: cách xây Dựng và tối Ưu
- Bài 3. Docker Networking: Kết Nối Container Hiệu Quả
- Bài 4. Docker Volume: Quản Lý Dữ Liệu Hiệu Quả cho Container
- Bài 5. Docker Compose: Điều Phối Multi-Container Hiệu Quả
- Bài 6. Docker Swarm: Orchestration Cơ Bản để Scale Container
- Bài 7. Docker Security: Bảo Mật Container Hiệu Quả
- Bài 8. Docker CI/CD: Tích Hợp Container vào Pipeline DevOps
- Bài 9. Docker Monitoring: Theo Dõi và Logging Container Hiệu Quả
- Bài 10. Docker resources: Tối Ưu và Debug Container Hiệu Quả
- Bài 11. Docker và Microservices: Thiết Kế Ứng Dụng Phân Tán
- Bài 12. Docker Registry: Tự Host và Quản Lý Image Hiệu Quả
- Bài 13. Docker với Cloud: Tích Hợp Container trên AWS ECS và GCP Cloud Run
Docker đã thay đổi cách chúng ta phát triển ứng dụng local, nhưng khi lên cloud, mọi thứ còn thú vị hơn nữa. Trong DevOps, việc deploy container cloud trên AWS hay GCP là bước tiến để tận dụng sức mạnh hạ tầng đám mây. Trong bài thứ mười ba của series mở rộng, tôi sẽ dẫn bạn qua cách dùng Docker với Cloud trong DevOps, tập trung vào AWS ECS Docker và GCP Cloud Run, cùng thực hành thực tế – dựa trên những lần tôi vật lộn và thành công với cloud, không chỉ là lý thuyết đâu nhé!
Tại Sao Dùng Docker trên Cloud?
Lợi Ích của Cloud trong DevOps
- Scalability: Tự động scale container theo tải.
- Managed Service: Không cần quản lý server thủ công.
- Tích hợp CI/CD: Deploy thẳng từ pipeline.
Ví dụ thực tế: Một team cần chạy 50 container API trong giờ cao điểm. AWS ECS tự scale lên từ 5, tiết kiệm chi phí và thời gian so với on-premise.
AWS ECS vs GCP Cloud Run
- AWS ECS (Elastic Container Service): Dịch vụ orchestration mạnh, tích hợp sâu với AWS (ECR, IAM).
- GCP Cloud Run: Serverless, đơn giản, chạy container HTTP nhanh chóng.
DevOps: ECS phù hợp hệ thống phức tạp, Cloud Run lý tưởng cho ứng dụng nhẹ.
Deploy Docker trên AWS ECS
Tổng Quan AWS ECS
- ECR: Registry lưu image (tương tự bài 12).
- ECS: Quản lý cluster, task, service.
Thực Hành: Deploy Flask trên ECS
-
Push Image lên ECR:
- Tạo repository:
aws ecr create-repository --repository-name myapp
- Build và push:
docker build -t myapp . aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <aws-account-id>.dkr.ecr.us-east-1.amazonaws.com docker tag myapp:latest <aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/myapp:latest docker push <aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/myapp:latest
- Tạo repository:
-
Tạo ECS Cluster:
- Dùng AWS CLI:
aws ecs create-cluster --cluster-name my-cluster
- Dùng AWS CLI:
-
Định nghĩa Task:
task-definition.json
:{ "family": "myapp-task", "containerDefinitions": [ { "name": "myapp", "image": "<aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/myapp:latest", "portMappings": [ { "containerPort": 5000, "hostPort": 5000 } ], "memory": 512, "cpu": 256 } ] }
- Đăng ký:
aws ecs register-task-definition --cli-input-json file://task-definition.json
-
Chạy Service:
aws ecs create-service --cluster my-cluster --service-name myapp-service --task-definition myapp-task --desired-count 1 --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[subnet-123],securityGroups=[sg-123],assignPublicIp=ENABLED}"
- Thay
subnet-123
,sg-123
bằng VPC của bạn.
- Thay
-
Test:
- Lấy public IP từ ECS console, truy cập
<ip>:5000
.
- Lấy public IP từ ECS console, truy cập
Debug tip: Service không chạy? Check log trong CloudWatch (aws logs
).
Deploy Docker trên GCP Cloud Run
Tổng Quan GCP Cloud Run
- Serverless: Chỉ cần image, không quản lý cluster.
- HTTP-based: Phù hợp ứng dụng web/API.
Thực Hành: Deploy Flask trên Cloud Run
-
Push Image lên GCR:
- Build và tag:
docker build -t gcr.io/<project-id>/myapp .
- Push:
gcloud auth configure-docker docker push gcr.io/<project-id>/myapp
- Build và tag:
-
Deploy lên Cloud Run:
gcloud run deploy myapp \ --image gcr.io/<project-id>/myapp \ --platform managed \ --region us-central1 \ --allow-unauthenticated
--allow-unauthenticated
: Public access (test).
-
Test:
- Lấy URL từ output (VD:
https://myapp-abc-uc.a.run.app
), truy cập.
- Lấy URL từ output (VD:
Debug tip: Lỗi 502? Check log trong Cloud Run console, đảm bảo app nghe port 8080 (mặc định Cloud Run).
Ứng Dụng trong DevOps
Pipeline CI/CD với Cloud
-
AWS ECS:
deploy: image: amazon/aws-cli script: - aws ecr get-login-password | docker login --username AWS --password-stdin <aws-account-id>.dkr.ecr.us-east-1.amazonaws.com - docker build -t <aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/myapp:$CI_COMMIT_SHA . - docker push <aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/myapp:$CI_COMMIT_SHA - aws ecs update-service --cluster my-cluster --service myapp-service --force-new-deployment
-
GCP Cloud Run:
deploy: image: google/cloud-sdk script: - gcloud auth configure-docker - docker build -t gcr.io/$PROJECT_ID/myapp:$CI_COMMIT_SHA . - docker push gcr.io/$PROJECT_ID/myapp:$CI_COMMIT_SHA - gcloud run deploy myapp --image gcr.io/$PROJECT_ID/myapp:$CI_COMMIT_SHA --platform managed --region us-central1
Kết quả: Pipeline tự động build, push, deploy lên cloud.
Microservices trên Cloud
- ECS: Chạy API, DB riêng biệt trong task khác nhau.
- Cloud Run: Mỗi service là một Cloud Run instance, gọi qua HTTPS.
Case study: Một team deploy 10 microservices lên ECS, auto-scale từ 2 lên 20 container khi tải tăng, tiết kiệm 25% chi phí so với VM.
Kết Luận
Docker với Cloud trong DevOps mở ra cánh cửa để deploy container cloud trên AWS ECS Docker và GCP Cloud Run. Thực hành với Flask cho thấy bạn có thể tích hợp Docker vào pipeline và tận dụng sức mạnh cloud dễ dàng.