08 Docker-registry를 이용해 사설 이미지 저장소 구축 및 배포하기

유영국·2024년 4월 30일

CICD자동화

목록 보기
9/9

Docker-registry 를 이용하여 안전한 사설 이미지 저장소를 구축하고 파이프라인을 통해 빌드된 이미지를 Docker-registry에 배포하여 본다.

1. Openssl

Registry가 원격지에 있는 경우, 클라이언트와 registry서버는 https 프로토콜을 사용하기 때문에 ssl 인증서를 발급받아야 합니다.

1-1. openssl 버전확인하기

openssl version

1-2. cert.d 폴더에 개인키 생성하기

mkdir certs && cd certs
sudo openssl genrsa -des3 -out server.key 2048
# 비밀번호 입력

1-3. 인증요청서 생성

openssl req -new -key server.key -out server.csr

Country Name (2 letter code) [XX]:KR

State or Province Name (full name) []:Seoul

Locality Name (eg, city) [Default City]:sindangdong

Organization Name (eg, company) [Default Company Ltd]:test

Organizational Unit Name (eg, section) []:TEST

Common Name (eg, your name or your server\'s hostname) []: IP입력

Email Address []:

1-4. 개인키에서 패스워드 제거

cp server.key server.key.origin
sudo openssl rsa -in server.key.origin -out server.key
rm server.key.origin

1-5. 인증서 생성하기

sudo openssl x509 -req -days 730 -in server.csr -signkey server.key -out server.crt

2. Docker-registry 환경 구성하기

Docker image를 이용해 Docker-registry 컨테이너를 실행시켜봅니다.

2-1. docker-registry 이미지 받아오기

docker pull registry

2-2. docker-registry 컨테이너 가동하기

docker run -d -p 5000:5000 -restart=always -name docker-registry \
	-v /home/{username}/certs:/certs \
	-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
	-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
registry

⚠️ 이미지 pull, push 시에 권한 에러가 발생한다면

안전한 방법은 아니여서 사용시 주의 해야함

sudo vi /etc/init.d/docker

DOCKER_OPTS=--insecure-registry {registry ip}:5000
sudo vi /etc/docker/daemon.json

{"insecure-registries":["{registry ip}:5000}"]}
sudo service docker restart

3. Pipeline Script 작성하기

pipeline {
    agent any
        stages {
            stage("Set Var"){
                steps{
                    script {
	                    // 이미지명
                        IMAGE_NAME = “node-server"
                        // repository ip:port
                        IMAGE_STORAGE = “127.0.0.1:5000"
                        // 서버접속 ssh credential id
                        SSH_CONNECTION_CREDENTIAL = “ssh-id"
                        // 서버계정 정보
                        SSH_CONNECTION = “test@127.0.0.1”
                    }
               }
            } // end of Set Var

/* Git 저장고에서 코드를 받아온다. */
            stage('Git clone'){
                steps{
                    git branch: '<git branch name>', credentialsId: '<git access id>', url: '<git repo url> '
                }
            } // end of Git clone stage


/* 위 단계에서 받은 코드들로 이미지 빌드 시작 */
            stage('Image build'){ 
                steps{
                   script {
                        image = docker.build("${IMAGE_NAME}")
                    }
                }
            } // end of Image build


/* 위 단계에서 생성한 이미지를 레포지토리에 푸시한다. */
            stage("Push Container Image"){ 
                steps{
                    script {
                        docker.withRegistry("https://${IMAGE_STORAGE}"){
                            image.push("${env.BUILD_NUMBER}")
                            image.push("latest")
                            image
                        }
                    }
                }
            } // end of Push Container Image

/* 서버에 SSH 로 접속해 이미지 Pull 및 컨테이너 재실행 */
            stage("SSH Server run"){
                steps {
                    sshagent (credentials: ['cicd-server-ssh']) {
	                     // 최신 컨테이너 삭제
						sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker rm -f ${IMAGE_NAME}'"
						// 최신 이미지 삭제
                        sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker rmi -f ${IMAGE_STORAGE}/${IMAGE_NAME}:latest'"
						// 최신 이미지 PULL
                        sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker pull ${IMAGE_STORAGE}/${IMAGE_NAME}:latest'"
						// 이미지 확인
                        sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker images'"
						// 최신 이미지 RUN
                        sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker run -d --name ${IMAGE_NAME} -p 3000:3000 ${IMAGE_STORAGE}/${IMAGE_NAME}:latest'"
						// 컨테이너 확인
                        sh "ssh -o StrictHostKeyChecking=no ${SSH_CONNECTION} 'docker ps'"
                    }
               }
            } // end of SSH Server run
        }
}
profile
맘대로 생각해서 만든거라 안맞는 정보가 많아요

0개의 댓글