이전 과정에서 EC2에 Jenkins를 설치했다. 하지만 MSA 구조를 갖는 프로젝트를 진행하고 마이크로 서비스, MySQL 등과 같은 서버들을 Docker를 통해 컨테이너화 시킬 예정이 있어서 Docker를 통해 다시 Jenkins를 설치해보려고 한다.
또한, 젠킨스를 실행하기 위한 포트 설정, 방화벽 설정 등과 같은 추가 설정이 복잡하기 때문에 이러한 환경 설정 과정없이 젠킨스를 설치하고 서버에 띄울 수 있도록 한다.
docker 공식 문서
이전에 Jenkins 설치했던 과정과 비슷하게 진행된다.
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc```
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update```
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world
도커 설치가 완료되었으면 이제 도커를 통해 Jenkins를 설치해보자
Jenkins 이미지 다운로드
docker pull jenkins/jenkins:lts
lts 버전이란, long term support의 약어로 가장 오랫동안 지원된 버전을 의미 -> 시스템의 안정성 유지 가능
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/images/create?fromImage=jenkins%2Fjenkins&tag=lts": dial unix /var/run/docker.sock: connect: permission denied
해당 에러 발생
현재 Docker 그룹에 내가 속해있지 않아서 발생한 문제
- Docker 그룹에 나를 추가
sudo usermod -aG docker $USER
- 변경 사항 적용
newgrp docker
- 권한 문제가 해결되었는지 확인
docker info
- 에러가 발생하지 않으면 정상적으로 해결
Jenkins 컨테이너 띄우기
sudo docker run -d -p 8080:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts
컨테이너 확인
docker ps
보다시피 Docker를 통해서 image를 다운받고 컨테이너로 만드는 과정에서 명령어들을 입력하는 과정이 번거롭고 앞으로 이 컨테이너를 계속해서 띄울 때마다 이 과정을 반복하는 과정은 더 번거롭습니다.
때문에, 도커에서는 Docker-Compose 라는 기술을 지원합니다.
원래는 여러 컨테이너들의 실행을 한 번에 관리할 수 있는 도구지만, 하나의 컨테이너만 필요한 상황에서도 유용하게 사용할 수 있다.
docker-compose 설치
sudo apt install docker-compose
docker-compose.yml 파일 생성
```mkdir ~/my_project
cd ~/my_project```nano docker-compose.yml
version: '3'
services:
jenkins:
image: jenkins/jenkins:lts
ports:
- "8080:8080"
volumes:
- /jenkins:/var/jenkins_home
user: root
Ctrl + O를 눌러 파일을 저장합니다.
Enter 키를 눌러 파일 이름을 확인합니다.
Ctrl + X를 눌러 편집기를 종료합니다.
Docker Compose 실행
sudo docker-compose up -d
왜 -d 옵션을 사용할까?
sudo docker-compose up -d
- 백그라운드 실행: -d 옵션은 "detached" 모드로 실행하겠다는 의미입니다. 즉, Docker Compose가 컨테이너를 백그라운드에서 실행하고, 터미널을 즉시 사용할 수 있도록 반환합니다.
- 로그 출력 없음: 기본적으로 로그 출력이 터미널에 표시되지 않으며, 컨테이너가 실행 중인 상태로 돌아갑니다.
sudo docker-compose up
- 포그라운드 실행: 이 명령어는 컨테이너를 포그라운드에서 실행합니다. 즉, 터미널에서 컨테이너의 로그 출력이 실시간으로 표시되며, 해당 프로세스가 종료될 때까지 터미널을 사용할 수 없습니다.
- 로그 출력: 컨테이너에서 발생하는 로그를 실시간으로 확인할 수 있습니다. 이를 통해 문제를 디버깅하거나 상태를 모니터링하는 데 유용합니다.
즉, 후자 방식을 사용하여 컨테이너가 실행된다면 컨테이너가 종료되거나 중지될때까지 터미널을 사용할 수 없게된다
Jenkins 컨테이너 확인
비밀번호 입력
sudo docker logs jenkins
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX <- 이 부분
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
Install suggested plugins 선택 & 요구되는 정보 입력
마지막으로 Jenkins 관리 -> Script Console 에서 타임존 설정하기
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Seoul')
Docker를 통한 Jenkins 설치가 완료되었기 때문에 Jenkins와 테스트 프로젝트를 갖고 Jenkins의 웹훅을 사용한 CI/CD를 구축해보자.