Private Registry Service 구축 [Nexus/ MINIO](2)

김현송·2023년 7월 25일
0
post-thumbnail

Nexus

소프트웨어 저장소 관리 시스템

  • 주로 소프트웨어 개발에서 사용되는 의존성 관리, 라이브러리 관리, 릴리스 관리, 빌드 자동화 등을 수행할때 사용하며 중앙 저장소 역할을 합니다.
  • 프로젝트에서 필요로 하는 라이브러리 버전을 관리하여 프로젝트의 안정성과 일관성을 유지할 수 있습니다.

이번 주제는 넥서스를 proxy서버로 이용해 s3 object storage를 사용하는 방법입니다.
주로 docker image 파일을 pull/cache 용도로 사용할 것입니다.

MINIO

Object Storage Server
S3와 호환되는 API를 제공하여 기존 S3를 사용하여 app과 통합할 수 있습니다. 객체 스토리지를 이용해 대규모 데이터를 저장하고 관리하는데 사용되며, 대부분의 클라우드 서비스에서 데이터를 저장하는 기본 형태입니다.
1. FS 방식
- 백엔드 파일 시스템을 사용합니다.
2. ES(Erase Coding) 방식
- 데이터를 EC 코덱 알고리즘으로 인코딩하여 복제를 통해 각기 다른 disk로 할당합니다.

Vagrantfile

VAGRANTFILE_API_VERSION = "2"
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.provider "virtualbox" do |vb|
            vb.memory = 2048
    end
    if Vagrant.has_plugin?("vagrant-vbguest")
        config.vbguest.auto_update = false
    end
    config.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: [".git/"]
    config.vm.provision "shell", inline: <<-SHELL
        export DEBIAN_FRONTEND=noninteractive
        sudo apt -y update
        sudo apt install -y ca-certificates curl gnupg libnss-mdns
        sudo install -m 0755 -d /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        sudo chmod a+r /etc/apt/keyrings/docker.gpg
        echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        sudo apt -y update
        sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
        sudo usermod -aG docker vagrant
    SHELL
    config.vm.define "ceph", primary: true do |ceph|
        ceph.vm.hostname = "ceph.local"
        ceph.vm.network "private_network", ip: "192.168.34.101"
        ceph.vm.disk :disk, size:"25GB", name: "extra1"
        ceph.vm.disk :disk, size:"25GB", name: "extra2"
    end
    config.vm.define "registry", primary: true do |registry|
        registry.vm.hostname = "registry.local"
        registry.vm.network "private_network", ip: "192.168.34.102"
    end
    config.vm.define "node", primary: true do |node|
        node.vm.hostname = "node.local"
        node.vm.network "private_network", ip: "192.168.34.103"
    end
    config.vm.define "minio", primary: true do |minio|
        minio.vm.hostname = "minio.local"
        minio.vm.network "private_network", ip: "192.168.34.104"
        minio.vm.disk :disk, size:"25GB", name: "extra1"
        minio.vm.disk :disk, size:"25GB", name: "extra2"
    end
    config.vm.define "harbor", primary: true do |harbor|
        harbor.vm.hostname = "harbor.local"
        harbor.vm.network "private_network", ip: "192.168.34.105"
    end
end
        

이전 Ceph의 Vagrantfile과 다르게 Ceph 환경과 minio 환경에 각각 vm disk를 추가로 입력하여 Extra disk 를 만들겠습니다.
이 Extra disk를 volume으로 minio에 붙여(mount) 사용할 예정입니다.

1. MINIO 가상 머신 실행 및 접속

$ VAGRANT_EXPERIMENTAL="disks" vagrant up minio
$ vagrant ssh minio

해당 명령어는 linux기반 명령어로 window powershell일 경우 아래 명령어로 입력해야 합나다. 혹은 git bash terminal을 이용하면 사용할 수 있습니다.

