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 DockerGCP 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

  1. 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
  2. Tạo ECS Cluster:

    • Dùng AWS CLI:
      aws ecs create-cluster --cluster-name my-cluster
  3. Đị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
  4. 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.
  5. Test:

    • Lấy public IP từ ECS console, truy cập <ip>:5000.

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

  1. 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
  2. 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).
  3. Test:

    • Lấy URL từ output (VD: https://myapp-abc-uc.a.run.app), truy cập.

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 DockerGCP 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.

Điều hướng chuỗi bài viết<< Bài 12. Docker Registry: Tự Host và Quản Lý Image Hiệu Quả
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận