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 생성
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 사용자 추가
$ 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
권한을 주어야 이후 작업이 가능하다.
ECR Docker 인증
$ aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {aws_account_id}.dkr.ecr.{region}.amazonaws.com
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}
ECR resitory 확인
로컬에 있는 image 확인
ECR 에 있는 Repository 확인
ECR 에 있는 Image 확인
ECR repository 가져오기
$ docker pull {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{repository_name}
Nexus 이용
Docker에서 Nexus 접속용 사용자 생성
Create local user
를 눌러 docker_user 를 생성
Nexus repository 생성
[설정] - [Repository] - [Repositories] 로 들어가Create repository
을 누른다.
목록에서
docker (hosted) 선택
repository 이름 및 HTTP 체크박스를 클릭하여 port 설정
Docker V1 API 를 사용할 경우 체크
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}
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
Docker login 하지 않고 원격지 Repository 사용하게 되면 "Unable to locate credentials" 와 같은 메시지가 나온다.
AWS ECR 로그인
ECR push 할때 "no basic auth credntials" 같은 메시지가 나올 경우
IAM 이 제대로 발급안되어 있을 수 있다.
관련 링크 링크
docker login 이 잘되어있는지, IAM 설정이 잘되어있는지 확인하도록 하자
만약 "AccessDeniedException" 이 뜬다면 권한이 부여되어있지 않은것이다.
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 구성하기