Docker
- 애플리케이션을 컨테이너라는 표준화된 단위로 패키징하는 기술
- 앱은 컨테이너에 패키지화되어 어떤 OS에서든 실행할 수 있게 됨
도커 이미지가 저장되는 곳?
- 도커에서 이미지는 애플리케이션과 실행 환경을 포함하는 패키지
- 이미지는 컨테이너화된 애플리케이션을 구축하고 배포하기 위한 모든 파일, 라이브러리, 종속성 및 설정을 포함
- 도커 이미지는 도커 리포지토리에 저장됨
Docker vs Virtual Machines
도커는 어떤 의미로는 가상화 기술이지만, 정확히는 아님!
리소스는 호스트와 공유됨 -> 한 서버에서 다수의 컨테이너를 공유할 수 있음

가상 머신 아키텍처
- 인프라, 운영체제, 하이퍼바이저, 앱, 게스트 운영체제가 있음
- EC2의 원리라고 생각하면 됨 = EC2 머신은 하이퍼바이저에 실행되는 가상 머신과 같음
- 따라서 Amazon이 EC2 인스턴스를 다양한 소비자에게 제공할 수 있으며 각 EC2는 분리되어 있음
- 즉, 리소스를 공유하지 않음!
- ex) 각 집(VM)이 독립적인 구조로 완전히 분리된 아파트 단지
도커 컨테이너
- 인프라, EC2 인스턴스 같은 호스트 OS, 도커 데몬 위에 많은 컨테이너가 있음
- 도커 데몬에서 가볍게 실행되는 컨테이너라 공존할 수 있음
- 네트워킹이나 데이터 등 공유 가능
- 가상 머신보다 덜 안전하지만 하나의 서버에 많은 컨테이너를 실행할 수 있기에 많이 사용함
- ex) 주방과 거실만을 공유하고 각자 방이 있는 쉐어하우스
Amazon ECS
ECS = Elastic Container Service
AWS에서 도커 컨테이너를 실행하고 관리하는 완전 관리형 오케스트레이션 서비스
구성 요소
1. 컨테이너
- 실제 실행되는 도커 컨테이너
- 컨테이너는 ECR이나 Docker Hub에서 가져온 이미지로 실행됨
2. Task Definition
- 컨테이너를 어떻게 실행할지 정의한 설계도
- JSON 형식
- 버전 관리 가능
- 여러 컨테이너를 하나의 Task Definition에 정의 가능
3. Task
- Task Definition을 기반으로 실제 실행되는 인스턴스
- Task는 독립적으로 실행될 수 있음
- 하나의 Task = 1개 이상의 컨테이너 묶음
- Task는 Fargate 또는 EC2 인스턴스에서 실행됨
- 각 Task는 고유한 ENI(네트워크 인터페이스)를 가질 수 있음
4. Service
- 원하는 수의 Task를 지속적으로 유지하고 관리하는 관리자
5. 클러스터
- Task들을 실행할 인프라 관리
- EC2 인스턴스 또는 Fargate 리소스 풀
- 하나의 클러스터에 여러 Service 실행 가능
- Cluster는 리전별 생성
ECS Launch Type
Task를 어디서 실행할지 결정하는 것
1. EC2 Launch Type

- EC2 인스턴스를 직접 관리해야 함 -> AMI 선택, 인스턴스 타입 등
- EC2 인스턴스에 ECS Agent 설치 필요
- (+) EC2 인스턴스에 SSH 접속 가능
- (+) Reserved Instance, Saving Plans 사용 -> 비용 절감
- (-) 서버 관리 부담
- (-) 설정 복잡
- 장기 실행 워크로드(비용 최적화), 특별한 HW 요구사항, 기존 EC2 인프라 활용 시 선택
2. Fargate Launch Type

- AWS의 서버리스 컴퓨팅 엔진인 Fargate 사용
- 서버 관리가 완전히 사라짐
- Task Definition만 정의하면 AWS가 알아서 실행
- 사용한 만큼 과금
- (+) 관리 부담 제로
- (+) 빠른 배포
- (+) 자동 스케일링
- (+) 보안 격리
- (-) EC2보다 비쌈
- (-) 일부 고급 기능 제한
- 관리 부담을 최소화하고 싶을 때, 빠른 배포가 중요할 때, 마이크로서비스 아키텍처 시 선택
ECS Data Volumes
컨테이너는 기본적으로 휘발성! -> 데이터를 유지하려면 볼륨 필요
EFS 권장
- 여러 Task가 동시에 마운트 가능
- Multi AZ
- 완전 관리형, 자동 확장
IAM Role
1. Task Execution Role
- ECS가 Task를 시작하는 권한
- ECR pull, 로그 전송 등
2. Task Role
- 컨테이너 앱이 AWS 리소스 접근
- S3 업로드, DynamoDB 읽기 등
ECR
ECR = Elastic Container Registry
- AWS에 도커 이미지를 저장하고 관리하는데 사용
- 즉, 도커 허브의 AWS 버전
- 개발자가 도커 이미지 생성 -> ECR에 push -> ECS or EKS or Fargate가 ECR에서 이미지 pull -> 컨테이너에서 실행
- 기본적으로는 모든 이미지가 프라이빗
- 이미지 스캔 기능 : 이미지의 보안 취약점 자동 검사
- Amazon ECS와 완전 통합되어 있고 이미지는 백그라운드에서 Amazon S3에 저장됨
- Lifecycle Policy로 비용 절감 가능
EKS
EKS = Elastic Kubernetes Service
AWS가 쿠버네티스를 관리해주는 서비스
- EKS에는 두 가지 실행 모드가 있음 -> EC2(워커 노드 배포) & Fargate(서버리스 컨테이너 배포)
- 컨테이너를 실행한다는 목적은 ECS와 비슷하지만 사용하는 API가 다름
- 회사가 이미 온프레미스나 다른 클라우드에서 Kubernetes를 사용하고 있는 경우
- 스토리지로는 CSI(Container Storage Interface) Driver 사용
EKS - Node Types
관리형 노드 그룹
- 노드(EC2 인스턴스)를 생성하고 관리
- 노드는 EKS에서 관리하는 ASG(Auto Scaling Group)의 일부
- 온디맨드 또는 스팟 인스턴스 지원
자체 관리형 노드
- 사용자가 생성하고 EKS 클러스터에 등록한 노드로 ASG에 의해 관리
- 온디맨드 또는 스팟 인스턴스 지원
AWS Fargate
- 유지 관리가 필요하지 않으며 노드 관리가 없음