DevOps

CI/CD 파이프라인 구축하기 - 3.2 (Docker 컨테이너 자동 빌드 및 자동 배포)

우잉~ 2024. 12. 13. 23:06

아래 포스팅에서 이어집니다!

https://wooinge.tistory.com/141

 

CI/CD 파이프라인 구축하기 - 3.1 (Docker 설정 및 Jenkins SSH server 설정하기)

CI/CD 파이프라인 구축하기 - 2에서 이어집니다!https://wooinge.tistory.com/139 CI/CD 파이프라인 구축하기 - 2 (Tomcat)CI/CD 파이프라인 구축하기 - 1에서 이어집니다!https://wooinge.tistory.com/93 CI/CD 파이프라인

wooinge.tistory.com

 


 


 

 

현재 젠킨스 서버에서 Publish Open SSH 플러그인을 설치까지만 한 상태다.

이제는 빌드와 배포 모두 자동화하는 작업을 진행해보겠다.

 

 

[목표]

  • GitHub 코드를 가져올 Jenkins 프로젝트(Job) 생성하기
  • Tomcat 자동 배포 프로세스를 위한 Dockerfile 수정하기
  • 빌드 후 도커 컨테이너 자동 배포

 

1. 빌드 위한 새 Jenkins 프로젝트 생성하기

이전에 만들어둔 자동 빌드/배포 프로젝트를 복사하여 새 프로젝트를 생성한다.

 

 

이제 Docker에 빌드하기 위해서 저번 포스팅에서 설치한 플러그인을 활용할 것이다.

빌드 후 조치 추가를 누르면 Send Build artifacts over SSH를 선택한다.

Send build artifacts over SSH 선택

 

