Docker-registry 를 이용하여 안전한 사설 이미지 저장소를 구축하고 파이프라인을 통해 빌드된 이미지를 Docker-registry에 배포하여 본다.
Registry가 원격지에 있는 경우, 클라이언트와 registry서버는 https 프로토콜을 사용하기 때문에 ssl 인증서를 발급받아야 합니다.
openssl version
mkdir certs && cd certs
sudo openssl genrsa -des3 -out server.key 2048
# 비밀번호 입력
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 []:
cp server.key server.key.origin
sudo openssl rsa -in server.key.origin -out server.key
rm server.key.origin
sudo openssl x509 -req -days 730 -in server.csr -signkey server.key -out server.crt
Docker image를 이용해 Docker-registry 컨테이너를 실행시켜봅니다.
docker pull 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
안전한 방법은 아니여서 사용시 주의 해야함
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
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
}
}