ECR이란?
ECR (Elastic Container Registry) 은 Docker Container의 이미지를 저장하는 Repository 서비스입니다.
주로 사용하는 Docker hub의 기능과 동일하다고 보면되고 Private 하게 이미지를 관리하는데 편리합니다.
Container 이미지를 S3에 저장하기 때문에 고가용성이 유지되고 AWS IAM 인증을 통해 이미지를 push/pull 할 수 있습니다.
리포지토리 생성
ECR Repositories 탭에서 프라이빗 리포지토리를 생성합니다.
AWS CLI
awscli는 IAM Credentials 혹은 IAM 역할을 이용하여 사용 가능합니다.
Amazon Linux 2 OS에는 기본적으로 설치가 되어 있으므로 다른 OS를 사용하실 경우는 아래를 참고하여 설치[1] 하시기 바랍니다.
Jenkins 서버에서 aws configure 커맨드로 IAM access key와 secret key를 설정합니다.
혹은 .aws/credentials 경로에 IAM Credentials를 아래의 형태로 넣어주시면 됩니다.
[default]
aws_access_key_id = [ACCESSKEYID]
aws_secret_access_key = [SECRETACCESSKEY]
주의할 점은 Jenkins계정으로 로그인 하셔야 합니다. Jenkins 홈 디렉토리에 AccessKey를 설정해 AWS 커맨드를 사용할 수 있게합니다.
[1] https://aws.amazon.com/ko/cli/
Docker 설치
Jenkins 서버에 docker 설치를 진행합니다. 이때 jenkins 계정에 docker 권한을 부여해야 하는데요
그 이유는 Jenkins 파이프라인이 돌아갈 때 프로세스가 돌면서 Docker 권한을 사용하기 때문입니다.
$ sudo amazon-linux-extras install -y docker
$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo /usr/sbin/groupadd -f docker
$ sudo /usr/sbin/usermod -aG docker jenkins
$ sudo chown root:docker /var/run/docker.sock
이제 jenkins 계정에 접속해서 docker가 실행되는 지 확인해봅니다.
이전 Jenkins 설치 스크립트의 내용을 보면 Jenkins 패스워드가 포함되어 있습니다. (Jenkins1!) 보안을 위해 수정 해 주세요!
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
레지스트리 인증
Docker CLI는 기본 IAM 인증 방법을 지원하지 않아 ECR이 Docker 푸시 및 풀 요청을 인증하고 승인할 수 있도록 추가 단계를 수행 해야합니다.
아래는 권한 부여 토큰을 이용한 인증 방법인데요. 사용된 토큰은 IAM 기반으로 권한 범위가 일치하고 12시간 동안 ECR 레지스트리에 액세스하는 데 사용됩니다.
명령어는 아래와 같습니다. 계정 ID와 Region을 변경하여 입력하세요.
$ aws ecr get-login-password --region region | docker login --username AWS --password-stdin [계정ID].dkr.ecr.[Region].amazonaws.com
AWS CLI 버전 1.17.10 이전 버전[2]
$ aws ecr get-login --region region --no-include-email
$ docker login -u AWS -p password https://aws_account_id.dkr.ecr.region.amazonaws.com
[2] https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/registry_auth.html
ECR Push 명령어 사용
이제 ECR을 사용에 필요한 모든 준비는 끝이 났습니다.
Jenkins 서버에서 jenkins 계정으로 테스트 하기위한 nginx 이미지를 pull 합니다.
$ docker pull nginx:latest
latest: Pulling from library/nginx
69692152171a: Pull complete
30afc0b18f67: Pull complete
596b1d696923: Pull complete
febe5bd23e98: Pull complete
8283eee92e2f: Pull complete
351ad75a6cfa: Pull complete
Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest d1a364dc548d 3 weeks ago 133MB
레지스트리 인증을 진행합니다.
$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin [계정ID].dkr.ecr.ap-northeast-2.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/jenkins/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
로그인 성공 구문을 보면 레포지토리URI:Version 형식으로 tag를 달아 레포지토리에 push 할 수 있습니다.
$ docker tag nginx:latest [레포지토리URI]:[Version]
$ docker push [레포지토리URI]:[Version]
The push refers to repository [**********.dkr.ecr.ap-northeast-2.amazonaws.com/****]
075508cf8f04: Pushed
5c865c78bc96: Pushed
134e19b2fac5: Pushed
83634f76e732: Pushed
766fe2c3fc08: Pushed
02c055ef67f5: Pushed
latest: digest: sha256:61191087790c31e43eb37caa10de1135b002f10c09fdda7fa8a5989db74033aa size: 1570
이렇게 Jenkins 서버와 ECR 연동하는 법을 알아봤습니다.
다음에는 Jenkins 파이프라인 설정으로 앞서 배웠던 CodeCommit과 ECR 연동하는 방법을 알아 보겠습니다.
감사합니다.