본문 바로가기
Web Development/MicroService Architecture

[MSA / Jenkins / Docker] Window Server OS에서 Jenkins 빌드/배포 자동화 구축(feat. Docker Toolbox, VirtualBox, CI/CD)

by 감자맹고우 2023. 5. 4.
728x90
반응형

▼ 이전 글에서, Window Server OS에서 Docker와 VirtualBox를 같이 사용할 수 있도록 Docker Toolbox와 Jenkins를 설치했다.

 

[MSA / Jenkins / Docker] Window Server OS에서 Jenkins 설치 (feat. Docker Toolbox, VirtualBox)

▼ 이전 글에서는, Window 환경에서 Docker Desktop을 활용하여 Jenkins를 설치하고 빌드/배포 자동화를 구축하였다. [MSA / Jenkins / Gitea] Webhook 이벤트 감지와 Jenkins 파이프라인을 통한 빌드/배포 자동화

devlifetestcase.tistory.com

 

설치를 진행하였으니, 이제 Jenkins를 사용해볼 차례다.

우선, 진행과정은 이전에 다루었던 글과 동일하다. 그래서 이전 글을 참고하여 진행하되, 환경이 달라서 막히는 부분만 이 글에서 다루려고 한다.

 

▼ 아래는 이전 CI/CD 구축 글이다.

 

