티스토리 뷰

 

private docker registry with nexus-oss

 
 
docker를 사용하기 위해서는 이미지를 registry 에서 받아와야 합니다.
열심히 사용하다가 이미지를 업로드 시켜야 하는 경우에 마찬가지로 docker hub에 Repository를 만들고 올리면 됩니다.
 
문제는 인터넷이 안되는 환경이거나, 여러개의 private repository가 필요한 상황에는 내부에 private 한 docker registry가 필요 합니다.
 
흔히 Harbor를 설치해서 사용합니다. 하지만, Harbor는 무겁고, 사소하지만 버그들이 좀 있습니다.
이 경우에는 Harbor가 아닌 gitlab 이나 nexus로 구성할 수 있습니다.
개인적으로 구성 해 봤을때, Nexus로 구성하는게 더 편하고 직관적이었습니다.
 
이번에 Nexus로 Docker 저장소를 구성하는 방법을 설명 하고자 합니다.
 


 

A. 실행 환경


1. System Requirements

  • CPU : 4Core 이상 권장.(하지만 1Core만 해도 설치는 가능 함.)
  • Memory : 4GB 이상
  • DISK : 100MB 이상

2. Infra 환경

  • Docker
  • Port : 
    • 8081 : Web 접속 Port
    • 8084 : Docker 저장소의 HTTP Port
    • 8085 : Docker 저장소의 HTTPS Port 

 
 


 

B. 설치

 


1. Docker 설치

 
이전 게시물을 참고해 주세요.
 
2024.08.22 - [Infra] - 컨테이너 런타임시스템 Docker!!

컨테이너 런타임시스템 Docker!!

A. 개요1. Docker 가 뭐지?도커(Docker)는 애플리케이션을 컨테이너라는 단위로 패키징하여 배포, 실행, 관리할 수 있게 해주는 오픈 소스 플랫폼이다. 컨테이너는 애플리케이션과 그 실행 환경을 함

tack0829.tistory.com

 


2. docker-compose.yaml 작성

mkdir -p /data/install/nexus/script /data/appdata/nexus/nexus-data /data/nexus/sonatype-work
sudo chown -R 200:200 /data/appdata/nexus

cat << EOF > /data/install/nexus/script/docker-compose.yaml
version: "3"
services:
  nexus:
    container_name: nexus
    image: "sonatype/nexus3"
    restart: always
    volumes:
      - "/data/appdata/nexus/nexus-data:/nexus-data"
      - "/data/appdata/nexus/sonatype-work:/sonatype-work"
    ports:
      - "8081:8081"
      - "8084:80"
      - "8085:443"
EOF

 

  • 8081 : Nexus 접근 Web Port 입니다.
  • 8084 : Docker 저장소의 http Port 입니다.
  • 8085 : Docker 저장소의 https port 입니다.

 


3. 기동

docker compose -f /data/install/nexus/script/docker-compose.yaml up -d

 

  • admin 계정의 비밀번호는 다음과 같이 확인 할 수 있다.
cat /data/appdata/nexus/nexus-data/admin.password
256724f8-a2d7-4bd9-989f-b2a1a60712d2

 


4. 접속 테스트

 
설치 된 데이터들의 경로를 확인 합니다.
정상적으로 파일이 생성되었죠...

설치된 경로의 파일 목록

 
사이트에 접속 합니다.
http://127.0.0.1:8081
(저는 192.168.0.141 로 구성되어 있습니다. 참고하세요.)
 


(1) admin 계정으로 로그인

 

로그인 버튼

로그인 하기 위해 Sign in 링크를 클릭하면, 아래 처럼 로그인 창이 뜹니다.

로그인 화면.

/nexus-data/admin.password가 생성됩니다.
확인 해 봅니다.

cat /data/appdata/nexus/nexus-data/admin.password
cat /data/appdata/nexus/nexus-data/admin.password

아까는 없던 파일이 이제는 보입니다. 
이 계정으로 로그인 합니다.


(2) 설정

이제부터 설정 시작!

이제부터 설정을 합니다.

admin의 password를 변경하기 위해 새로운 password 입력

적당한 password를 입력 합니다.
참고로 admin password이므로 복잡하면 복잡할 수록 좋습니다.
 

Enable anonymous access 선택

구성의 편의를 위해서 anonymouse access를 Enable 해 줍니다.
 

설정 완료!!

 
그러면 이제 구성이 끝납니다.
 


C. Docker Repository 구성

Nexus의 저장소는 여러가지 Type의 라이브러리들을 저장할 수 있는 Repositories 타입을 지원합니다.
각 Type별로 저장소에 Storage를 설정할 수 있죠. File Stororage 및 S3와 같은 Cloud의 Bucket에 저장하는 것도 지원합니다. AWS의 S3와 Azure의 Blob Storage  등을 S3 타입으로 설정할 수 있습니다.
 
먼저 Blob Storage를 생성 해 줍니다. 이후 Repository를 생성 해 주고 저장할 Storage를 지정 해 줍니다.
 
 


1. Blob Storage 생성

 
 
 
설정으로 이동합니다.
좌측 상단의  톱니바퀴 아이콘을 클릭합니다.

관리자 설정 화면으로 이동

 
 
Create Blob Store 를 클릭해서 생성 화면으로 이동합니다.
 : Repository > Blob Stores > Create Blob Store

