Nexus Repository 기본 개념 & 설치 가이드
docker hub있는데 왜 Nexus 씀? 에 대해서 얘기해볼까 합니다
목차
1) Nexus Repository란 무엇인가?
개요 : Nexus는 Docker Image 등의 빌드 결과물을 저장하는 장소입니다.
유사한 서비스로는 Docker hub, Maven Central 등이 있습니다.
도커에 익숙하신 분들이라면 꽤나 자주 써봤을 명령어
Docker pull ${Image_Name}
위 명령어는 Docker hub라는 저장소에서 이미지를 가져옵니다.
풀어서 써보면
docker pull docker.io/library/${Image_Name}
위와 같은 경로가 생략되어 있는거죠.
이러한 dockerhub(docker.io)가 아닌, 다른 종류의 저장소인 nexus에 대해서 서술해볼까 합니다.
2) 선행 개념 : 아티팩트 저장소(Artifact Repository)란?
- Artifact(아티팩트)란?: 빌드 결과물(JAR/WAR, npm 패키지, Python wheel, Docker Image 등)
- 왜 중앙 저장소를 사용할까요?
- 재사용/공유: 한 번 만든 걸 여러 서비스가 안전하게 재사용
- 속도/안정성: 외부 레지스트리 장애와 네트워크 지연을 줄임
- 보안/품질: 검증된 산출물만 쓰도록 검증하여 업로드하는 역할
Nexus의 3대 저장소 타입:
- Proxy: 외부 저장소를 캐싱해 팀 내부에 빠르게 공급 (예: Maven Central 프록시, 스토리지 등)
- Hosted: 우리 팀이 만든 산출물을 직접 보관
- Group: 여러 저장소를 하나의 엔드포인트로 묶기 (개발자 입장에선 URL 하나)
즉, 아티팩트 버전 관리 / 저장 / 공유 를 하기 위한 ‘프라이빗 보관소’ 라고 보시면 되겠습니다.
3) Docker를 통해 Nexus 설치하기
3-1) 준비물
- Docker, Docker Compose 설치
더보기
우분투 Docker 설치 스크립트
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update -y
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker ${USER}
- 권장 스펙: 2 vCPU / 4–8GB RAM / 디스크 여유 (추후 들어갈 아키택트 용량 고려)
3-2) docker-compose.yml
services:
nexus:
image: sonatype/nexus3:latest # nexus3 이미지 최신 버전
container_name: nexus # 컨테이너 이름
ports: # 포트 지정
- "5000:5000" # Nexus docker 기본 포트
- "8081:8081" # Nexus UI
volumes: # 볼륨 지정
- ./nexus-data:/nexus-data
❗️ 권한 이슈 발생 시(리눅스): 필요 시 sudo chown -R 200:200 nexus-data (Nexus 컨테이너의 런타임 UID/GID가 200)
docker compose up -d
http://${host}:8081
# 내 PC(로컬)이라면
http://localhost:8081
초기 관리자 비밀번호:
cat ./nexus-data/admin.password
4) 로컬 vs 서버(운영) 설치 차이
로컬(개발용)
- 개인 실습/테스트용, 포트 그대로 노출(8081)
- 백업은 필요 최소한으로
서버(팀 공유/운영)
- 도메인 + HTTPS 적용 권장
- 정기 백업 + 모니터링(디스크/메모리, repo 용량)
- 사내 인증(SSO/LDAP)과 권한 Role 설계
Nginx 리버스 프록시 예시:
server {
listen 80;
server_name nexus.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name nexus.example.com;
ssl_certificate /etc/letsencrypt/live/nexus.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nexus.example.com/privkey.pem;
client_max_body_size 4g; # 최대 용량 제한 (권장) / 0으로 설정 시 제한없음
# 타임아웃 설정 (권장)
proxy_read_timeout 900s;
proxy_send_timeout 900s;
send_timeout 900s;
location / {
# 대용량 첨부 / 장시간 세션 유지 필요 시 설정 (권장)
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_request_buffering off
# 필수 섹션
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://nexus:8081;
}
}
- Docker registry 예시
더보기
server {
listen 443 ssl http2;
server_name registry.example.com;
ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem;
client_max_body_size 0; # 레지스트리는 제한 없음 권장(아니면 충분히 크게)
location /v2/ {
proxy_pass http://nexus:5000; # ← Nexus Docker repo의 HTTP 포트(예: 5000)
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600s;
proxy_request_buffering off; # 큰 레이어 업로드 스트리밍
# chunked_transfer_encoding on; # HTTP/1.1이면 기본 활성(명시해도 무방)
}
}
컨테이너 네트워크(예: docker network create proxy), Nginx와 Nexus를 같은 네트워크에 연결하여 proxy_pass http://nexus:8081;처럼 서비스명으로 라우팅하는 구성이 편합니다.
5) 보안 설정 체크리스트
- admin 비밀번호 즉시 변경
- Anonymous(익명) 권한 최소화 또는 비활성화
- 필요한 리포지토리 타입만 활성화해 표면적 줄이기
- Cleanup 정책(Snapshot 보관 기간)으로 디스크 관리
- Docker 레지스트리 사용 시 “Docker Bearer Token Realm” 활성화