https://blog.kakaocdn.net/dn/V1Ppl/btqJt0o3Yv7/jf3hiuzAsqMB6o0ANlw70K/img.png

Docker 용 Remote Repository (Private Repository) 구축하기

Docker Conatiner 관리, 배포를 위한 Repository 로 대부분 Docker hub 를 많이 사용하고 있을 거다.
하지만 이 경우 공개되기도 하고 접근 관리 등을 하기가 어렵다
또 개인적으로 Maven 등을 쓰는 사람이라면 Docker Registry 를 직접 구현해보고 싶을 것이다.
그래서 Docker Container Remote Repository 를 직접 구축해서 사용해보자.

크게는 AWS 와 같은 클라우드를 이용하는 것과, Harbor, Nexus 등을 이용해 직접 구축하는 방법이 있다.

이번 글에서는 AWS ECR 과 Nexus3 를 이용한 Private Repository 구현을 하겠다.

AWS Elastic Container Restiry (ECR)

ECR 을 이용하여 Docker container push 를 해보도록 하자

ECR Repository 생성

ECR10

ECR11

AWS CLI 설치

관련 링크

https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-windows.html
https://lovemewithoutall.github.io/it/aws-cli-configure/

AWS CLI IAM 사용자 추가

ECR02

$ aws configure # AWS CLI 설정정보 입력
AWS Access Key ID [None]: {IAM Key} # IAM 에서 받은 키 
AWS Secret Access Key [None]: {IAM Secret Key} #  IAM 에서 받은 비밀 키
Default region name [None]: {region} # 원하는 리전 (선택)
Default output format [None]: json # 원하는 출력 포맷 (선택)

IAM 권한 추가

AmazonEC2ContainerRegistryFullAccess 권한을 주어야 이후 작업이 가능하다.

ECR04

ECR Docker 인증

$ aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {aws_account_id}.dkr.ecr.{region}.amazonaws.com

ECR05

Docker registry 등록

$ docker images
$ docker tag {target_image} {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{repository_name}
$ docker images
$ docker push {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{repository_name}

ECR06

ECR resitory 확인

로컬에 있는 image 확인

ECR07

ECR 에 있는 Repository 확인

ECR08

ECR 에 있는 Image 확인

ECR09

ECR repository 가져오기

$ docker pull {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{repository_name}

Nexus 이용

Docker에서 Nexus 접속용 사용자 생성

Create local user 를 눌러 docker_user 를 생성

NEXUS01

Nexus repository 생성

[설정] - [Repository] - [Repositories] 로 들어가
Create repository 을 누른다.

NEXUS05

목록에서
docker (hosted) 선택

NEXUS06

repository 이름 및 HTTP 체크박스를 클릭하여 port 설정

Docker V1 API 를 사용할 경우 체크

NEXUS07

Docker http 허용

위에서 설정한 Repository 의 port 로 접속시 HTTP 접속이기 때문에 보안관련 에러가 발생한다.
그래서 HTTP 요청을 허용할 수 있도록 설정해 주어야한다.

다만 안전하지 않은 연결이기 때문에 HTTP 보다는 HTTPS 연결을 권장한다.

docker daemon Config 파일 수정

{
  "insecure-registries": ["mymaven.devgd.com:5050"],
  //...
}

완료 후 Docker 재실행

Docker repository 설정

이제 만들어진 Docker repository 를 이미지와 연결해주어야 한다.
먼저 nexus 의 사용자로 로그인한 후
업로드할 이미지를 Docker repository 주소로 새로 만들어 push 해주면 된다.

$ docker login {nexus_host_name}
Username : {username}
Password : {password}
Login Succeeded
$ docker tag {target_image} {nexus_host_name}/repository/{repository_name}
$ docker images
$ docker push {nexus_host_name}/repository/{repository_name}

NEXUS02

NEXUS03

NEXUS04

Nexus repository 가져오기

$ docker pull {nexus_host_name}/repository/{repository_name}

ISSUE

docker push 404

Nexus 로그인 시 아래와 같이 메시지가 나오는 경우

Error response from daemon: login attempt to http://ip:port/v2/ failed with status: 404 Not Found

IP 나 Port 설정이 제대로 되어있지 않을 수 있다.
사용하고 있는 서버의 Port open 정책이나
nexus repository 의 http port 바인딩 상태를 확인한다.

또 nexus 상에서 문제가 생겼다면

$ tail -n 50 $data_dir/log/nexus.log
$ tail -n 50 $data_dir/log/jvm.log

위 위치의 로그를 확인하여 문제를 해결하도록 하자

docker login on private nexus => Error response from daemon: login attempt to http://ip:port/v2/ failed with status: 404 Not Found
login to nexus registry gives 404

Docker port 추가 열기

Docker 로 Nexus 를 사용하는 경우 repository 추가를 위한 포트를 다시 열 필요가 있다.
Nexus 를 위한 data dir 를 따로 외부로 빼두지 않았다면 컨테이너를 내리고 올렸을때 repository 에 있는 데이터가 사라지기 때문에 추가로 Port 를 여는 방법이 필요하다.

docker config 수정하기

컨테이너 삭제하지 않고 포트 추가하기

요약

docker container stop하기
docker service stop하기(service docker stop)
docker config file 수정하기(config.v2.json, hostconfig.json)
start docker service (service docker start)
docker container start하기

변경사항 commit 후 재 실행

실행중인 도커 컨테이너에 추가 포트 오픈하기
실행중인 container에 port or volume 추가

요약

docker stop 컨테이너
docker commit 컨테이너 이미지이름
docker run -p 80:80 -d 이미지이름

Nexus 여유 용량 문제

Nexus 는 data dir 최소 수준이 4G (4096MB) 가 보장되어야 실행된다.
해서 클라우드 등으로 Nexus 를 올릴 경우 재실행시 여유 공간을 확인해야 한다.

NXRM3 System Requirements - Disk Space
Data dir 변경하기

AWS 볼륨 추가

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ebs-using-volumes.html

Reverse Proxy Upload size

이미지 업로드시 대용량 파일이 올라가게 된다.
이떄 리버스 프록시등을 사용하고 있을 경우 Max size 에 대한 제한이 있을 수 있다.
적절한 용량으로 Max size 를 설정해두자

Nginx 413 Request Entity Too Large 에러 해결하기, 파일 업로드 사이즈

Docker login

ECR01

Docker login 하지 않고 원격지 Repository 사용하게 되면 "Unable to locate credentials" 와 같은 메시지가 나온다.

AWS ECR 로그인

ECR push 할때 "no basic auth credntials" 같은 메시지가 나올 경우
IAM 이 제대로 발급안되어 있을 수 있다.

관련 링크 링크

docker login 이 잘되어있는지, IAM 설정이 잘되어있는지 확인하도록 하자

만약 "AccessDeniedException" 이 뜬다면 권한이 부여되어있지 않은것이다.

ECR03

AmazonEC2ContainerRegistryFullAccess 를 주어 Registry 접근이 가능하도록 하자.

REFERENCE

AWS ECR

AWS CLI 초기 설정
AWS CLI를 사용하여 Amazon ECR 시작하기
AWS Management 콘솔을 사용하여 Amazon ECR 시작하기
get-login-password
Amazon ECR Docker Credential Helper

NEXUS

나만의 private docker registry 구성하기

Deploy a registry server

사내 Docker Registry 만들기 (Nexus3 기반)

nexus 설치

Docker Hub sonatype/nexus3

Sonatype Nexus3 Docker Registry

+ Recent posts