blob storage 생성 화면으로 이동

 
Type은 File로, Name은 적당히 알아볼 수 있는 이름으로 합니다.
저는 docker 라는 storage 로 만들었습니다.

blob storage 를 file type으로 생성

 
 
목록에서 생성된 storage를 확인할 수 있습니다.

storage 생성된 목록

 
 


2. Respository 생성

저장할 공간은 만들었지만, 외부에서 접근하기 위한 경로는 아직 없는 상태입니다.
Repository를 생성하면 외부에서 접근하기 위한 Port가 정의됩니다.
 

repository 화면으로 이동

 
Recipe 는 docker(hosted)를 선택 합니다.
 

recipe를 docker(hosted)로 선택 화면

 
참고로 여기서 group / hosted / proxy 가 있는데,

  • hosted는 local에 저장하는 저장소 입니다.
  • proxy는 외부의 저장소로 proxy 하고 local cache를 생성합니다.
  • group은 hosted와 proxy를 하나로 묶어서 한개의 repository로 구성합니다. hosted에 없으면 proxy에서 조회 합니다.

 

docker 저장소 설정의 예시

 
아래와 같이 설정 하고 생성 합니다.

  • port는 http:80, https:443 으로 설정합니다.
  • blob store 는 docker

 

docker repository 구성 된 화면

생성된 docker 저장소가 보입니다.
 
 


D. Docker Repository Test

 


1. Insecure

 


(1) daemon.json 설정

docker repository는 기본적으로 https 통신을 해야 합니다. 하지만 현재 구성은 인증서가 없으므로, http 프로토콜로 통신해야 합니다. 
insecure 설정을 해 줍니다.
 

cat << EOF | sudo tee -a /etc/docker/daemon.json
{
    "insecure-registries" : ["192.168.0.141:8084"]
}
EOF

 
설정 변경 후 service 를 restart 해 줍니다.
 

sudo systemctl restart docker

 
docker service가 재기동 되고, nexus가 다시 재기동 됩니다.
기다립니다... 웹으로 접속이 가능해질 때까지..
 
약 2-3분 정도 뒤에.. Web으로 접속해서 정상 접속이 되면 이제 테스트를 진행 해 봅니다.
현재 Nexus 이미지를 한번 Push 해 봅니다.
 


(2) Docker login

docker image를 올리기 위해서는 docker registry에 login을 해야 합니다.
여기서는 http port은 8084로 로그인 할겁니다.
docker ps를 통해 설정된 port 목록을 확인 하실 수 있습니다.
 
계정은 admin 계정으로 로그인 하시면 됩니다.

docker login http://192.168.0.41:8084
docker login을 insecrue로 하는 화면

 
insecure로 설정 해서 http로 로그인이 가능합니다.
 


(3) Docker Registry에 Image Push

 
이제 이미지를 올려 보도록 하겠습니다.
현재 nexus 이미지가 local에 있습니다.

docker images
tag 생성 전 이미지 목록 확인

 
이 이미지를 올려 보도록 합니다.
 
Tag를 [저장소주소]/[이미지명]:[tag] 의 형식으로 생성 합니다.

 docker image tag sonatype/nexus3:latest 192.168.0.141:8084/sonatype/nexus3:latest

 

tag 생성 후 이미지 목록

이제 새로운 이미지 Tag 가 생성 되었습니다.
Push 를 해 봅니다.
 

 docker push 192.168.0.141:8084/sonatype/nexus3:latest
이미지 Push 하는 화면

 
Push가 완료 되었습니다.
사이트에서 확인 해 봅니다.

docker image upload 결과 화면

이렇게 정상적으로 올라간 것을 확인할 수 있습니다.
 
이제 다운로드 받아 봅니다.
먼저 local에 만들어지 tag를 삭제 합니다.

docker rmi 192.168.0.141:8084/sonatype/nexus3

 
이제 pull 을 받아 봅니다.

docker pull 192.168.0.141:8084/sonatype/nexus3

 
 

docker image pull 테스트

 
정상적으로 pull 이 실행 되는것을 확인할 수 있습니다.
 


2. Secure 구성

insecure 환경은 local에서 인증서가 없을 경우에 구성하는 방법입니다.
Duckdns와 Letsencrypt를 이용해서 SSL 인증서를 발급 받아서 구성하는 방법과 Nginx 구성 방법은 이전에 올린 게시물에서 확인 하시기 바랍니다.
 
2024.08.21 - [Infra] - DuckDns + LetsEncrypt로 Nginx HTTPS설정

DuckDns + LetsEncrypt로 Nginx HTTPS설정

프로젝트 초기에는 도메인 및 인증서가 없는 상황이 대부분이다. 하지만 backing system들 중, SSL 인증서가 필요한 환경도 있을 수 있다.(가령 docker registry 등…) 이때, public 도메인과 공인 인증서를

tack0829.tistory.com

 
이 Nginx에 다음과 같은 conf 를 적용하면 구성이 완료 됩니다.
도메인이 docker.host.com 이라고 가정 합니다.
 

server {
    listen 80;
    server_name docker.host.com;
    client_max_body_size 0;
    location /v2 {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://192.168.0.141:8084;
    }
}
server {
    listen 443 ssl;
    server_name docker.host.com;
    include common.d/ssl_cert.conf;
    location /v2 {
        # docker login
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://192.168.0.141:8085;
    }

}

 
이렇게 하면 docker 저장소에 이미지를 push 하고 받아올 수 있습니다.