war 파일을 복사할 위치를 정해주면 되는데, 일단 테스트용으로 /home/dockeradmin 디렉토리에 복제하는 설정으로 입력해준다.

  • Source files: webapp/target/*.war
  • Remove prefix: webapp/target
  • Remote directory: /home/dockeradmin(테스트용)

webapp.war 파일을 복제할 디렉토리 설정

 

자동 빌드

복제하기로 했던 /home/dockeradmin에 진입하면 webapp.war가 생성된 것을 확인할 수 있다.

복제된 webapp.war
테스트 디렉토리 삭제

 

+++ Remote directory를 공란으로 두면 /root 디렉토리에 복제된다!

 

 

webapp.war를 docker container로 옮기고 싶은데, 수동으로도 물론 옮길 수 있다.

하지만 배포를 일일이 수동으로 하기 싫다!~~~~~~~~~

 

2. 자동 배포를 위한 Dockerfile 수정하기

 

루트 계정으로 와서 /opt 디렉토리에 docker 디렉토리를 생성한다.

docker 디렉토리 생성

 

현재 docker 디렉토리의 권한은 모두 root로 되어 있는데, 이제 도커 컨테이너를 관리하는 관리자 계정인 dockeradmin 계정에게 권한을 줄 것이다.

chown 명령어를 사용하여 권한을 준다.

docker 디렉토리 dockeradmin으로 변경

 

이제 도커 컨테이너를 실행하기 위한 준비가 완료되었다.

이제 이미지를 생성하여 컨테이너만 실행하면 된다.

도커 컨테이너 실행을 위한 이미지 생성 파일인 Dockerfile을 /opt/docker 디렉토리로 옮긴다. 

그리고 Dockerfile 수정할 수 있는 계정을 dockeradmin으로 변경한다.

 

/opt/docker 디렉토리로 Dockerfile 이동
dockeradmin에게 권한 주기

 

이제 webapp.war 파일을 컨테이너 생성 폴더 경로로 수정해준다.

경로를 명확히 구분하기 위해 슬래시를 2번 입력해준다~~

 

 

저장 후 빌드하게 되면 /opt/docker 디렉토리에 webapp.war가 생성된 것을 확인할 수 있다.

 

이제 Dockerfile을 수정하여 tomcat 실행을 위한 디렉토리인 /usr/local/tomcat/webapps로 복사한다.

Dockerfile 수정

 

이미지 빌드 후 컨테이너를 실행한다.

포트는 8086으로 지정하였다.

성공적인 컨테이너 실행

 

이제 톰캣 IP:8086/webapp에 성공적으로 접근할 수 있게 되었다.

 

하지만,,, 컨테이너 생성은 아직까지 수동으로 진행 중이다.

이미지를 생성하고 컨테이너를 자동으로 실행하고 싶다~!~~!~!!!!!!!!!!!

 

3. 자동 빌드 후 도커 컨테이너 자동 생성하기

복사할 위치를 정하는 항목들을 보면 맨 아래에 Exec command라는 부분이 있다.

이건 webapp.war을 복사가 완료된 뒤 실행할 명령어를 적을 수 있는 항목이다.

여러 명령어를 실행하기 위해서는 마지막에 세미콜론(;)을 입력하여 다음 줄에 입력할 수 있다.

현재 8086 포트를 사용 중이기 때문에 8087로 지정해주었다.

cd /opt/docker;
docker build -t regapp:v1 .;
docker run -d --name registerapp -p 8087:8080:v1

 

 

실행할 명령어 작성

 

원활한 실습을 위해 현재 존재하는 컨테이너와 이미지를 모두 삭제하겠다.

컨테이너 중지
컨테이너 삭제
컨테이너 삭제 확인
이미지 모두 삭제 및 확인

 

젠킨스 서버에서 수동으로 빌드 버튼을 눌러서 제대로 이미지와 컨테이너가 생성되는지 확인해본다.

빌드가 완료되면 docker ps -a 명령을 이용하여 현재 실행 중인 컨테이너가 있는지 확인해본다.

그리고 webapp.war 파일도 잘 복사가 되었는지, 이미지도 잘 생성되었는지 확인한다.

현재 실행 중인 컨테이너 목록
생성된 webapp.war 파일 및 regapp 이미지 확인

 

컨테이너가 정상적으로 작동되는 것을 확인했으니 8087번 포트로 접속해본다.

성공적으로 접속되었다.

 

이제 코드를 살짝 수정하고 github에 코드를 업로드하면

scm poll 스케줄로 인해 1분마다 코드 변경 사항을 확인하고 자동으로 빌드를 진행할 것이다.

빌드가 자동으로 되긴 했는데, 중간에 하다가 멈춘 것을 확인할 수 있다...

 

빌드가 되다 만 모습

 

webapp.war 파일이 정상적으로 생겼는지 바로 확인해보았다.

현재 시간과 webapp.war가 생성된 시각을 비교해보니 첫 빌드에 생성된 webapp.war인 것을 알 수 있었다.

자동 빌드 실패

 

 

복제가 실패한 이유는 젠킨스에서 명령어를 실행할 때 똑같은 이름을 가진 컨테이너를 또 실행하려고 했기 때문이다!

같은 이름을 가진 컨테이너를 또 생성할 수는 없다.

 

 

이 문제를 어떻게 해결해야 할까??

 

 

4. 도커 컨테이너 자동 배포 문제 해결

같은 컨테이너 이름을 가진 컨테이너를 또 생성하면서 빌드가 제대로 되지 않는 문제가 있었다.

이 문제를 해결하는 간단한 방법이 존재하는데, 컨테이너를 중지한 뒤 삭제하고 다시 실행하면 문제 없이 컨테이너를 만들 수 있다.

기존에 있던 커맨드는 이미지 빌드, 컨테이너 실행 뿐이었다. 이 사이에 컨테이너를 중지하고 삭제하는 명령어를 추가해준다.

컨테이너 중지 및 삭제 명령어라인 추가

 

 

저장 후 수동으로 빌드를 시작하면 성공적으로 webapp.war 파일과 이미지가 생성된 것을 확인할 수 있고

이미지 목록을 확인하면 기존에 있던 이미지는 <none>으로 표기되는 것을 확인할 수 있다.

실행 중인 컨테이너 목록도 확인해보면, 새로 생긴 이미지를 기반으로 한 컨테이너가 실행 중인 것도 확인할 수 있다.

 

 

톰캣 브라우저에 다시 접속하면 변경한 코드가 적용된 것을 볼 수 있다.

코드 변경 사항 적용

 

 

이제 코드 변경 사항을 알아서 파악하고 변경해주는지 확인하고 마무리할 것이다.

코드의 일부분을 변경하고 깃허브에 업로드하게 되면 자동으로 빌드가 되는 것을 확인할 수 있다.

변경된 코드가 적용된 것도 브라우저에서 바로 확인할 수 있다~!

성공적인 빌드 확인
브라우저 변경 사항 확인

 

 

다음 포스팅은 Exec command에 작성한 내용을 Ansible을 연동하여 파이프라인을 구축할 것이다~!