✔️ ECR의 Docker 컨테이너를 사용하여 AWS ECS 작업 배포하기
- ECR(Elastic Container Registry) : 안전하고 확장 가능하고 신뢰할 수 있는 AWS 관리형 컨테이너 이미지 레지스트리 서비스
- ECS(Elastic Container Service) : 클러스터에서 컨테이너를 쉽게 실행, 중지 및 관리할 수 있게 해주는 컨테이너 관리 서비스
✔️ 필요 작업
- IAM 계정 생성(프로그래밍 방식으로 인증 가능해야 한다.)
- docker VM에 aws 명령설치
- AWS 명령 인증 구성
해당 작업을 완료했으면 리포지토리 생성 버튼을 클릭한다.
리포지토리 이름을 생성해 실제 접속할 주소를 지정한다.
생성할 리포지토리명.AWS 계정 ID.dkr.ecr.현재 사용 중인 리전.amazons.com/ 와 같이 구성된다.
태그 변경 불가능을 활성화하면 덮어써지지 않으며 이미지 스캔 활성화는 별도 비용이 청구된다.
모두 지정했으면 레포지토리를 생성하자
이제 레포지토리에 푸시하기 위한 명령을 살펴보자
첫번째로 인증을 해야한다.
AWS CLI 사용:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 471702632719.dkr.ecr.us-east-1.amazonaws.com
레지스트리에 로그인하는 것은 docker login이다. 이것은 다른 밴더도 똑같다.
AWS의 레지스트리 계정은 무조건 AWS이다.
그리고 패스워드는 도커 명령어의 옵션 중에 --password-stdin 옵션이 있다.
표준 입력으로부터 패스워드를 가져오는 옵션이다.
pipe(|)가 걸려있기 때문에 앞의 output이 뒤의 input이 된다.
vagrant@docker ~ docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
docker login [OPTIONS] [SEVVER] 에서 별도의 서버를 지정하지 않으면 default는 Docker.io(Docker Hub)가 된다.
하지만 우리는 다른 레지스트리 서버를 사용할 것이기 때문에 서버를 지정해줘야 한다.
참고: AWS CLI을(를) 사용하는 중 오류가 발생하면 최신 버전의 AWS CLI 및 Docker가 설치되어 있는지 확인하세요.
다음 명령을 사용하여 도커 이미지를 빌드합니다. 도커 파일을 처음부터 새로 빌드하는 방법에 대한 자세한 내용은 여기 지침을 참조하십시오. 이미지를 이미 빌드한 경우에는 이 단계를 건너뛸 수 있습니다.
docker build -t ssh2022 .
빌드가 완료되면 이미지에 태그를 지정하여 이 리포지토리에 푸시할 수 있습니다.
docker tag ssh2022:latest 471702632719.dkr.ecr.us-east-1.amazonaws.com/ssh2022:latest
471702632719.dkr.ecr.us-east-1.amazonaws.com/ 는 고정 레지스트리가 되며, ssh2022는 방금 생성한 레포지토리이다.
다음 명령을 실행하여 이 이미지를 새로 생성한 AWS 리포지토리로 푸시합니다.
docker push 471702632719.dkr.ecr.us-east-1.amazonaws.com/ssh2022:latest
✔️ ECR에 이미지 푸시하기
이제 커스텀 이미지를 ECR에 푸시 해보자
vagrant@docker ~ docker tag mydjango:alpine 471702632719.dkr.ecr.ap-northeast-2.amazonaws.com/ssh2022:alpine
vagrant@docker ~ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 471702632719.dkr.ecr.ap-northeast-2.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/vagrant/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
vagrant@docker ~ docker push 471702632719.dkr.ecr.ap-northeast-2.amazonaws.com/ssh2022:alpine
The push refers to repository \[471702632719.dkr.ecr.ap-northeast-2.amazonaws.com/ssh2022\]
4437db85c7db: Pushed
98d14a14ba93: Pushed
7a5ba6a45b7b: Pushed
dc3609876b29: Pushed
ba16fc83b6cc: Pushed
215b1890d725: Pushed
d37d0e55fe5d: Pushed
fbd7d5451c69: Pushed
4fc242d58285: Pushed
alpine: digest: sha256:1cdb48a54987ddee17aed0f9a1576406a5ab4e0e40961ce669aed43819cf5da5 size: 2215
앞서 본 푸시 명령 순서대로 우선 이미지에 tag를 붙인다.
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 471702632719.dkr.ecr.us-east-1.amazonaws.com 해당 명령을 그대로 복사 붙여 넣기하여 인증을 받는다.
Login Succeeded가 뜨면 인증에 성공한 것이다.
그리고 docker push 명령을 이용해 이미지를 푸시한다.
alpine이라는 태그가 붙은 이미지가 저장된 것을 확인할 수 있다.
취약점 탭을 클릭하면 발견된 취약점이 무엇인지 자세히 확인할 수 있다.
✔️ Elastic Container Service (ECS)
ECS는 기본적으로 3가지 형태의 서비스가 있다.
첫번째로, ECS의 기본은 EC2 + 도커 컨테이너를 실행할 수 있는 컨테이너 런타임 이미지를 띄운다.
비용은 EC2 인스턴스와 동일하다.
EC2 인스턴스를 사용하면 여러대의 EC2 인스턴스를 클러스터링 할 수 있다.
하나의 시스템처럼 묶을 수 있다는 의미이다.
도커 스웜, k8s, Apache Mesos의 목적은 여러대의 시스템을 묶어서 하나의 시스템처럼 사용하는 클러스터링이 목적이다.
ECS라고 하는 서비스는 Clustering 기능을 AWS가 자체적으로 만든 것이다. (완전한 컨테이너 표준이 아니다.)
두번째로, Fargate는 EC2 인스턴스 없이는 작동할 수 없다.
Fargate는 VM 조차도 관리형으로 제공하겠다는 의미이다. 사용자는 바로 컨테이너를 직접 관리하는 형태이다.
EC2 인스턴스의 운영체제는 사용자가 관리해야 하지만 Fargate는 EC2 인스턴스도 AWS가 완전 관리해주는 형태이다.
마지막으로 가장 최근에 나온 서비스인 Anyware는 회사의 물리 서버를 ECS가 관리하도록 구성하고 관리 비용을 받는다.
회사에 AWS와 네트워크로 연결되어 있는 서버가 있어야 하며 이것을 ECS에 사용한다.
하지만, k8s 만큼의 기능을 제공하지는 않는다.
✔️ 클러스터 생성
우선 클러스터를 먼저 생성한다.
기본 인프라는 Fargate이며 필요에 따라 EC2 인스턴스와 ECS Anyware를 추가해서 사용할 수 있다.
컨테이너에 대한 모니터링을 Cloud Watch 기능과 같은 Container Insight 기능을 통해 추가할 수 있다.
이를 활성화하면 Cloud Watch에서 컨테이너 로그 등을 확인할 수 있다.
클러스터를 생성한다.
컨테이너를 실행할 런타임을 준비한다.
- 서비스 - 각 이미지를 서비스라는 개념으로 사용한다.
- 태스크 - 서비스에서 실제 컨테이너가 생성되면 그 컨테이너를 태스크라고 한다.
- 인프라 - Fargate만 지정해놨기 때문에 Fargate만으로 구성되어 있고 EC2 인스턴스나 Anyware를 추가할 경우 인스턴스의 목록이 뜬다.
- 지표 - 모니터링에 사용한다.
✔️ 태스크 정의 생성
태스크를 미리 정의해놔야 서비스에서 어떤 태스크로 구성할 것인지 결정할 수 있다.
어떤 이미지로 어떻게 실행할지 미리 세팅해놓는 것이다.
태스크 정의 패밀리명을 지정한다.
실제로 실행할 컨테이너를 정의한다.
이미지(URI) 지정시 이미지명만 입력하면 Docker Hub에서 가져오게 된다.
앞서 ECR에 푸시한 이미지 URI을 입력한뒤 관리 목적 상의 이름을 지정한다(ex. pyweb)
환경 변수를 세팅할 수 있으며 컨테이너 이미지를 추가할 수 있다.
하나의 태스크에 여러개의 이미지가 있을 수 있다.
앱을 실행할 환경을 선택하고 이미지의 운영체제/아키텍처를 선택한다.
CPU, 메모리를 지정할 수 있다. 비용과 연결된다.
역할 부여는 이미지의 컨테이너가 다른 AWS의 리소스에 접근할 필요가 있을 때 지정한다.
스토리지를 지정할 수 있다. 최소 20GB 부터 지정할 수 있다.
모니터링 기능 활성화 여부를 지정한다.
검토 후 생성한다.
생성된 태스크를 확인한다.
✔️ 배포하기
우선 HTTP 접근을 위한 보안 그룹을 지정한다.
클러스터에서 새 서비스를 만든다.
서비스는 detach 모드로 실행하는 것을 말하고 태스크는 배치 작업 모드로 실행하는 것을 말한다.
서비스의 이름을 지정한다.
실행할 태스크의 개수를 지정한다.
서비스를 위해 로드 밸런서를 연결할 수 있다.
보안 그룹에 앞서 생성한 HTTP 접근용 보안 그룹을 지정한다.
서비스와 태스크가 정상적으로 실행 중인 것을 확인할 수 있다.
태스크의 세부 사항을 확인할 수 있다.
태스크의 퍼블릭 IP로 접속하면 배포한 컨테이너를 확인할 수 있다.
✔️ CloudWatch 로그 삭제
태스크 정의 생성시 모니터링 기능을 활성화 했다면 CloudWatch에 로그가 쌓인다.
CloudWatch에서 수동으로 삭제하지 않으면 계속해서 로그가 쌓인다.
CloudWatch 또한 스토리지 비용이 들기 때문에 필요없는 경우는 삭제 해줘야 한다.
'DevOps > Docker' 카테고리의 다른 글
자주 사용하는 도커 명령어 (0) | 2023.02.14 |
---|---|
[Docker] Docker Compose를 이용해 Wordpress 배포하기 (0) | 2022.05.15 |
[Docker] Docker를 이용하여 wordpress 배포하기 (0) | 2022.05.15 |
[Docker] Docker Compose 사용법 (0) | 2022.05.13 |
[Docker] Docker Hub 사용법 (0) | 2022.05.12 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!