Spring Boot 서버 Docker로 배포하기

Cropo·2024년 5월 3일
2
post-thumbnail
post-custom-banner

사내에는 Jenkins CI/CD를 통해 배포 파이프라인이 구축되어 있었다. 인프라 개선 프로젝트를 진행하면서 Auto Scaling, Jenkins pipeline, CodeDeploy 등이 추가로 적용되면서 Docker 컨테이너화도 함께 추가하게 되었다.
Docker를 선택한 이유와 방법에 대해 공유해봅니다.

왜 Docker를 썻는가?

  1. 버전 관리의 편의성
    도커를 사용하게되면 최종적으로 도커 이미지가 생성되고 이를 AWS ECR, Docker Hub 등에 올려둔 후 배포할 수 있다. 이미지를 다운로드 받아 교체만 진행하면 롤백, 버전 변경 등을 쉽게 수행할 수 있다.
  2. 격리된 환경
    도커는 각 컨테이너가 격리된 형태로 구성되어 있다. 때문에 컨테이너에서 발생한 문제가 다른 컨테이너로 전파되지 않고 격리된 환경을 보장하며 어느 운영체제 위에서든 동일한 실행환경을 보장하여 쉽게 배포할 수 있다.
  3. 효율적인 리소스
    가상 머신에 비해 더 가볍고 빠르기 때문에 서버의 리소스를 효율적으로 사용할 수 있다.

Docker 배포방법

  1. Dockerfile 파일 생성
FROM amazoncorretto:18

COPY build/libs/*.jar app.jar

ENTRYPOINT [ \
  "java", \
  "-jar", \
  "app.jar" \
]

#1 FROM : Docker file의 베이스가 되는 이미지를 선택한다. Java 18버전으로 Spring boot를 실행할 예정이기 때문에 기존에 사용중이던 amazon corretto 18 이미지를 선택하였다.
#3 COPY : Spring 서버를 실행하기 위한 jar 파일을 COPY 명령어를 통해 도커 파일 시스템으로 복사해온다. *.jar를 통해 해당 경로에 있는 생성된 jar 파일의 이름에 영향받지 않고 복사할 수 있다. Dockerfile의 컨텍스트 경로를 따로 지정하지 않는 경우에 Dockerfile이 존재하는 폴더 경로가 최상단 경로가 되며 외부 경로에 접근할 수 없다.
#5 ENTRYPOINT : 실제 서버가 실행되는 시점에 사용할 Shell 스크립트이다. java -jar app.jar 명령어를 통해 Spring Boot 서버를 실행한다. 명렁어의 공백 단위로 분리하여 배열 형태로 ENTRYPOINT 명령어에 전달한다.

  1. docker-compose.yml 파일 생성
version: "3"
services:
  application:
    build:
      context: ../
      dockerfile: Dockerfile
    container_name: sample
    ports:
      - "8080:8080"
    volumes:
      - ./logs:/logs
    environment:
      TZ: Asia/Seoul

#1 version : docker-compose의 버전을 명시한다. 버전별 지원하는 옵션들이 일부 다를 수 있어 오류가 난다면 버전을 확인해볼수있다.
#2 services : docker를 통해 실행된 컨테이너들을 나열한다.
#3 application : application 이라는 이름의 서비스를 정의한다.
#4 build : Dockerfile을 통해 이미지를 빌드하고 빌드한 이미지를 통해 컨테이너를 실행하기 위한 옵션. context 경로와 dockerfile의 경로를 지정해준다.
#7 container_name : 실행될 컨테이너의 이름을 정의한다.
#8 ports : 외부 환경과 도커 내부 환경의 포트를 연결해준다.
#10 volumes : Spring boot의 로그 파일이 생성되면 도커 파일시스템 내부에 있기 때문에 파일에 접근할 수 없다. 외부에서도 파일에 접근 가능하게 하기 위해 외부 시스템의 파일 경로와 도커 내부 파일시스템의 파일 경로를 연결해준다.
#12 environment : 추가로 필요한 환경변수를 정의한다. 정의된 환경변수는 Dockerfile 내에서 사용 가능하다.

  1. docker-compose up -d --build 명령어를 통해 빌드 및 실행
[+] Building 1.7s (8/8) FINISHED                                                                                                                            docker:desktop-linux
=> [application internal] load build definition from Dockerfile                                                                                                            0.0s
=> => transferring dockerfile: 226B                                                                                                                                        0.0s
=> [application internal] load metadata for docker.io/library/amazoncorretto:18                                                                                            1.7s
=> [application internal] load .dockerignore                                                                                                                               0.0s
=> => transferring context: 2B                                                                                                                                             0.0s
=> [application 1/3] FROM docker.io/library/amazoncorretto:18@sha256:1128cff77f7fb4512215a4ded2bf0a6ec3cd2bf0f414a72136b1bb1d5f6b0518                                      0.0s
=> [application internal] load build context                                                                                                                               0.0s
=> => transferring context: 315B                                                                                                                                           0.0s
=> CACHED [application 2/3] COPY build/libs/*.jar app.jar                                                                                                                  0.0s
 => CACHED [application 3/3] COPY deploy/opentelemetry-javaagent.jar agent.jar                                                                                             0.0s
 => [application] exporting to image                                                                                                                                       0.0s
 => => exporting layers                                                                                                                                                    0.0s
 => => writing image sha256:3994d6e283de0d9fe614ddd32ace1e6d78a6e3bdae869f93f22be98d19ed129f                                                                               0.0s
 => => naming to docker.io/library/deploy-application                                                                                                                      0.0s
[+] Running 1/0
 ✔ Container sample  Running                                                                                                                                               0.0s

docker-compose logs -f ${컨테이너명} 명령어를 통해 실행된 컨테이너의 로그를 확인할 수 있다.
docker-compose down 명령어를 통해 실행중인 컨테이너들을 종료시킬 수 있다.

profile
Software Engineer - 박영훈
post-custom-banner

0개의 댓글