도커와 젠킨스로 스프링부트+그래들 프로젝트 배포(2/4) - 젠킨스 설치
이 게시글은 도커와 젠킨스로 스프링부트+그래들 프로젝트 배포의 두번째 글입니다
이번엔 첫번째 글에서 설치한 도커를 활용해서 젠킨스를 컨테이너에 실행시켜보겠습니다.
최종적으로는 젠킨스 컨테이너에서 DooD(Docker-Outside-Of-Docker)방식으로
스프링부트+그래들 프로젝트의 깃허브 레파지토리에 webhook을 설정해서
push가 발생하면 자동으로 젠킨스에서 빌드 후 배포까지 하는것이 목표입니다.
젠킨스를 컨테이너로 실행하기
제가 실습하는 환경입니다
서버 - AWS Lightsail
인스턴스 플랜 - $10 플랜 (메모리 : 2GB, 프로세스 : 1vCPU)
OS - Ubuntu 20.04 LTS (20년4월에 나온 Long Term Support할 예정인 버전)
터미널 클라이언트 - mobaXterm (putty같은 소프트웨어. 본인이 편한걸 사용하시면 됩니다. 큰 의미 없습니다)
패키지 관리자 - apt (콘솔or터미널에서 패키시 설치할때 사용하는 패키지 관리 도구)
도커 - Docker Community Edition 23.0.1
※참고 : 젠킨스를 사용하면서 메모리 사용량을 조회해 보니 컨테이너 실행만으로 600MB의 메모리를 사용하고 빌드 시 1GB 가까이 메모리를 사용합니다. 저는 아주 간단한 프로젝트를 빌드 했지만 프로젝트의 규모가 커질수록 메모리 사용량은 늘어날 것으로 보입니다. 이 점 서버 구성할 때 참고하세요! (AWS에서 프리 티어 플랜을 사용할 경우 작동이 원활하지 않을 수 있습니다.)
[더 좋은 방법이 있거나 의문, 수정사항 언제든 댓글 달아주세요.]
부가적인 설명에 대해서는 접은글로 적어두겠습니다 필요에따라 [더보기]를 눌러 확인해보세요.
1.도커 허브에서 젠킨스 이미지 다운로드
docker pull jenkins/jenkins:lts
도커 허브 계정이 없어도 이미지가 다운로드 됩니다.
2. 다운로드된 이미지 조회
docker images
3. 젠킨스 이미지를 컨테이너로 실행
docker run -d -p 8081:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts
여기서 갑자기 옵션이 와르르 쏟아져서 당황스러울수있는데 하나씩 뜯어본다면
사용된 옵션은 -d, -p, -v, -u 입니다.
-d : 컨테이너를 백그라운드에서 실행하는 옵션입니다.
-p : 호스트의 포트와 컨테이너의 포트를 연결하는 옵션입니다. 사용법) -p [호스트 포트번호]:[컨테이너 포트번호]
-v : 호스트의 디렉토리와 컨테이너 디렉토리를 볼륨으로 매핑합니다. 쉽게 말해서 서로 지정된 디렉토리를 공유한다는 뜻입니다.
-u : 컨테이너의 실행 사용자를 지정합니다.
run : 이미지를 기반으로 컨테이너를 실행시킵니다. 위에서는 jenkins/jenkins:lts 이미지를 실행
-p 8081:8080 : 호스트서버의 8081포트와 컨테이너의 8080포트를 연결
-p 50000:50000 : 젠킨스 마스터 노드는 빌드 에이전트와 통신할 때 JNLP(Java Network Launch Protocol)을 사용. 기본적으로 50000번 포트. JNLP통신은 TCP/IP기반으로 이뤄지는데, 컨테이너는 기본적으로 격리된 환경에서 실행되기때문에 젠킨스 마스터 노드와 빌드 에이전트가 통신하려면 같은 컨테이너에 있더라도 호스트 서버를 통해 통신하게 된다. 통신관계를 간단하게 표현하면 (빌드에이전트 ↔ 호스트서버 ↔ 마스터노드)
-v /home/jenkins:/var/jenkins_home : 젠킨스 컨테이너의 설정을 호스트 서버와 공유함으로써, 컨테이너가 삭제되는 경우에도 설정을 유지할수 있게 해줍니다. 호스트의 /home/jenkins 디렉토리와, 컨테이너의 /var/jenkins_home 디렉토리를 연결합니다 (연결한다는 의미는 호스트의 /home/jenkins에 test.txt파일을 추가하면 컨테이너의 /var/jenkins_home경로에도 test.txt파일이 추가된다는 의미입니다. 반대로도 동일)
-v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock
젠킨스 컨테이너에서도 호스트 서버의 도커를 사용하기 위한 바인딩입니다.
이렇게 컨테이너 내부에서 호스트 서버의 도커를 사용하는 방식을 DooD(Docker out of Docker)라고합니다.
컨테이너 내부에 도커를 설치해서 사용하는 방식인 DinD(Docker in Docker)도 있습니다.
-u root : 호스트 서버의 디렉토리를 공유하기때문에 권한 문제가 있을수있어 root사용자로 실행
4. 컨테이너 실행 확인
docker ps
만약 docker ps 를 쳤는데 컨테이너 조회가 안된다면 docker ps -a 명령어를 실행해보면
정지되어있는 컨테이너도 조회가 됩니다. 거기서
docker logs [컨테이너ID]
를 실행해서 해당 컨테이너가 왜 실행이 안됐는지 조회할수있습니다.
5. AWS의 인바운드 규칙 추가
우리는 호스트 서버의 8081번 포트와 50000번 포트를 컨테이너와 연결했으니 두 개를 추가합니다.
만일 ec2를 사용한다면 보안그룹에서 인바운드 규칙추가를 할 수 있습니다.
6. 젠킨스 접속
http://[서버IP 또는 도메인]:8081
게시글에서는 실습으로 포트를 8081로 설정했기 때문에 8081로 접근합니다.
본인이 다른 포트로 설정했다면 해당 포트로 입력해서 접근해야 됩니다.
7. 젠킨스 로그인
#젠킨스 최초로그인 임시비밀번호 조회
docker logs [젠킨스 컨테이너ID]
화면에서 알려주는 경로로 접근해도 임시비밀번호를 조회할수있습니다.
그럴려면 컨테이너에 접속해서 해당 경로로 찾아가야되는 번거로움이 있으니
위의 방법으로 조회하는게 간단합니다.
8. 젠킨스 최초 설정
9. 계정생성
10. 경로설정
11. 젠킨스 설치 완료!