private service 구축 2

EEEFFEE·2024년 1월 19일

docker

목록 보기
6/6

24.01.20 최초 작성

1. 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" do |ceph|
    ceph.vm.hostname = "ceph.local"
    ceph.vm.network "private_network", ip: "192.168.56.101"
    ceph.vm.disk :disk, size: "25GB", name: "extra1"
    ceph.vm.disk :disk, size: "25GB", name: "extra2"
  end

  config.vm.define "registry" do |registry|
    registry.vm.hostname = "registry.local"
    registry.vm.network "private_network", ip: "192.168.56.102"
  end

  config.vm.define "node" do |node|
    node.vm.hostname = "node.local"
    node.vm.network "private_network", ip: "192.168.56.103"
  end

  config.vm.define "minio" do |minio|
    minio.vm.hostname = "minio.local"
    minio.vm.network "private_network", ip: "192.168.56.104"
    minio.vm.disk :disk, size: "25GB", name: "extra1"
    minio.vm.disk :disk, size: "25GB", name: "extra2"
  end

  config.vm.define "harbor" do |harbor|
    harbor.vm.hostname = "harbor.local"
    harbor.vm.network "private_network", ip: "192.168.56.105"
  end
end

2. S3 서비스 구축(minio)

2.1 가상머신 및 docker 실행

  • VAGRANT_EXPERIMENTAL="disks" vagrant up minio을 통해 가상 머신 생성, vagrant ssh minio을 통해 ssh 접속

  • 각 디스크 xfs파일 형식으로 포맷, 마운트


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

# /etc/fstab에 다음 내용 입력
sudo vim /etc/fstab
$LABEL=DISK1		/mnt/disk1	xfs	defaults,noatime 0 2
$LABEL=DISK2		/mnt/disk2	xfs	defaults,noatime 0 2

sudo mkdir -p /mnt/disk1 /mnt/disk2

sudo mount -a

  • minio 실행

docker run -d --name minio \
			-p 9000-9001:9000-9001 \
			-v /mnt/disk1:/data1 \
			-v /mnt/disk2:/data2 \
			-e MINIO_ROOT_USER=admin \
			-e MINIO_ROOT_PASSWORD=secret%1 \
			minio/minio \
			server /data1 /data2 --console-address ":9001" 
            #/data1, data2를 server가 관리함, consoledms 9001번 지정, 9000번은 api
            

docker run -d --name minio -p 9000-9001:9000-9001 -v /mnt/disk1:/data1 -v /mnt/disk2:/data2 -e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWORD=secret%1 minio/minio server /data1 /data2 --console-address ":9001"

2.2 minio 설정

  • 포트포워딩, 웹브라우저를 통해 접속

  • 버킷 2개 생성

2.3 docker-compose.yml


version: "3"
services:
  minio:
    image: minio/minio
    container_name: minio
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=secret%1
    command: 
      - server /data1 /data2 --console-address ":9001"
    volumes:
      - /mnt/disk1:/data1
      - /mnt/disk2:/data2

3. Private Registry (Nexus)

3.1 가상머신 및 docker 실행

  • vagrant up registry를 통해 가상머신 생성, vagrant ssh registry를 통해 ssh 접속

  • 볼륨 생성 및 실행


docker volume create nexus-data

docker run -d -p 8081:8081 -p 5000-5001:5000 --name nexus \
			-e INSTALL4J_ADD_VM_PARAMS="-Xms1024m -Xmx1024m -XX:MaxDirectMemorySize=512m" \
			-v nexus-data:/nexus-data sonatype/nexus3

docker run -d -p 8081:8081 -p 5000-5001:5000 --name nexus -e INSTALL4J_ADD_VM_PARAMS="-Xms1024m -Xmx1024m -XX:MaxDirectMemorySize=512m" -v nexus-data:/nexus-data sonatype/nexus3

3.2 registry 설정

  • 포트포워딩, 웹브라우저를 통해 접속

  • Realm에서 Docker bearer Token 추가

  • docker exec -it nexus cat /nexus-data/admin.password을 통해 계정 접속, 계정 초기화 수행

  • Blob Store에서 다음과 같이 레지스트리 등록

    Type : S3
    Name : docker
    Region : us-east-1
    Bucket : nexus3
    Access_Key ID : admin
    Secret Acess Key : secret%1
    Endpoint URL : http://192.168.56.104:9000

  • create repository를 통해 레지스트리 생성

