1. 서론
본 포스트는 Docker와 Jenkins를 이용한 Docker 배포 자동화를 구축하는 방법에 대한 내용을 다루고있다. 기본적으로 Ubuntu 기반의 환경을 기준으로 설정하고있음을 참고하길 바란다.
개발이 되는 중간중간에 배포가 필요할때 일일이 수작업으로 빌드하고 서버에 배포하는 반복과정을 여간 귀찮은 일이 아니다. 그래서 이러한 반복적인 빌드 및 배포과정을 편리하게 자동화할수 있는 CI/CD(Continuous Integration 지속적통합 / Continuous Deploy 지속적배포) 툴들이 많이 공개되어있다(역시 귀찮은거 못참는건 누구나 다 똑같다.)
그래서 이 Jenkins를 이용하여 Docker에 서비스를 빌드하고 배포하는 과정을 자동화해보려 한다. 그리고 Jenkins가 UI가 좀 바뀌었는데 아직 그 UI로 쓰여진 블로그 글이 아직 없는듯하여... 헤매실 분들에게 도움이 되었으면 한다.
2. Docker 설치
도커는 아래 명령어를 입력하면 설치할 수 있다. 명령어가 좀 길어서 그냥 shell script로 만들어서 실행시켜버리는걸 추천한다.
우분투 외에 다른환경은 Docker와 Docker-Compose 설치법을 찾아보길 바란다. 저 두개만 정상적으로 설치되면 된다.
$ sudo apt install ca-certificates curl gnupg lsb-release -y
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose docker-compose-plugin
아래 명령으로 Docker 버전이 출력된다면 정상적으로 설치가 완료된 것이다.
$ docker -v
혹시 위 명령을 입력했는데 권한 오류가 나온다면 아래 명령으로 사용자를 docker 그룹에 추가하여 sudo를 붙이지 않아도 실행할 수 있도록 설정한다.
$ sudo usermod -aG docker `whoami`
3. Jenkins 이미지 생성 및 실행
Docker 위에 Jenkins 이미지를 컨테이너를 띄우게 되면 Jenkins 이미지에는 Docker가 설치되어있지 않기 때문에 기본적으로 빌드시에 Docker 명령어를 이용할 수 없다. 그래서 Jenkins 이미지를 확장하여 Docker와 Docker-Compose를 설치한 이미지를 만든 뒤, 이 이미지를 이용해 Jenkins 컨테이너를 구동할 계획이다.
그래서 우선 Dockfile로 Docker와 Docker-Compose가 설치된 Jenkins 이미지를 만들어보자.
임의의 디렉토리를 만들고 해당 디렉토리의 최상단에 Dockerfile과 docker-compose.yml을 작성한다.
필자에 경우, 컨테이너8080포트는 호스트50000포트에 바인딩하고 컨테이너50000포트는 호스트50001포트에 바인딩했다.
Jenkins가 호스트의 Docker를 관리해야하기 때문에 호스트의 /var/run/docker.sock을 컨테이너에 볼륨으로 바인딩해주었다.
그리고 Jenkins 컨테이너의 /var/jenkins_home을 호스트의 디렉터리에 볼륨으로 바인딩하지 않으면, 컨테이너가 재시작 또는 삭제되었을 때 Jenkins의 데이터가 모두 날아가버리므로 주의해야한다.
위 두 파일을 만들었다면 아래 명령으로 이미지를 빌드하고 컨테이너를 실행하면 된다.
만약 AWS같은 서비스를 이용하여 서버를 구동중이라면 방화벽에서 사용할 포트를 열어주어야 정상적으로 접속이 가능하다.
$ mkdir -p ~/jenkins
$ sudo chmod 777 ~/jenkins
$ docker build --no-cache -t jenkins . && \
docker-compose up -d
컨테이너가 실행되면 아래 명령어를 실행하여 로그나 ~/jenkins/secrets/initialAdminPassword 파일 내용을 확인하자. 로그 안에 Jenkins의 관리자 비밀번호가 적혀있다. 이후에 Jenkins 접속 후에 필요하므로 메모장에 따로 적어두자.
$ docker logs jenkins <-- 명령 실행 후 로그 안에서 관리자초기비밀번호를 확인한다.
또는
$ cat ~/jenkins/secrets/initialAdminPassword <-- 출력되는 파일내용이 관리자초기비밀번호이다.
브라우저에 "{서버IP주소 또는 도메인}:50000"을 입력하고 접속하면 아래와 같은 페이지가 나타난다.
다음으로 넘어가려면 관리자 비밀번호를 입력해야하는데, 해당 비밀번호는 아까 복사해둔 관리자 비밀번호를 입력하면 된다.
Jenkins에는 수 많은 플러그인들이 있어서 사용자의 입맛에 맞게 커스텀할 수 있다. 하지만 이번 포스팅에선 기본값으로 우선 설치해보려고 한다. 그래서 "Install suggested plugins"로 설치를 진행한다.
플러그인 설치가 완료되면 새 Admin User를 생성해야한다. 정보를 입력해주고 앞으로 관리자용 계정으로 사용할 것이기 때문에 ID와 비밀번호를 잊어버리지 않도록 잘 보관해두길 바란다.
계정을 생성하면 Instance Configuration 화면이 나타나는데, 이 부분은 그냥 "Save and Finish" 버튼을 클릭하면 된다.
4. Jenkins에 Docker Hub 계정 / GitHub Access Token 등록
GitHub Repository의 특정 브랜치에 푸쉬를 했을때 Docker에 자동으로 빌드/배포가 되게끔 연동하려면 우선 Jenkins에 Docker Hub 계정과 GitHub Access Token을 등록해야한다. 두 가지 경우의 등록 과정을 동일하나 Docker Hub에 미리 가입이 되어있어야 하고, GitHub Access Token 같은 경우 우선 발급이 되어있어야 하기 때문에 아래 블로그 글을 참고하여 GitHub Access Token을 발급받길 바란다.
{서버IP주소 또는 도메인}:5000/credentials/store/system/domain/_/ 으로 들어가게 되면 아래와 같이 Global credentials(System) 페이지를 볼 수 있다. 여기서 좌측 메뉴의 "+ Add Credentials" 클릭하여 Docker Hub 계정과 GitHub Access Token을 등록하면 된다.
Docker Hub 계정 등록에 경우
Username에 "Docker Hub 계정의 ID", Password에 "Docker Hub 계정의 비밀번호", ID에 "해당 계정 등록 정보를 식별할 수 있는 이름", Description에 "해당 계정 등록 정보를 식별할 수 있는 설명"을 넣어주면 된다.
GitHub Access Token 등록에 경우
Username에 "GitHub 계정의 ID", Password에 "GitHub 계정의 발급받은 Access Token", ID에 "해당 계정 등록 정보를 식별할 수 있는 이름", Description에 "해당 계정 등록 정보를 식별할 수 있는 설명"을 넣어주면 된다.
5. Jenkins Pipeline 생성
테스트용 pipeline을 생성해보겠다. 테스트를 위한 소스로 정찡이님의 repo를 포크하여 이용했다.
아래는 정찡이님의 블로그이다.
우선 "+ 새로운 Item"을 클릭하여 새 Pipeline을 생성한다.
그런다음 "Do not allow concurrent builds"와 "GitHub project"를 체크하고 Project url에 소스 repo 주소를 넣는다.
그리고 pipeline 항목에 script를 작성한다.
Pipeline script는 stage 라는 것으로 단계를 구분할 수 있는데, stage 괄호 안에 문자열을 넣어주면 해당 stage에 제목을 지정해줄 수 있다. stage 안에는 sh를 이용해 shell script를 실행할 수 있다. 이를 이용해 소스의 테스트, 빌드를 돌리고 컨테이너이미지를 생성하고 push, 컨테이너 구동을 처리할 수 있다 (Dockerfile같이 기본적으로 과정을 자동화한다는 부분에선 컨셉이 비슷하다)
설정이 끝났다면 버튼을 눌러 적용시키고 프로젝트페이지 좌측에 있는 "지금 빌드" 버튼을 눌러 빌드를 실행시키면 된다.
그러면 자동으로 repo에서 소스를 가져오고 빌드한뒤 Docker에 배포를 하게된다.
호스트에서 Docker 컨테이너의 실행상태를 확인해보면 새로운 컨테이너가 생성되었음을 확인할 수 있다.
더 자세한 pipeline script 사용법과 github webhook 연동은 다음 포스팅에서 다루도록 하겠다.
6. script
세팅에 또 다시 시간을 쏟고 싶지 않아서 그냥 Jenkins 세팅용 스크립트를 만들었다...
https://github.com/skymins04/docker-jenkins-sh
'SW > DevOps' 카테고리의 다른 글
[DevOps] Github Actions로 브랜치별 Firebase 배포 설정하기 (0) | 2023.01.21 |
---|---|
[DevOps] NGINX Proxy Manager와 CloudFlare를 이용해 로컬 네트워크 내에서 일관된 웹 개발 테스트 환경 구성하기 (0) | 2022.10.31 |
[DevOps] Netlify에 CloudFlare DNS 연동하기 (0) | 2022.10.09 |
[DevOps] Scale-Up과 Scale-Out (0) | 2022.06.23 |
[DevOps] docker-compose.yml 작성법 (0) | 2022.06.14 |