[AWS 자격증] AWS Containers (Docker, ECS, ECR, EKS) 정리
AWSDockerECSECREKSFargate자격증
작성자 : 오예환 | 작성일 : 2026-01-11 | 수정일 : 2026-01-11
1. Docker 개요
Docker란?
- 앱 배포를 위한 소프트웨어 개발 플랫폼
- 앱을 컨테이너에 패키징하여 어떤 OS에서든 실행 가능
Docker의 장점
| 장점 | 설명 |
|---|
| 이식성 | 어떤 머신에서든 동일하게 실행 |
| 호환성 | 호환성 문제 없음 |
| 예측 가능 | 동작 예측 가능 |
| 효율성 | 유지보수/배포 용이 |
| 범용성 | 모든 언어, OS, 기술 지원 |
사용 사례
- 마이크로서비스 아키텍처
- On-premises → AWS 클라우드 마이그레이션 (Lift-and-shift)
2. Docker vs Virtual Machines
비교
┌─────────── VM ───────────┐ ┌─────────── Docker ──────────┐
│ │ │ │
│ ┌─────┐ ┌─────┐ ┌─────┐│ │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │ App │ │ App │ │ App ││ │ │App│ │App│ │App│ │App│ │
│ ├─────┤ ├─────┤ ├─────┤│ │ └───┘ └───┘ └───┘ └───┘ │
│ │Guest│ │Guest│ │Guest││ │ ┌──────────────────────┐ │
│ │ OS │ │ OS │ │ OS ││ │ │ Docker Daemon │ │
│ └─────┘ └─────┘ └─────┘│ │ └──────────────────────┘ │
│ ┌──────────────────────┐│ │ ┌──────────────────────┐ │
│ │ Hypervisor ││ │ │ Host OS (EC2) │ │
│ └──────────────────────┘│ │ └──────────────────────┘ │
│ ┌──────────────────────┐│ │ ┌──────────────────────┐ │
│ │ Host OS ││ │ │ Infrastructure │ │
│ └──────────────────────┘│ │ └──────────────────────┘ │
│ ┌──────────────────────┐│ │ │
│ │ Infrastructure ││ │ │
│ └──────────────────────┘│ │ │
└──────────────────────────┘ └──────────────────────────────┘
| 구분 | VM | Docker |
|---|
| 리소스 | Guest OS마다 별도 | Host와 리소스 공유 |
| 오버헤드 | 높음 | 낮음 |
| 밀도 | 낮음 | 높음 (하나의 서버에 많은 컨테이너) |
3. Docker 이미지 저장소
Docker Repository 종류
| 저장소 | 유형 | 설명 |
|---|
| Docker Hub | Public | 기본 이미지 (Ubuntu, MySQL 등) |
| Amazon ECR | Private/Public | AWS 관리형 컨테이너 레지스트리 |
Docker 워크플로우
Dockerfile → Build → Image → Push → Docker Repository (ECR)
↓
Pull
↓
Run → Container
4. AWS 컨테이너 서비스 개요
| 서비스 | 설명 |
|---|
| Amazon ECS | AWS 자체 컨테이너 플랫폼 |
| Amazon EKS | AWS 관리형 Kubernetes |
| AWS Fargate | 서버리스 컨테이너 플랫폼 (ECS/EKS와 함께 사용) |
| Amazon ECR | 컨테이너 이미지 저장소 |
5. Amazon ECS (Elastic Container Service)
Launch Type 비교
| 구분 | EC2 Launch Type | Fargate Launch Type |
|---|
| 인프라 관리 | 직접 관리 (EC2 프로비저닝) | 서버리스 (관리 불필요) |
| ECS Agent | EC2에 설치 필요 | 불필요 |
| 스케일링 | EC2 + Task 모두 관리 | Task만 증가 |
| 복잡도 | 높음 | 낮음 |
EC2 Launch Type
┌─────────────── ECS Cluster ───────────────┐
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ EC2 │ │ EC2 │ │ EC2 │ │
│ │ Instance │ │ Instance │ │ Instance │ │
│ │ │ │ │ │ │ │
│ │┌────────┐│ │┌────────┐│ │┌────────┐│ │
│ ││ECS Agent│ ││ECS Agent│ ││ECS Agent│ │
│ │└────────┘│ │└────────┘│ │└────────┘│ │
│ │┌────────┐│ │┌────────┐│ │┌────────┐│ │
│ ││ Task ││ ││ Task ││ ││ Task ││ │
│ │└────────┘│ │└────────┘│ │└────────┘│ │
│ └──────────┘ └──────────┘ └──────────┘ │
└────────────────────────────────────────────┘
Fargate Launch Type
┌─────────────── ECS Cluster (Fargate) ───────────────┐
│ │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ Task │ │ Task │ │ Task │ │ Task │ │ Task │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │
│ 서버리스! EC2 인스턴스 관리 불필요 │
└──────────────────────────────────────────────────────┘
6. ECS IAM Roles
Role 유형
| Role | 적용 대상 | 용도 |
|---|
| EC2 Instance Profile | EC2 Launch Type만 | ECS Agent 사용 |
| ECS Task Role | 각 Task | Task별 AWS 서비스 접근 |
EC2 Instance Profile 용도
- ECS 서비스에 API 호출
- CloudWatch Logs에 로그 전송
- ECR에서 Docker 이미지 Pull
- Secrets Manager / SSM Parameter Store 접근
ECS Task Role
- Task Definition에 정의
- 각 서비스별 다른 Role 부여 가능
- 예: Task A → S3 접근, Task B → DynamoDB 접근
┌─────────────────────────────────────────────┐
│ EC2 Instance │
│ ┌─────────────────────────────────────────┐│
│ │ EC2 Instance Profile ││
│ │ (ECS Agent용: ECR Pull, CloudWatch) ││
│ └─────────────────────────────────────────┘│
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Task A │ │ Task B │ │
│ │ │ │ │ │
│ │ Task Role A │ │ Task Role B │ │
│ │ (S3 접근) │ │ (DynamoDB) │ │
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────┘
7. ECS Load Balancer 연동
지원 Load Balancer
| Load Balancer | 권장 | 비고 |
|---|
| ALB | ✅ 권장 | 대부분의 사용 사례 |
| NLB | 특수 목적 | 고성능, AWS PrivateLink 연동 |
| CLB | ❌ 비권장 | 고급 기능 없음, Fargate 미지원 |
EC2 Launch Type - Dynamic Host Port Mapping
┌─────────────────────────────────────────────┐
│ ALB │
│ 80/443 │
└─────────────────────────────────────────────┘
│
┌────────────┼────────────┐
↓ ↓ ↓
┌───────┐ ┌───────┐ ┌───────┐
│ 36789 │ │ 39586 │ │ 39748 │ ← Dynamic Host Port
│ Task │ │ Task │ │ Task │
│ (80) │ │ (80) │ │ (80) │ ← Container Port
└───────┘ └───────┘ └───────┘
- Container Port만 정의하면 Host Port 자동 할당
- EC2 Security Group: ALB Security Group의 모든 포트 허용 필요
Fargate - 고유 Private IP
┌─────────────────────────────────────────────┐
│ ALB │
│ 80/443 │
└─────────────────────────────────────────────┘
│
┌────────────┼────────────┐
↓ ↓ ↓
┌───────┐ ┌───────┐ ┌───────┐
│ 80 │ │ 80 │ │ 80 │
│ Task │ │ Task │ │ Task │
│172.16.│ │172.17.│ │172.18.│ ← 고유 Private IP
└───────┘ └───────┘ └───────┘
- 각 Task에 고유 Private IP 할당
- Host Port 개념 없음 (Container Port만 사용)
8. ECS Data Volumes
EFS (Elastic File System)
| 항목 | 설명 |
|---|
| 지원 | EC2 + Fargate 모두 |
| 특징 | 여러 AZ의 Task가 동일 데이터 공유 |
| 조합 | Fargate + EFS = 완전 서버리스 |
⚠️ S3는 파일 시스템으로 마운트 불가
Bind Mounts (임시 스토리지)
- 같은 Task Definition 내 여러 컨테이너 간 데이터 공유
- EC2 Tasks: EC2 인스턴스 스토리지 사용
- Fargate Tasks: Ephemeral 스토리지 (20~200GiB, 기본 20GiB)
Sidecar 패턴 예시:
┌─────────────── ECS Task ───────────────┐
│ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ Application │ │ Sidecar │ │
│ │ Container │ │ (Logs/Metrics)│ │
│ │ │ │ │ │
│ │ write ─────┼──┼──→ read │ │
│ └───────────────┘ └───────────────┘ │
│ │ │ │
│ └───────┬───────────┘ │
│ │ │
│ ┌───────▼───────┐ │
│ │ Bind Mount │ │
│ │ (/var/logs/) │ │
│ └───────────────┘ │
└─────────────────────────────────────────┘
9. ECS Auto Scaling
ECS Service Auto Scaling (Task 레벨)
| 메트릭 | 설명 |
|---|
| CPU Utilization | 평균 CPU 사용률 |
| Memory Utilization | 평균 메모리 사용률 |
| ALB Request Count Per Target | ALB 요청 수 |
스케일링 유형
| 유형 | 설명 |
|---|
| Target Tracking | 특정 CloudWatch 메트릭 목표값 기준 |
| Step Scaling | CloudWatch Alarm 기준 |
| Scheduled Scaling | 예약 시간 기준 |
EC2 Launch Type - 인스턴스 스케일링
| 방법 | 설명 |
|---|
| Auto Scaling Group | CPU 사용률 기반 EC2 추가 |
| ECS Cluster Capacity Provider | Task 용량 부족 시 자동으로 EC2 추가 (권장) |
💡 ECS Service Auto Scaling (Task) ≠ EC2 Auto Scaling (Instance)
💡 Fargate Auto Scaling이 훨씬 간단! (서버리스라 인스턴스 관리 불필요)
10. ECS Rolling Updates
설정 파라미터
| 파라미터 | 설명 | 범위 |
|---|
| Minimum Healthy Percent | 유지해야 할 최소 Task 비율 | 0~100% |
| Maximum Percent | 허용할 최대 Task 비율 | 100~200% |
예시 1: Min 50%, Max 100%
시작: [v1] [v1] [v1] [v1] (4개)
↓ 2개 종료 (50% 유지)
단계1: [v1] [v1]
↓ 2개 v2 생성
단계2: [v1] [v1] [v2] [v2]
↓ v1 2개 종료
단계3: [v2] [v2]
↓ 2개 v2 생성
완료: [v2] [v2] [v2] [v2]
예시 2: Min 100%, Max 150%
시작: [v1] [v1] [v1] [v1] (4개)
↓ 2개 v2 추가 생성 (150%)
단계1: [v1] [v1] [v1] [v1] [v2] [v2]
↓ v1 2개 종료
단계2: [v1] [v1] [v2] [v2]
↓ 2개 v2 추가 생성
단계3: [v1] [v1] [v2] [v2] [v2] [v2]
↓ v1 2개 종료
완료: [v2] [v2] [v2] [v2]
11. ECS Task 트리거 패턴
EventBridge로 Task 호출
이벤트 기반 (S3 업로드 시):
S3 Upload → EventBridge → ECS Task (Fargate)
│
├─→ S3에서 객체 가져오기
└─→ DynamoDB에 결과 저장
스케줄 기반 (배치 처리):
EventBridge (매 1시간) → ECS Task → S3 배치 처리
SQS Queue 패턴
SQS Queue ←─── Messages
│
└─→ ECS Service (Auto Scaling)
│
├─→ Task 1 (Poll)
├─→ Task 2 (Poll)
└─→ Task 3 (Poll)
EventBridge로 Task 종료 감지
ECS Task 종료 → EventBridge → SNS → 관리자 이메일 알림
12. ECS Task Definition
Task Definition이란?
- ECS에게 Docker 컨테이너 실행 방법을 알려주는 JSON 메타데이터
포함 정보
| 항목 | 설명 |
|---|
| Image Name | Docker 이미지 |
| Port Binding | Container/Host 포트 매핑 |
| Memory/CPU | 리소스 요구량 |
| Environment Variables | 환경 변수 |
| Networking | 네트워크 설정 |
| IAM Role | Task Role |
| Logging | CloudWatch 등 로깅 설정 |
💡 하나의 Task Definition에 최대 10개 컨테이너 정의 가능
13. ECS 환경 변수
환경 변수 소스
| 소스 | 용도 | 예시 |
|---|
| Hardcoded | 고정 값 | URL |
| SSM Parameter Store | 민감한 변수 | API 키, 공유 설정 |
| Secrets Manager | 민감한 변수 | DB 비밀번호 |
| S3 (Environment Files) | 대량 환경 변수 | .env 파일 |
┌───────────────────┐
│ Task Definition │
│ │
│ ┌─→ SSM Parameter Store (fetch values)
│ │
│ ├─→ Secrets Manager (fetch values)
│ │
│ └─→ S3 Bucket (fetch files)
└───────────────────┘
14. ECS Task Placement (EC2 Launch Type만)
Task Placement 프로세스
1. CPU, Memory, Port 요구사항 만족하는 인스턴스 식별
↓
2. Task Placement Constraints 만족하는 인스턴스 식별
↓
3. Task Placement Strategies 적용
↓
4. 인스턴스 선택
Task Placement Strategies
| 전략 | 설명 | 장점 |
|---|
| Binpack | CPU/Memory 가장 적게 남은 인스턴스에 배치 | 비용 절감 (EC2 수 최소화) |
| Random | 무작위 배치 | 단순함 |
| Spread | 지정 값 기준으로 균등 분산 | 고가용성 (AZ 분산) |
Spread 예시 (AZ 기준):
us-east-1a us-east-1b us-east-1c
┌──────────┐ ┌──────────┐ ┌──────────┐
│ EC2 │ │ EC2 │ │ EC2 │
│ [Task] │ │ [Task] │ │ [Task] │
└──────────┘ └──────────┘ └──────────┘
Task Placement Constraints
| 제약 | 설명 |
|---|
| distinctInstance | 각 Task를 다른 EC2에 배치 |
| memberOf | 특정 조건 만족하는 EC2에만 배치 (Cluster Query Language) |
💡 Strategies 조합 가능: 예) Spread(AZ) + Binpack(Memory)
15. Amazon ECR (Elastic Container Registry)
ECR이란?
- AWS 관리형 Docker 이미지 저장소
- Private + Public 레지스트리 지원
- ECS와 완전 통합, S3 백엔드
기능
| 기능 | 설명 |
|---|
| 이미지 취약점 스캔 | 보안 취약점 탐지 |
| 버전 관리 | 이미지 버전 관리 |
| 이미지 태그 | 태그로 이미지 구분 |
| Lifecycle 정책 | 오래된 이미지 자동 삭제 |
ECR 사용 (AWS CLI)
# 1. ECR 로그인
aws ecr get-login-password --region region | \
docker login --username AWS \
--password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
# 2. 이미지 Push
docker push aws_account_id.dkr.ecr.region.amazonaws.com/demo:latest
# 3. 이미지 Pull
docker pull aws_account_id.dkr.ecr.region.amazonaws.com/demo:latest
⚠️ 이미지 Pull 실패 시 IAM 권한 확인!
16. AWS Copilot
Copilot이란?
- 컨테이너 앱의 빌드, 릴리스, 운영을 위한 CLI 도구
- 인프라 설정 대신 앱 개발에 집중
지원 서비스
- Amazon ECS
- AWS Fargate
- AWS App Runner
기능
| 기능 | 설명 |
|---|
| 인프라 자동 프로비저닝 | ECS, VPC, ELB, ECR 자동 설정 |
| 자동 배포 | CodePipeline 연동 |
| 다중 환경 | dev, staging, prod 등 |
| 운영 지원 | 로그, 헬스 체크, 트러블슈팅 |
17. Amazon EKS (Elastic Kubernetes Service)
EKS란?
- AWS 관리형 Kubernetes 클러스터
- ECS의 대안 (같은 목표, 다른 API)
특징
| 항목 | 설명 |
|---|
| 오픈소스 | Kubernetes는 오픈소스 |
| 클라우드 무관 | Azure, GCP에서도 사용 가능 |
| 마이그레이션 | 기존 K8s 환경에서 AWS로 이전 시 유리 |
| 리전당 클러스터 | 멀티 리전 = 리전별 EKS 클러스터 |
| 모니터링 | CloudWatch Container Insights |
ECS vs EKS
| 구분 | ECS | EKS |
|---|
| 기술 | AWS 자체 | Kubernetes (오픈소스) |
| 이식성 | AWS 종속 | 클라우드 무관 |
| 학습 곡선 | 낮음 | 높음 |
| 사용 시점 | AWS 전용 | K8s 경험 있거나 멀티클라우드 |
EKS Node Types
| 유형 | 설명 | 관리 |
|---|
| Managed Node Groups | EKS가 EC2 생성/관리 | AWS 관리 |
| Self-Managed Nodes | 직접 EC2 생성/등록 | 직접 관리 |
| AWS Fargate | 서버리스 | 노드 관리 불필요 |
EKS Data Volumes (CSI 드라이버)
| 스토리지 | Fargate 지원 |
|---|
| Amazon EBS | ❌ |
| Amazon EFS | ✅ |
| Amazon FSx for Lustre | ❌ |
| Amazon FSx for NetApp ONTAP | ❌ |
핵심 비교 요약
ECS vs EKS vs Fargate
| 구분 | ECS | EKS | Fargate |
|---|
| 유형 | 컨테이너 오케스트레이션 | K8s 오케스트레이션 | 서버리스 컴퓨팅 |
| 인프라 관리 | EC2 관리 필요 | Node 관리 필요 | 불필요 |
| 호환성 | AWS 전용 | K8s 호환 | ECS/EKS와 함께 사용 |
| 복잡도 | 낮음 | 높음 | 가장 낮음 |
IAM Role 요약 (ECS)
| Role | 대상 | 용도 |
|---|
| EC2 Instance Profile | EC2 | ECS Agent (ECR Pull, CloudWatch) |
| ECS Task Role | 각 Task | AWS 서비스 접근 (S3, DynamoDB 등) |