깃 브랜치 전략을 수정하게된 이유 작성
내가 담당한 notification 브랜치를 통해서 CI/CD를 구현하는 방식으로 진행
브랜치를 나눠서 작업하기에 해당 브랜치의 코드를 나눴기에 push가 발견되면 바로 진행할 수 있어짐
마이크로서비스를 담당하는 각 브랜치들 마다 각각의 Item을 만들어주고 Pipeline Script를 작성해서 적용시킬 계획
이전에 클론에 대한 내용만 작성한 pipeline을 Docker를 적용시켜 이미지화하고 컨테이너화 시켜서 배포까지 진행
Springboot 파일을 Build 시킨 jar 파일을 Docker Image로 만들 Docker file 작성
FROM eclipse-temurin:17-jdk
WORKDIR /app
COPY build/libs/notification-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8083
ENTRYPOINT ["java", "-jar", "app.jar"]
VOLUME ["/data"]
pipeline {
agent any
stages {
stage('Repository clone') {
steps {
sh 'pwd'
git branch: 'notification', credentialsId: 'qkrtprjs', url: 'https://lab.ssafy.com/s11-fintech-finance-sub1/S11P21A604.git'
}
post {
failure {
echo 'Repository clone failure !'
}
success {
echo 'Repository clone success !'
}
}
}
stage('Build image') {
steps {
// dir('[디렉토리명]) {
sh 'chmod +x ./gradlew'
sh './gradlew build'
sh 'pwd'
sh 'docker build -t qkrtprjs/notification .'
// }
echo 'Build image...'
}
post {
failure {
echo 'Build image failure !'
}
success {
echo 'Build image success !'
}
}
}
// stage('Remove Previous image') {
// steps {
// script {
// try {
// h 'docker stop [docker 이미지 이름]'
// sh 'docker rm [docker 이미지 이름]'
// } catch (e) {
// echo 'fail to stop and remove container'
// }
// }
// }
// post {
// failure {
// echo 'Remove Previous image failure !'
// }
// success {
// echo 'Remove Previous image success !'
// }
// }
// }
// stage('Run New image') {
// steps {
// sh 'docker run --name [docker hub 계정]/[docker 이미지 이름] -d -p [포트번호]:[포트번호] [docker hub 계정]/[docker 이미지 이름]'
// echo 'Run New member image'
// }
// post {
// failure {
// echo 'Run New image failure !'
// }
// success {
// echo 'Run New image success !'
// }
// }
// }
}
}
해당 코드를 통해서 이미지가 생성되는지를 확인
+ docker build -t qkrtprjs/notification .
/var/jenkins_home/workspace/notification@tmp/durable-6398b670/script.sh.copy: 1: docker: not found
도커를 빌드하는 과정에서 도커를 찾지 못한 에러 발생
원인 : 도커를 통해서 Jenkins를 실행시켰기에 EC2에 있는 Docker에 대한 권한은 Jenkins가 갖지 못함
위 문제를 해결하기 위해 도커안에서 도커를 사용할 수 있는 방식은 크게 두가지가 존재한다.
- Docker in Docker(DinD)
컨테이너 내부에서 도커 컨테이너를 생성하는 방법
- 하지만 이 방법은 두 개의 Docker 데몬을 실행하게 되며, 이로 인해 성능 저하가 발생하고 호스트와 컨테이너 간의 보안 경계가 약해질 수 이어서 보안적인 측면으로 권장되지 않는다고 한다.
- Docker out of Docker(DooD)
컨테이너 내부에서 Docker 데몬에 접근(도커 소켓을 사용해서)하여 Docker 명령어를 실행할 수 있도록 함
도커소켓이란, Docker 데몬과 클라이언트 간의 통신을 담당합니다. Docker 클라이언트(예: Jenkins)는 이 소켓을 통해 Docker 데몬에 명령을 전달하고, Docker 데몬은 컨테이너를 관리하는 역할을 합니다.
시도 1 : DooD 선택
docker-compose.yml 수정
version: '3'
services:
jenkins:
image: jenkins/jenkins:lts
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/home/ubuntu/jenkins-data:/var/jenkins_home"
user: "root"
tty: true
restart: always
실행시킨 후에 docker exec -it <컨테이너_ID> /bin/bash
명령어로 jenkins 컨테이너에 접속해서 docker ps
로 명령어를 사용했지만 여전히 docker not found 발생
시도 2 : Docker CLI 설치
# jenkins container 접속
docker exec -it jenkins /bin/bash
# linux 버전 확인
cat /etc/issue
# Docker 설치
## - Setup Repo
apt-get update
apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
mkdir -p /etc/apt/keyrings
#linux 버전에 맞게 설치
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
## - Install Docker Engine
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# /jenkins-docker-install.sh
apt-get update
apt-get install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
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/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
해당 sh 파일을 작성하고
volumes:
- ./mount/jenkins:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- ./mount/jenkins-html:/var/lib/jenkins
- ./jenkins-docker-install.sh:/jenkins-docker-install.sh
볼륨 마운트 설정
docker-compose up -d
docker exec -it jenkins bin/bash
sh /jenkins-docker-install.sh
로 컨테이너안에서 해당 sh 문 실행해서 docker 명령어 인식가능
추가적인 자동화는 배포를 완료한 후에 따로 학습해보자