Chapter 8. Private registry build [Nexus]

안녕하세요, 퍼블릭에 노출되지 않도록 이미지가 구성되려면
private 환경의 registry를 사용해야 하는데,
오픈소스 도구인 nexus를 소개해드리려 합니다.

01. Nexus를 컨테이너로 띄워보기
- 오픈소스 아티팩트(이미지) 저장 · 관리 도구로 현업에서도 많이 사용하고 있다.
- 이미지를 제외하고도 다양한 패키지 저장소를 지원한다 (npm, yum, go 등..)
- private registry를 구축하여 회사 내부에서 사용이 가능하도록 구현이 가능하다.
✅ 필요한 경로 설정 및 계정 설정 (소유권)
sudo mkdir /nexus-data
sudo chown -R master /nexus-data
✅ Nexus container build
docker run --name nexus -d -p 5000:5000 -p 8081:8081 -v /nexus-data:/nexus-data -u root --restart=always sonatype/nexus3
- 5000 port : repository에 대한 접근을 위해 할당 (내부 통신)
- 8081 port : nexus UI를 활용하기 위해 할당

✅ UI로 접근해보기

✅ admin 계정에 대한 password 확인

- 현재 volume 설정으로 인해서 host에서 직접 확인이 가능하며, 볼륨 미설정 시 'docker exec -it' 옵션으로 컨테이너 내부에 접근하여 /nexus-data 경로에서 확인이 가능하다.
이제 Nexus UI에서 Sign in을 클릭하고 계정정보를 입력하여 인증 후 초기 셋팅을 진행해준다.
초기 셋팅 : 비밀번호 변경, Anonymous Access 사용 여부 등.
02. Sonatype Nexus 구축하기.
nexus3을 이용해서 private registry 구축에 필요한 저장소 (Blob 레포지토리)를 생성이 목표.
📌 Blob repository type
- hosted repository : 내부에서 직접 이미지를 저장하는 자체 호스팅 레포지토리.
- 용도 : 사내에서 빌드한 Docker 이미지를 저장.
- 외부로 노출하지 않고 내부 개발팀이 pull/push
- proxy repository : 외부 Docker hub 또는 다른 레지스토리를 캐싱하는 역할.
- 용도 : 외부 이미지를 가져올 때 Nexus가 중간에서 캐시
- 네트워크 트래픽 절감, 속도 향상이 특징. (첫 요청 시 외부에서 가져오고 그 이후 캐시된 이미지 제공)
- group repository : 여러 저장소 (hosted + proxy)를 하나의 엔드포인트로 묶는 가상 레포지토리
- 용도 : 개발자가 하나의 URL만 설정하면 hosted + proxy 모두 접근 가능
- 예시 : docker pull nexus.mycompany.com/group-repo/nginx:latest
- 특징 : 편의성을 제공하며, 우선 순위 설정이 가능하다 (예: hosted → proxy 순서)
2-1. Blob repo 생성
hosted, proxy에 대한 blob repo를 생성해보자.

아래와 같이 생성할 수 있으며 Type에는 S3, Google Cloud Storage, File(Local)이 있다.

현재 생성한 Blob repo가 /nexus-data/blob 경로에도 나타나는 것을 확인할 수 있다.

2-2. Repository에서 생성한 Blob 연결
Repositories 탭에서 Create를 하여 생성한 hoted, proxy에 대한 blob repo에 연결.

1) hosted repositories 생성
- docker (hosted)를 선택하여 하기와 같이 설정하자.


2) proxy repositories 생성
- docker (proxy)를 선택하여 하기와 같이 설정하자.



2-3. 환경변수 세팅
📌 docker daemon.json 설정
- HTTP / HTTPS 설정 문제
- nexus docker registry는 기본적으로 HTTPS를 권장하지만 내부 테스트용으로 http도 많이 사용한다.
- docker는 기본적으로 https만 허용하기 때문에 http 레지스트리를 사용하려면 insecure-registries 설정
- 커스텀 포트 사용
- (5000, 8082 등)를 사용하기 때문에 Docker 데몬이 해당 포트를 신뢰하도록 설정해야 한다.
- 인증 및 프록시 관련
- Nexus에 로그인(docker login)할 때 인증 문제가 발생할 수 있어서 설정을 명시적으로 지정하는 경우도 있다.
sudo vi /etc/docker/daemon.json
{ "insecure-registries": ["192.168.56.100:5000"],
"log-driver": "json-file",
"log-opts": {
"max-size": "30m",
"max-file": "10"
}
}
설정 후에 반드시 하기와 같이 명령어를 사용하여 초기화 & 확인 작업 권장.
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info # 맨 아래 Insecure Registries: 부분 확인
03. image push & pull
✅ nexus 로그인

- Nexus를 띄운 UI 주소로 login 진행하자.
✅ 이미지 tag 후 push

✅ Nexus hosted repo 확인

- webserver:1.0 이라는 이미지를 Nexus 내부 레포지토리에 업로드한 것을 확인할 수 있다.
✅ proxy를 통해서 nexus를 거쳐 image를 pull해서 컨테이너로 실행

- Nexus 내부 repo에 있는 이미지를 가져와서 컨테이너를 실행시킬 수 있다.
감사합니다:)