spring-boot 도커로 배포하기

업데이트: Link

GitLab runner 를 통해 도커로 자동 배포 설정하기

gitlab CI/CD 기능을 통한 자동 배포를 활용하는 방법중 자동으로 도커배포 하는 방법을 남겨 놓는다.

프로젝트 DockerFile 설정하기

도커파일로 생성할 수 있도록 DockerFile 파일을 생성해서 수정한다.

FROM openjdk:17-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=${USE_PROFILE}", "-jar", "/app.jar"]

🎈 중요: 도커 실행시 스프링 프로파일을 활용할 수 있도록 ENTRYPOINT 설정에 ${USE_PROFILE} 변수를 활용하여 설정 했다. 이 외에도 jdk 버전등의 옵션 정보를 자신에게 맞게 설정해야 한다.

배포될 서버 설정

gitlab 서버가 아닌 gitlab 의 CI/CD를 이용해 배포되는 목표 서버에 해야 할 작업이다.

Docker 설치

Install Docker Engine on Ubuntu 페이지를 참고 하여 도커를 설치한다. OS 별로 설치 방법이 다르지만 도커 문서를 따라가기만 해도 쉽게 설치가 가능하다.

도커 설치가 가능한 우분투 버전이 존재 하니 이 부분은 반드시 미리 확인해 두자.

  • Ubuntu Jammy 22.04 (LTS)
  • Ubuntu Impish 21.10
  • Ubuntu Focal 20.04 (LTS)
  • Ubuntu Bionic 18.04 (LTS)

gitlab-runner 설치

배포하고자 하는 프로젝트의 설정CI/CD 페이지로 이동한다.

Runner 항목의 메뉴를 클릭해 상세 내용을 볼 수 있다.

project-runners-details

버튼을 클릭하면 각 OS별 설치 스크립트를 확인하여 설치할 수 있다. 이때 registration token 내용은 gitlab-runner 등록시 필요하다.

settings_ci_cd

내가 필요한 설치 스크립트는 다음과 같다.

# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# Give it permission to execute
sudo chmod +x /usr/local/bin/gitlab-runner

# Create a GitLab Runner user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# Install and run as a service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

gitlab-runner 등록

gitlab-runner 설치가 끝났다면 이제 필요한 runner를 등록한다. 이때 빌드에 필요한 runner를 (보통은 docker runner) 등록하고 도커를 등록 및 실행할 shell-runner를 등록해 주어야 한다. 다음은 shell-runner 를 등록하는 예제 코드이다.

⚠ 이 페이지에서는 도커빌드 관련한 내용은 언급하지 않는다.

# shell runner
sudo gitlab-runner register -n \
  --url "http://{your_gitlab_domain}/" \
  --registration-token "{your_registration_token}" \
  --executor "shell" \
  --description "shell-runner" \
  --tag-list "shell-runner,{your_tags}"

GitLab 서버 설정

배포될 서버의 설정은 대충 마무리 했으니 깃랩 서버에서 어떻게 설정해야 하는지 알아보자.

🔧 설정: 이때 gitlab-ee 사용자는 gitlab-ee container registry 설정이 되어있어야 한다. 설정되어 있지 않다면 GitLab Container Registry administration 페이지를 참고하여 설정해 주어야 한다.

GitLab runner 등록 확인

프로젝트에서 gitlab-runner 등록이 잘 되었는지 확인해 본다. gitlab-runner 설치를 위해 들어갔던 프로젝트의 설정CI/CD 페이지로 다시 이동한다.

Runner 항목의 메뉴를 클릭해 위에서 등록한 gitlab-runner가 잘 등록되었는지 확인해 본다. (위에서 열어두었다면 새로고침해 준다.)

gitlab-runner-status 잘 등록되었다면 위와 같은 모양으로 등록된 runner가 보인다.

CI 설정으로 배포

gitlab-ci를 활용하여 배포하기 위한 설정을 추가한다.

변수 설정

이때 container-registry 영역을 이용하기 때문에 container-registry 로그인 정보도 변수로 함께 설정 해 주어야 한다.

  • CI_REGISTRY_PASSWORD
  • CI_REGISTRY_USER

배포하고자 하는 프로젝트의 설정CI/CD 페이지로 이동한다.

Variables 항목의 버튼을 클릭하여 다음과 같이 설정한다.

gitlab-project-settings-cicd-variables

CI config

배포를 위해 .gitlab-ci.yml 파일을 만들거나 수정한다. 이때 variables 항목을 자신에게 맞추어 수정해야 한다. 그 외에도 스프링 부트에 사용되는 프로파일이나 서버 포트 등을 자신에게 맞게 수정한다.

🐦 참고: gitlab 프로젝트 페이지에서 CI/CD ➡️ Editor 메뉴로 이동하여 직접 수정도 가능하다.

stages:
  - build
  - deploy

variables:
  DOCKER_REGISTRY: "registry.your-repo.com:5050"
  DOCKER_IMAGE_NAME: "registry.your-repo.com:5050/your-group-or-name/your-project/your-image-name"
  APP_NAME: "your-image-name"
  
before_script:
  - echo "Run pipeline - $GITLAB_USER_LOGIN! $CI_COMMIT_BRANCH"
  - echo "$CI_REGISTRY_PASSWORD" | docker login "$DOCKER_REGISTRY" --username "$CI_REGISTRY_USER" --password-stdin

build:
  stage: build
  script:
    - echo "Start building ApiApp"
    - ./gradlew clean build
    - docker build -t "$DOCKER_IMAGE_NAME":latest .
    - docker push "$DOCKER_IMAGE_NAME":latest
  tags:
    - shell-runner

deploy:
  stage: deploy
  script:
    - (if [ "$(docker ps -a | grep "$APP_NAME")" ]; then docker stop "$APP_NAME" && docker rm "$APP_NAME" && docker image tag "$DOCKER_IMAGE_NAME":latest "$DOCKER_IMAGE_NAME":backup && docker rmi "$DOCKER_IMAGE_NAME":latest ; fi);
    - docker pull "$DOCKER_IMAGE_NAME"
    - docker run -p 8100:8100 -d --restart always -e USE_PROFILE=prod --name "$APP_NAME" "$DOCKER_IMAGE_NAME":latest
  tags:
    - shell-runner
  needs: [build]

댓글남기기