Cloud Architect/Docker

Chapter 8. Private registry build [Nexus]

"Everything about infra" 2025. 12. 2. 01:51

 

안녕하세요, 퍼블릭에 노출되지 않도록 이미지가 구성되려면

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로 접근해보기

nexus contaier의 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

  1. hosted repository : 내부에서 직접 이미지를 저장하는 자체 호스팅 레포지토리.
    1. 용도 : 사내에서 빌드한 Docker 이미지를 저장.
    2. 외부로 노출하지 않고 내부 개발팀이 pull/push
  2. proxy repository : 외부 Docker hub 또는 다른 레지스토리를 캐싱하는 역할.
    1. 용도 : 외부 이미지를 가져올 때 Nexus가 중간에서 캐시
    2. 네트워크 트래픽 절감, 속도 향상이 특징. (첫 요청 시 외부에서 가져오고 그 이후 캐시된 이미지 제공)
  3. group repository : 여러 저장소 (hosted + proxy)를 하나의 엔드포인트로 묶는 가상 레포지토리
    1. 용도 : 개발자가 하나의 URL만 설정하면 hosted + proxy 모두 접근 가능
    2. 예시 : docker pull nexus.mycompany.com/group-repo/nginx:latest
    3. 특징 : 편의성을 제공하며, 우선 순위 설정이 가능하다 (예: 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에 있는 이미지를 가져와서 컨테이너를 실행시킬 수 있다.

 

감사합니다:)