docker(proxy)
name : docker-hub
Remote storage : https://registry-1.docker.io
Docker index : Use Docker Hub
Blob store : docker

docker(host)
name : docker-hosted
HTTP : 5001
Blob store : docker

docker(group)
name : docker
HTTP : 5000
Allow anonymous docker pull : check
Blob store : docker
Member repositories : docker-hub, docker-hosted

4. node

4.1 가상머신 생성 및 설정

  • vagrant up node를 통해 가상머신 생성, vagrant ssh node를 통해 ssh 접속

  • /etc/docker/daemon.json에 다음과 같이 입력


{
	"registry-mirrors": [
		"http://192.168.56.102:5000"
	],
	"insecure-registries": [
		"192.168.34.56:5000"
	]
}

  • 도커 재시작 및 상태 확인, pull 동작 확인

sudo service docker restart
docker info

docker pull ubuntu:latest

5. Private Registry (harbor)

5.1 가상 머신 생성 및 설정

  • vagrant up harbor를 통해 가상머신 생성, vagrant ssh harbor를 통해 ssh 접속

  • gpg키 준비


sudo \
gpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 644FF454C0B4115C

sudo gpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 644FF454C0B4115C

  • git 다운로드, 압축 해제

curl -LO https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-online-installer-v2.8.2.tgz

tar xvzf harbor-online-installer-v2.8.2.tgz

  • CA인증서 처리

openssl genrsa -out ca.key 4096

#SELF-SIGN CA 인증서
openssl req -x509 -new -nodes -sha512 -days 3650 \
			-subj "/C=KR/O=grepp/OU=docker/CN=192.168.34.105" \
			-key ca.key \
			-out ca.crt

#SELF-SIGN CA 인증서
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=KR/O=grepp/OU=docker/CN=192.168.34.105" -key ca.key -out ca.crt

  • 서버 인증서 키 생성 및 서버 인증서 서명 요청 생성

openssl genrsa -out harbor.local.key 4096

openssl req -sha512 -new \
			-subj "/C=KR/O=grepp/OU=docker/CN=harbor.local" \
			-key harbor.local.key \
			-out harbor.local.csr

openssl req -sha512 -new -subj "/C=KR/O=grepp/OU=docker/CN=haror.local" -key harbor.local.key -out harbor.local.csr

#서명 정보 확인
cat > v3.ext <<-EOF

#자체 서버 서명 수행
openssl x509 -req -sha512 -days 3650 \
				-extfile v3.ext \
				-CA ca.crt -CAkey ca.key -CAcreateserial \
				-in harbor.local.csr \
				-out harbor.local.crt

openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor.local.csr -out harbor.local.crt

  • 인증서 /data로 이동

sudo mkdir -p /data/cert
sudo cp harbor.local.key harbor.local.crt /data/cert

  • CRT를 인증서 체인으로 생성

openssl x509 -inform PEM -in harbor.local.crt -out harbor.local.cert

  • harbor에 접근하는 모든 도커 node는 아래 파일을 /etc/docker/certs.d/harbor.local/에 복사
    • ca.crt
    • harbor.local.cert
    • harbor.local.key

sudo mkdir -p /etc/docker/certs.d/harbor.local/
sudo cp ca.crt /etc/docker/certs.d/harbor.local/
sudo cp harbor.local.cert /etc/docker/certs.d/harbor.local/
sudo cp harbor.local.key /etc/docker/certs.d/harbor.local/

  • .yml 수정

cd harbor
cp harbor.yml.tmpl harbor.yml

  • prepare수행 및 harbor 실행

./prepare

sudo docker-compose up -d

5.2 registry 설정

  • 포트포워딩, 웹브라우저를 통해 접속

  • 앞서 설정한 ID와 비밀번호 입력해 로그인

  • registries에서 New Registry Endpoint 설정

Provider : Docker Hub
Name : Hub

5.3 nexus 연결

  • registries에서 New Registry Endpoint 설정

Provider : Docker Registry
Endpoint URL : http://192.168.56.102:5000

0개의 댓글