- 이번 포스트는 개발이 완료된 Springboot 프로젝트를 Docker 를 사용하여 배포하는 방법에 대해 정리하겠습니다.
아시다시피 Docker 는 어느 플랫폼에서도 동일한 동작을 보장하는 컨테이너 기반 VM 입니다.
고로 본 게시글에서 실습해볼 내용은,
일단 로컬 환경에서 Springboot 프로젝트를 Docker 컨테이너 안에 띄우고, 해당 Docker 컨테이너로 접근하여 서비스에 정상 접근할 수 있는지를 확인하는 것이며,
정상 실행이 된다면 어느 환경, 어느 위치에라도 동일한 방식으로 배포할 수 있게 되는 것입니다.
- 실습
1. OS Command 입력창을 열고 Springboot 의 루트 경로로 이동합니다.
cd "/Users/.../SpringBoot_MvcTemplate"
저의 경우는 위와 같은 프로젝트를 배포하겠습니다.
2. 빌드 작업을 수행합니다.
저의 경우는 Gradle 을 사용하므로 Gradle 명령어를 사용하여 빌드하였습니다.
chmod +x ./gradlew
./gradlew build -x test
빌드가 정상적으로 되었다면,
build/libs 디렉토리 안에, springboot_mvc_template-0.0.1-SNAPSHOT.jar 파일이 생성됩니다.
이 jar 파일을 실행시키면 바로 서비스 배포가 완료되는 것입니다.
다만, OS 에 구애받지 않고 동일한 동작을 보장하기 위해 Docker 를 사용하는 것이므로, 이를 Docker 컨테이너 안에 넣어서 실행시키도록 하겠습니다.
3. Docker 파일을 만듭니다.
Docker 컨테이너가 생성된 시점에 한번만 실행되는 명령어를 모아둔 파일로,
# 베이스 이미지 설정
FROM ubuntu:22.04
# 기본 패키지 설치
RUN apt-get -y update
RUN apt-get -y upgrade
# 시간대 설정 (Asia/Seoul 시간대로)
RUN DEBIAN_FRONTEND=noninteractive TZ=Asia/Seoul apt-get -y install tzdata
RUN ln -fs /usr/share/zoneinfo/Asia/Seoul /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
# OpenJDK 설치 !!!필요한 JDK 버전에 맞는 설치!!!
RUN apt install -y openjdk-21-jdk
# 프로젝트 jar 파일 복사
# !!!jar 파일 이름 수정!!!
COPY ../../../build/libs/springboot_mvc_template-0.0.1-SNAPSHOT.jar /app/
# 작업 디렉토리 생성 및 이동
WORKDIR /app
# Spring Boot 애플리케이션 실행
# !!!jar 파일 이름 수정!!!
CMD ["java", "-jar", "-Dspring.profiles.active=dev8080", "/app/springboot_mvc_template-0.0.1-SNAPSHOT.jar"]
위와 같이 설정하면,
ubuntu OS 가 생성된 이후, 위에서부터 차례대로 명령어가 실행됩니다.
패키지 업데이트, 시간대 설정 및
jar 파일을 실행시킬 OpenJDK 설치를 하도록 했습니다.
그리고 COPY 명령어로 앞서 생성한 로컬의 jar 파일을 컨테이너 내의 /app/ 폴더 내에 복사해주고, CMD 로 jar 파일을 실행시켜주는 명령어를 적은 것입니다.
예시를 참고하여 본인에게 맞도록 수정하시면 됩니다.
4. Docker 파일이 준비되었다면 해당 파일로 도커 이미지를 만듭니다.
docker image build --pull=true -f "./external_files/docker/server_docker/Dockerfile-Server-Dev" -t raillylinker/server_dev:latest .
-f 옵션으로 앞서 생성한 도커 파일의 경로를 입력하면 되고, -t 로 생성할 도커 이미지의 이름을 설정하면 됩니다.
이렇게 한다면 도커 컨테이너가 아니라, 도커 컨테이너를 생성하는 설계도라 할 수 있는 도커 이미지가 생성되는 것입니다.
이 이미지를 실행하면 앞서 도커 파일에 작성한 내용들이 실행되게 되는 것이죠.
완료 되었다면 위와 같이 도커 이미지가 생성될 것입니다.
5. 도커 이미지 추출
위와 같이 생성한 도커 이미지를 바로 사용하여 컨테이너를 만들어도 되지만, 배포 환경이 빌드 환경과 다를 경우가 있습니다.
예를들어 빌드 환경은 Jenkins 와 같은 CI/CD 툴이고, 배포 환경은 AWS 와 같은 클라우드 컴퓨터라고 한다면,
Jenkins 가 돌아가는 PC 와 배포 PC 가 서로 다를 수 있습니다.
이 경우에는 빌드 PC 내에 이미지가 있어봐야 배포 PC 에서 사용할 수 없죠.
Docker 허브를 사용하는 방법도 존재합니다.
이미지를 Docker 허브에 올려두고, 배포 PC 에서 Git Pull 을 하는 것처럼 가져와서 사용하는 방식입니다.
하지만 저의 경우는 굳이 도커 허브의 신세를 지는 것을 좋아하지 않기에 도커 이미지를 파일로 추출하는 방식을 사용할 것입니다.
생성된 도커 이미지를 도커 파일로 만들고,
이 파일을 배포하려는 어떤 위치에라도 복사한 후에 load 를 해서 사용하도록 하는 방식입니다.
docker save -o "./by_product_files/server_dev.tar" raillylinker/server_dev:latest
위와 같은 명령어로 도커 이미지를 파일로 추출 가능합니다.
이미지 파일이 생성되었다면 로컬에서 테스트를 위해 기존 도커 이미지는 제거하겠습니다.
이미지 파일이 복사되어 실행될 배포 서버에는 이미지가 로딩되지 않았을 것이기에 이를 가정한 환경을 구성하는 것입니다.
docker image prune -af
6. 도커 이미지 파일에서 이미지 로딩
앞서 만든 도커 이미지 파일에서 도커 이미지를 로딩하겠습니다.
docker load -i "./by_product_files/server_dev.tar"
파일이 크다면 시간이 조금 걸릴테지만,
Loaded image: raillylinker/server_dev:latest
위와 같은 결과가 뜨면 로딩이 잘 된 것입니다.
7. 도커 이미지로 도커 컨테이너 실행시키기
불러온 이미지를 실행하여 서버로서 정상 동작하는지 확인할 것입니다.
docker container run -v ${PWD}/by_product_files:/app/by_product_files -d -e TZ=Asia/Seoul --rm -p8080:8080 --name server_dev raillylinker/server_dev:latest
위와 같은 명령어를 기반으로 본인이 원하는대로 설정하여 실행시키면 됩니다.
-v 옵션의 ${PWD}/by_product_files 부분은 도커 컨테이너 바깥의 로컬 저장소에, 로그 파일 및 그외 서비스 생성 파일들을 저장하길 원하는 위치를 지정하세요.
정상 실행이 된다면,
이렇게 동작하며,
서비스에 진입하면 정상 동작을 확인할 수 있습니다.
- 이상입니다.
'Springboot' 카테고리의 다른 글
Springboot JavaMailSender 로 이메일 보내기 (PlainText 발송, 첨부파일 발송, Thymeleaf HTML 이메일 발송) (2) | 2024.10.08 |
---|---|
Springboot 에서 AWS S3 다루기 (1) | 2024.10.08 |
Springboot MongoDB 설정하기 (멀티 소스 데이터베이스 접속, MongoDB ReplicaSet 접속 및 트랜젝션 Annotation 작성) (0) | 2024.10.08 |
Springboot JPA 설정하기 (멀티 소스 데이터베이스 접속 및 트랜젝션 Annotation 작성) (2) | 2024.10.08 |
Springboot JPA Timezone 설명 (데이터베이스와 Springboot 간의 타임존 처리 방식) (0) | 2024.09.29 |