소프트웨어 저장소 관리 시스템
이번 주제는 넥서스를 proxy서버로 이용해 s3 object storage를 사용하는 방법입니다.
주로 docker image 파일을 pull/cache 용도로 사용할 것입니다.
Object Storage Server
S3와 호환되는 API를 제공하여 기존 S3를 사용하여 app과 통합할 수 있습니다. 객체 스토리지를 이용해 대규모 데이터를 저장하고 관리하는데 사용되며, 대부분의 클라우드 서비스에서 데이터를 저장하는 기본 형태입니다.
1. FS 방식
- 백엔드 파일 시스템을 사용합니다.
2. ES(Erase Coding) 방식
- 데이터를 EC 코덱 알고리즘으로 인코딩하여 복제를 통해 각기 다른 disk로 할당합니다.
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) 사용할 예정입니다.
$ 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
mount 이전에는 MOUNTPOINT가 보이지 않습니다.
$ sudo mkfs.xfs /dev/sdc -L DISK1
$ sudo mkfs.xfs /dev/sdd -L DISK2
mkfx.xfs는 xfs 파일 시스템을 생성하는 명령어 입니다. Label 명을 붙여 포맷시킵니다.
xfs는 ext4에 비해 대용량 데이터 처리와 큰 파일일 경우 우수한 성능을 가집니다.
xfs 파일 시스템으로 포맷한 disk를 mount합니다.
mount할 directory
$ sudo mkdir -p /mnt/disk1 /mnt/disk2
$ sudo vi /etc/fstab
$ sudo mount -a
$ 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개가 필요)
$ vagrant up registry
$ vagrant ssh registry
$ docker volume create nexus-data
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
#id = admin
docker exec -it nexus cat /nexus-data/admin.password
type : S3
Access Key ID : minio에서 설정한 계정
Secret access key : minio에서 설정한 비밀번호
Endpoint URL : minio ipaddress
1. docker(proxy)
외부 docker-hub에서 image 파일을 가져오기 위한 프록시서버입니다.
설정은 아래와 같습니다.
2. docker(hosted)
proxy서버 이전에 cache 또는 host에 저장 및 접근하기 위한 서버입니다.
member repository에 쌓인 순서대로 탐색을 합니다.
주의 : Allow anonymous docker pull을 체크해야 이미지를 가져오는데 nexus3 서버를 통합니다 아닐경우 docker-hub로 직접 갑니다..
docker login을 위한 bearer 토큰을 설정합니다.
$ vagrant up node
$ vagrant ssh node
# /etc/docker/daemon.json
{
# nexus3가 돌고있는 registry 환경
"registry-mirrors": ["http://192.168.34.102:5000"],
"insecure-registries": ["192.168.34.102:5000"]
}
$ docker pull ubunut:latest