Destination Folder : Jenkins Project들을 설치할 위치
Service Logon Credentials : 만약 Server에 Jenkins를 설치하여 활용할 경우 서버에 대한 접속 정보 입력
Port : 사용할 Port 번호
Select Java home directory : jdk나 jre가 설치된 경로를 입력해줘야 한다.
Custom Setup : 방화벽이나 서비스, 사용할 드라이브 등에 대한 설정을 할 수 있다.
이때 8088은 우리가 위에서 지정했던 Port Number를 의미한다.
만약 2번 과정에서 Port를 50000으로 설정했다면 localhost:50000으로 접속하면 된다.
Jenkins를 처음 설치할 경우 localhost:8088에 접속한다면 아래와 같은 창이 뜰 것이다.
위 사진에서 빨간색 Box안에 "initialAdminPassword"라는 파일의 경로가 입력되어 있다.
해당 파일을 메모장으로 열어 입력되어 있는 문자열을 복사한 이후 password 입력 칸에 붙여 넣어주면 된다.
Jenkins에 사용할 Plugin들을 설치하는 단계이다.
오른쪽 "Select plugins to install"을 통해 원하는 Plugin을 선택하여 설치할 수도 있지만, 웬만하면 왼쪽 "Install suggested pluings"를 클릭해 Jenkins 측에서 추천하는 Plugin들을 모두 설치하는 것을 추천한다.
생각보다 중요한 단계이다.
Plugin 설치 및 initialPassword 입력은 Jenkins 설치 후 한 번만 입력하면 된다.
그렇다면 한 번 설치한 이후에는 어떻게 Jenkins에 설치하게 될까?
바로 이번 단계에서 설정하는 계정 명 및 암호를 통해 로그인함으로써 Jenkins 서비스를 이용할 수 있다.
즉, Jenkins를 사용하기 위한 회원가입 단계라고 생각하면 된다.
Jenkins 접속을 위한 URL을 입력하는 과정이다. 입력했던 URL을 통해 접속하면 자동으로 localhost:8088, 즉 Jenkins 서버로 연결시켜준다.
문제는 Jenkins 서버로 설정했던 URL이 이미 사용 중인 경우에는 사용 중이던 URL Site에 우선권이 있어서 만약 이름이 겹칠 경우 Jenkins 서버에 접속하지 못할 가능성이 생긴다.
따라서 서버에 Jenkins를 설치하고 같이 활용하는 것이 아닌 로컬에서만 Jenkins를 사용할 경우 그대로 localhost:8088로 설정하는 것을 추천한다.
Docker Desktop을 실행시키면 위 사진과 같은 에러 창이 뜰 수도 있다. 안 뜨는 경우 이번 단계는 넘어가면 된다.
이 에러는 WSL 2라는 패키지가 로컬 환경에 설치가 되어 있지 않은 상황일 경우 발생한다. 따라서 이 패키지를 설치해줘야 할 필요가 있다.
WSL 2라는 추가적인 패키지가 필요한 이유는 Docker가 Linux Kernel Base로 운영되고 있는 가상화 시스템이기 때문에 Windows에서는 바로 활용이 불가능하다. 따라서 WSL 2라는 리눅스 커널을 위한 패키지를 따로 설치하는 것이다.
설치 방법은 위 사진에서 파란색으로 명시되어 있는 https://aka.ms/wsl2kernel 사이트로 접속한 뒤 아래 사진에서 빨간색 버튼 안에 있는 링크를 클릭해 패키지를 다운로드하여 실행시키면 끝이다.
이후 컴퓨터를 재시작시킨 뒤 다시 Docker Desktop을 실행시키면 정상 동작이 가능하다.
docker image ls(= docker images)
docker container ls(= docker ps)
docker network ls
Docker에서는 3가지 Network(bridge, host, none)가 지원이 되는데 이 중 bridge Network를 활용할 것이다
만약 3가지 명령어가 Output을 잘 출력한다면 Docker Desktop의 Setting은 완료된 것이다.
Docker Hub에서 회원 가입하는 것이 현재 필수적인 단계는 아니다.
하지만 프로젝트를 진행하면서 Docker Hub에 많은 Container Image를 저장하게 될 것이며 이 과정에서 Docker Hub에 대한 ID와 Password가 존재해야 하므로 이왕 Docker Hub에 접속했으니 회원가입까지 한 번에 처리하는 것을 추천한다.
위 사진은 Jenkins Docker Image를 나타낸 것이다.
Docker Container Image의 이름은 {Image를 배포한 사람이나 팀}/{배포한 Image 이름}으로 구성되어 있다.
예를 들어 내가 Lostark라는 Container Image를 Docker Hub에 배포할 경우 해당 Image는 violetto/Lostark라는 이름을 가지게 될 것이다.
아래 명령어들은 https://github.com/jenkinsci/docker 사이트에 자세히 나와 있다.
위 사이트는 Jenkins Container Image에 대한 정보를 저장한 깃허브 사이트로써 README.md에 Jenkins Image의 사용법에 대해서도 나와 있다.
메서드에 대해 조금 더 자세히 알고 싶다면 위 사이트의 README.md를 직접 번역하면서 설치해보는 것을 권장한다.
docker pull jenkins/jenkins
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11
docker run jenkins/jenkins
: (jenkins/jenkins라는) Docker Image를 기반으로 Container를 생성하는 명령어
-p
: Publisher Option
--restart=on-failure
: Container 생성에 실패(fail)했을 경우 재시작시킴
--name
: 만들고자 하는 Container에 이름을 부여
-v
: Volume Option
docker ps
위에서 했던 Window 설치 과정과 똑같은 창이 나온다. 단지 위에서 Port를 8080, 50000으로 설정했기 때문에 localhost:8080으로 접속한 것이다. 그런데 initialAdminPassword의 경로가 조금 이상하다.
Docker Desktop을 활용하면 Docker Desktop이 실행되는 Linux 상에 initialAdminPassword가 저장되야하므로 Docker Container에 접속하여 위 경로로 접근해야 한다.
Containers에 들어가면 우리가 만든 Container가 실행되고 있음을 볼 수 있다.
해당 Container를 클릭하면 된다. 우리는 여기서 3가지 방법으로 Password를 찾을 수 있다.
노란색 부분이 Password이다.
우측 상단의 CLI를 클릭하면 Docker Container를 CLI를 통해 제어할 수 있다. 여기에서 "/var/jenkins_home/secrets" 디렉터리로 들어가 initialAdminPassword 파일 내용을 직접 확인함으로써 Password를 볼 할 수 있다.
Linux를 배웠다면 아마 쉽게 접근 가능하겠지만 혹시 모르니 필요한 Command를 순서대로 입력해놓겠다.
cd /var/jenkins_home/secrets
cat initialAdminPassword
터널링이란 한 네트워크를 다른 네트워크의 접속을 거쳐 데이터를 송신할 수 있게 하는 기술을 의미한다.
이는 CS 지식을 공부할 때 자세히 다루기로 하고, 일단 지금은 Docker Desktop의 CLI 창을 Windows의 CMD 창에서 볼 수 있게 하는 과정이라고 생각하면 된다.
(Docker Desktop의 네트워크에 Windows Network의 접속을 거쳐 데이터를 처리할 수 있게 만듦)
방법은 아래 명령어들을 cmd 창에 순서대로 입력하면 된다
docker container exec -it jenkins-server bash
cd /var/jenkins_home/secrets
cat initialAdminPassword
위 사진에서 볼 수 있는 것처럼 터널링을 통해 Container에 접속하면 jenkins@~로 주소가 바뀌는 것을 볼 수 있다.
사실 ~ 부분을 삭제하지 않아도 괜찮을 것 같긴 하지만 혹시 모르니 지워놨다.
Windows 설치 방법과 동일하다
위에서 우린 docker run -p 8080:8080 jenkins/jenkins:lts-jdk11
명령어를 통해 외부에서 8080 Port Number를 통해 Container에 접근할 수 있도록 만들었다.
하지만 알다시피 8080 Port Number는 웹 개발에서 가장 많이 활용되는 사실상 Default Port Number이다.
따라서 우리는 Jenkins에 8088 같은 다른 Port Number를 줘서 조금 더 편하게 Web Application을 실행시키고 싶었고, Windows에서 Jenkins를 설치할 때는 이를 GUI 과정에서 지원해주었다.
그렇다면 Docker Desktop을 활용할 때는 외부에서 접근하는 Port Number를 어떻게 수정해줄 수 있을까?
필자는 1차원적으로 docker run -p 8088:8088 jenkins/~
로 명령어를 입력하였다. 그리고 실패하였다. 왜일까?
-p Option의 인자에 대해 다시 한번 생각해보자. -p Option은 {Container 외부에서 접근하는 Port}:{Container 내부 Port} 쌍으로 되어 있다.
우리는 localhost:8088, 즉 8088 Port Number로 Container 내부 서비스에 접근하고 싶기 때문에 8088:X까지는 맞다.
문제는 Jenkins Container에서는 서비스를 8080 Port Number를 통해 전달해준다는 것이다.
-p 8080:8080 Option에서 볼 수 있듯이 Jenkins는 Container 내부에서 8080 Port Number를 통해 서비스를 제공한다. 즉, 우리가 Docker Container에 직접 접속하여 내부 Port Number를 변경해주지 않을 경우 여전히 Container는 8080 Port Number를 통해 외부 User에게 서비스를 제공한다.
결국 우리는 "외부 8088 Port Number"를 통해 "내부 Container의 8080 Port Number"에서 제공하는 서비스를 활용하고 싶은 것이고 아래와 같이 적어야 할 것이다.
docker run -p 8088:8080 jenkins/jenkins:lts-jdk11
Docker Container를 실행시키다 보면 가끔 The container name ~ is already in use
라는 에러가 발생할 때가 있다.
그런데 위 사진처럼 "docker ps" 명령어를 통해 Container를 찾아보면 해당 이름을 가진 Container가 존재하지 않는다.
에러를 처리하기 이전 왜 이런 상황이 발생하는지부터 알아보자.
이유는 생각보다 심플한데, 바로 docker ps라는 명령어가 현재 실행 중인 Container들만 결과창에 띄워주기 때문이다.
즉, 에러로 인해 Container 실행이 중지되었든 User가 직접 Container 실행을 중지시켰든 현재 동작하지는 않지만 메모리 상에는 남아 있는 Container와 실행시키고 싶은 Container 이름이 겹쳤을 경우 이런 문제가 발생하는 것이다
이런 문제를 해결하기 위해선 아래에 기입한 3개 명령어를 순서대로 입력하면 된다.
docker ps -a
docker stop <Container 이름>
docker rm <Container 이름>
이후 다시 Container 실행 명령어를 입력하면 정상 수행되는 것을 확인할 수 있다.
제어판을 통해 Jenkins를 삭제한 이후 다시 설치하면 위에서 설명했던 Plugin 설치, Admin 계정 설정에 대한 과정 없이 바로 Admin 계정 로그인 창이 뜸을 알 수 있다.
하지만 처음에 설치했던 Plugin을 변경하거나 Admin 계정을 아예 바꾸고 싶은 경우 Jenkins를 깨끗하게 삭제한 이후 위에서 설명했던 방법 그대로 재설치를 수행하고 싶을 수 있다.
Jenkins를 깨끗하게 삭제하는 방법은 아래와 같다.
이렇게 삭제하면 Jenkins와 같이 설치된 Plugin 및 Admin 계정에 대한 설정도 같이 삭제되어 깨끗하게 Jenkins를 삭제할 수 있다. 이후 Jenkins를 다시 설치할 때는 위에서 설명한 모든 과정을 거치게 된다.
듣고 있는 "Jenkins를 이용한 CI/CD Pipeline 구축" 인프런 강의는 Docker Desktop에 Jenkins를 설치하였으나 필자는 Windows를 활용해보려 한다.
개인적으로 Docker Desktop 환경보다 Windows 환경에서 개발을 진행하고 CI/CD를 적용시키는 경우가 많지 않을까라고 생각했기 때문인데, 만약 강의를 듣다 Docker Desktop의 유용성에 대해 느낄 경우 Docker Desktop에서 활용하는 방식으로 넘어갈 수도 있을 것 같다.