[MSA / Jenkins / Gitea] Webhook 이벤트 감지와 Jenkins 파이프라인을 통한 빌드/배포 자동화 방법 A to Z(feat

MSA 프로젝트를 진행하며, 코드를 수정하고 반영할 때마다 각각의 서비스를 수동적으로 다시 빌드하고 컨테이너로 올려야 하는 문제를 해결하기 위해, 빌드/배포를 자동화하도록 Jenkins를 도입하

devlifetestcase.tistory.com

 

우선, Window Server 에서 Jenkins 설치를 완료하였다.

그리고, 포트포워딩을 통해서 서버에서 localhost:7088(또는 외부에서 {서버IP}:{젠킨스 포트})로 접속하여 초기 설정도 진행해준 상태다.

설치가 완료되었기 때문에, 이제 위 글에 따라 Plugin 설치부터 그대로 이어서 진행하면 된다.

파이프라인 스크립트도 기존과 동일하게 작성하면 되고, 토큰 생성, 웹훅까지 모두 진행에 막힘이 없다.

 

그런데...

 

Jenkins 컨테이너 내부를 설정할 때는 첫 시작부터 문제가 발생할 것이다.

처음 작업이 docker mount 여부를 확인하는 것인데, 이를 위해 Docker Quickstart Terminal에 아래의 명령어를 통해 Jenkins 컨테이너의 bash로 접속하게 된다.

docker exec -itu 0 jenkins-server bash

 

bash에 root로 잘 접속이 될 것이다.

그럼 이제 docker images와 같은 docker 명령어를 실행해보자.

docker: command not found

아마 위의 에러를 만나게 될 것이다.

 

 

[ 생각의 흐름 ]

 

일단 jenkins 컨테이너에서 docker 명령어를 실행할 수 없다는 의미이므로, 원인을 생각해보면 jenkins 컨테이너를 실행할 때 호스트의 docker를 마운트하도록 옵션을 지정했었는데 마운트가 제대로 되지 않았기 때문일 것 같다.

 

왜 그럴까? 개발자의 로컬에서는 마운트가 잘 되었는데, 서버와의 차이점은 무엇일까?

그 차이는 바로, 서버에서는 VM을 통해 Docker를 실행시키고 있다는 것이다. 개발자의 로컬에서는 호스트에 Docker가 위치했는데, 서버에서는 VM에 Docker가 위치한다.

그렇다면 Jenkins 컨테이너는 호스트가 아닌 VM의 Docker를 마운트해야한다는 뜻이다. 그렇다면 VM의 Docker를 어떻게 마운트해야하지? 마운트 경로를 어떻게 설정해야할지 막막하다.

그래서 ChatGPT의 도움을 얻어 이것저것 경로를 다르게 해보았지만, 해결되지 않았다.

 

그러다 갑자기, ChatGPT의 답변 중 공유 폴더에 대한 언급과 호스트와 마운트한다는 내용이 생각나 그 내용에 초점을 맞추어보았다.

만약 VM의 Docker가 호스트와 마운트된다면, 호스트를 통해 Jenkins 컨테이너도 연결되지 않을까?

그 생각으로 우선 VM과 호스트를 마운트하려 했다. 그래서 서버에서 cmd창을 열고 docker images를 쳐보니 이게 웬걸? VM과 호스트는 이미 마운트되어 있었다!

 

그럼 왜 호스트와 Jenkins 컨테이너는 연결되지 못하는거지???

 

반응형

 

[ 해결 방법 ]

 

가정을 해보았다.

VM의 Docker가 호스트에 마운트되었던 것처럼, 사실 Docker는 Jenkins 컨테이너에 마운트되었다.

그러나 명령어를 사용할 수 없었던 것 뿐이다. 왜?

Docker와는 다르게 Docker CLI가 Jenkins 컨테이너에서 제대로 동작하지 못하고 있기 때문이다.

그래서 Docker 자체는 공유되고 있다는 전제하에 명령어를 사용할 수 있게 Docker CLI만 Jenkins 컨테이너에 설치해보기로 했다.

 

아래는 Docker CLI와 Docker/Docker CLI를 실행하기 위한 필수 패키지를 설치하는 명령어이다.

apt-get update && apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update && apt-get install -y docker-ce-cli

 

이렇게 진행하고 jenkins 컨테이너 bash에서 docker images를 입력해보면!

이럴수가! 제대로 동작하는 것을 확인할 수 있다. 가정이 맞았던 것이다.

이 이유를 ChatGPT에서는 아래와 같이 잘 설명해주니 참고하면 된다.

 

Docker Toolbox를 사용하면 Windows 운영 체제에서 Docker를 실행하기 위해 VirtualBox를 사용하여 Linux 기반의 가상 머신을 생성합니다. 이 가상 머신 안에서 Docker 데몬이 실행되며, 호스트 머신에서 Docker CLI를 사용하여 가상 머신 안의 Docker 데몬과 통신할 수 있습니다.

호스트 머신과 가상 머신 간에 공유 디렉터리를 설정하여 호스트 머신의 파일 시스템에서 가상 머신의 파일 시스템에 접근할 수 있습니다. 하지만 이는 파일 시스템에 대한 접근 권한을 제공할 뿐, 호스트 머신의 Docker CLI를 가상 머신 안의 Docker 데몬과 연결해 주지는 않습니다.

따라서 Jenkins-server 컨테이너에서 Docker CLI를 실행하려면 컨테이너 안에서 Docker CLI를 설치해야 합니다. 이를 통해 컨테이너 안에서 Docker 데몬과 통신할 수 있게 됩니다. Docker CLI를 설치한 경우, 컨테이너 안에서 실행하는 docker 명령어는 호스트 머신의 Docker 데몬이 아닌, 가상 머신 안의 Docker 데몬과 통신하여 실행됩니다.

 

한편, 이제 jenkins 컨테이너의 bash에서 docker를 사용할 수 있게 되었다.

그 말인 즉슨, 나머지 과정은 동일하게 진행하면 된다는 것이다!

 

=============================================================

[ Error 목록 ]

 

1. Cannot find /tomcat/bin/setclasspath.sh. This file is needed to run this program.

이 에러는 openjdk가 아닌 tomcat 도커 이미지로 생성한 서비스를 컨테이너로 올릴 때 발생했다. WAR로 패키징된 프로젝트를 톰캣으로 외부에서 읽도록 하려다보니 해당 문제가 발생하였다. 원인은 다양한데 찾아본 결과, 내 경우에는 권한 문제같은 것이 발생하는 모양이다.

 

이를 해결하기 위해 아래와 같이 jenkins pipeline script 내용 중, docker run으로 컨테이너를 올리는 부분에 --privileged 옵션을 부여하여 해결해주었다.

 

stage('Deploy Image') {
  steps {
    sh "sudo docker run -d --privileged --name ${IMAGE_NAME} --network test-network -p 1111:1111 ${DOCKER_REGISTRY}/${IMAGE_NAME}"
  }
}

 

이렇게 하면 Window Server OS에서도 Jenkins 빌드/배포 자동화를 구축할 수 있다!

 

 

🤞 도움이 되셨기를 바랍니다. 한 번의 클릭과 댓글은 어딘가의 누군가에게 진실로 큰 힘이 됩니다. 🐱‍🏍

 

728x90
반응형

댓글