windows
$ $env:VAGRANT_EXPERIMENTAL="disks"
$ vagrant up minio
$ vagrant ssh minio

2. 추가한 disk format

mount 이전에는 MOUNTPOINT가 보이지 않습니다.

$ sudo mkfs.xfs /dev/sdc -L DISK1
$ sudo mkfs.xfs /dev/sdd -L DISK2

mkfx.xfs는 xfs 파일 시스템을 생성하는 명령어 입니다. Label 명을 붙여 포맷시킵니다.
xfs는 ext4에 비해 대용량 데이터 처리와 큰 파일일 경우 우수한 성능을 가집니다.

3. mount

xfs 파일 시스템으로 포맷한 disk를 mount합니다.

mount할 directory
$ sudo mkdir -p /mnt/disk1 /mnt/disk2

$ sudo vi /etc/fstab

$ sudo mount -a

4. MINIO 실행하기

$ docker run -d --name minio -p 9000-9001:9000-9001 \
              -v /mnt/disk1:/data1 \
              -v /mnt/disk2:/data2 \
              -e MINIO_ROOT_USER=<id> \
              -e MINIO_ROOT_PASSWORD=<password>\
              minio/minio \
              server /data1 /data2 --console-address ":9001"

한줄에 작성하되 비밀번호는 너무 쉬우면 안됩니다. (최소 문자 3개가 필요)

5. 포트포워딩

6. Buckets 추가

7. registry 실행 및 접속

$ vagrant up registry
$ vagrant ssh registry

8. volume 생성 및 실행(docker-compose)

$ docker volume create nexus-data

docker-compose.yml

services:
  nexus:
    image: sonatype/nexus3
    container_name: nexus
    environment:
      - INSTALL4J_ADD_VM_PARAMS=-Xms1024m -Xmx1024m -XX:MaxDirectMemorySize=512m -Djava.util.prefs.userRoot=/nexus-data/javaprefs
    ports:
      - 8081:8081
      - 5000-5001:5000
    volumes:
      - nexus-data:/nexus-data
volumes:
  nexus-data:
    external: true

-Djava.util.prefs.userRoot=/nexus-data/javaprefs
해당 내용은 지속적인 error log를 출력합니다.
https://community.sonatype.com/t/problem-afer-upgrading-to-3-42-0-could-not-lock-user-prefs/9568

9. 포트포워딩

10. 자동 설정된 비밀번호 찾기

#id = admin
docker exec -it nexus cat /nexus-data/admin.password

11. nexus3의 blob store를 MINIO에서 사용하도록 설정하기

type : S3
Access Key ID : minio에서 설정한 계정
Secret access key : minio에서 설정한 비밀번호
Endpoint URL : minio ipaddress

12. docker repository 추가하기


1. docker(proxy)
외부 docker-hub에서 image 파일을 가져오기 위한 프록시서버입니다.
설정은 아래와 같습니다.

2. docker(hosted)
proxy서버 이전에 cache 또는 host에 저장 및 접근하기 위한 서버입니다.

  1. docker(group)
    hosted 서버와 proxy 서버 등을 그루핑합니다.

member repository에 쌓인 순서대로 탐색을 합니다.

주의 : Allow anonymous docker pull을 체크해야 이미지를 가져오는데 nexus3 서버를 통합니다 아닐경우 docker-hub로 직접 갑니다..

13. Realms 설정하기

docker login을 위한 bearer 토큰을 설정합니다.

14. Node 환경 실행

$ vagrant up node
$ vagrant ssh node

15. Node Daemon.json 수정

# /etc/docker/daemon.json
{
  # nexus3가 돌고있는 registry 환경
  "registry-mirrors": ["http://192.168.34.102:5000"],
  "insecure-registries": ["192.168.34.102:5000"]
}

16. docker image pull test

$ docker pull ubunut:latest

17. 실행 결과

  • nexus
  • MINIO
profile
안녕하세요

0개의 댓글