사이먼's 코딩노트

[SpringBoot] 실전 서비스 배포 (3) 본문

Java/SpringBoot

[SpringBoot] 실전 서비스 배포 (3)

simonpark817 2024. 7. 27. 23:02

[실전 서비스 배포]

  • 지난 서비스 배포 포스팅에 이어 이번에는 Docker를 통해 MariaDB 버전의 서비스를 배포해봅시다.
  • 앞서 필요한 패키지들을 모두 설치했다면 아래와 같이 순서대로 명령어를 입력하여 실제 배포를 실습해보겠습니다.

 

[디렉토리 생성]

  • 서버에서 깃허브 리포지터리에 있는 프로젝트를 clone하기 전, 해당 프로젝트가 위치할 디렉토리를 만들어야한다.
  • 아래의 명령어를 순서대로 SSH 클라이언트에서 입력해준다.
  • 먼저 /docker_projects/프로젝트명/project 라는 디렉토리가 있으면 삭제하도록 하고 mkdir를 통해 새 디렉토리를 생성하고 이동한다.
  • 여기서 프로젝트명은 사용자 마음대로 지정해서 넣으면 된다.
rm -rf /docker_projects/프로젝트명/project
mkdir -p /docker_projects/프로젝트명/project
cd /docker_projects/프로젝트명/project

 

[MariaDB 설정]

  • 저번에 MariaDB를 설치하고 접속해서 데이터베이스를 생성했다면 이번엔 보안설정과 마스터계정과 다른 데이터베이스를 생성해봅시다.
  • 아래의 명령어를 순서대로 입력하여 보안설정을 진행한다.
  • docker exec -it mariadb_1 /usr/bin/mariadb-secure-installation을 입력하면 MariaDB 계정의 비밀번호를 입력해야한다.
  • 이 때 비밀번호는 MariaDB 설치 시 입력했던 비밀번호를 입력하면 된다.
  • 그 다음 질문을 통해 몇 가지 설정을 진행하는데, 처음과 두번째 질문에는 n(no)를 입력하고 나머지 질문들에는 모두 y(yes)를 입력하면 된다.
docker exec -it mariadb_1 /usr/bin/mariadb-secure-installation
Enter current password for root (enter for none):
root 계정 패스워드(sbsst123414) 입력
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] n
나머지 Y

 

  • 보안설정이 끝났다면 다시 MariaDB에 진입하여 마스터 계정의 승인 설정을 해야한다.
  • 아래의 명령어를 순서대로 입력하여 승인을 진행한다.
  • 두 번째, 세 번째 명령에 적힌 mklocal과 1234는 필자가 임의로 설정한 계정과 비밀번호이기 때문에 사용자가 원한다면 변경해도 좋다.
  • 다만 해당 계정 정보를 변경했다면 프로젝트 내 application-prod.yml에 DB 정보에 username과 password를 동일하게 작성해야한다.
  • 마지막으로 nginx를 위한 데이터베이스도 함께 생성한다.
# MariaDB 진입
docker exec -it mariadb_1 mariadb -u root -p

# root 계정이 아이디와 비번만 알면 어디서든 접속이 가능하도록 설정
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'sbsst123414';

#root 계정이 MariaDB 컨테이너에서만 접속 가능하도록 허용
GRANT ALL PRIVILEGES ON *.* TO mklocal@127.0.0.1 IDENTIFIED BY '1234';

# root 계정이 같은 도커 호스트를 공유하는 컨테이너에서 접속 가능하도록 허용
GRANT ALL PRIVILEGES ON *.* TO mklocal@'172.17.%.%' IDENTIFIED BY '1234';

# 권한 부여 후 적용
flush privileges;

# NGINX PROXY MANAGER 를 위함
CREATE DATABASE nginx;
exit

데이터베이스 확인

 

[프로젝트 불러오기]

  • 여기까지 준비됐다면 이제 배포할 프로젝트를 Git 명령어를 통해 불러와봅시다.
  • 'git clone 리포지터리 주소 .' 명령어를 입력하여 프로젝트를 가져올 수 있는데 이 때 명령어를 입력하는 디렉토리의 위치는 /docker_projects/프로젝트명/project에 위치한 상태여야한다.
  • 여기서 주의할 점은 리포지터리 주소 뒤에 반드시 .을 붙혀야한다.
  • 프로젝트를 가져왔다면 보통 application-secret.yml 파일은 gitIgnore를 통해 push를 무시하기 때문에 파일이 없을 수도 있다.
  • 해당 디렉토리 위치로 이동해서 기존에 작성된 secret파일을 새로 만들고 작성해야한다.
  • 그리고 앞서 계속 말했듯이 배포 환경에서 실행할 수 있는 application-prod.yml 파일도 반드시 필요하다.

git clone 완료

 

[Build 및 Docker 이미지 실행]

  • 마지막으로 불러온 프로젝트를 빌드하고 Docker를 통해 이미지 실행하면 배포가 끝난다.
  • 그 전에 gradlew 파일을 소유자가 실행 가능한 상태로 변경하기 위해 아래와 같은 명령어를 입력해야한다.
  • 명령어를 입력하는 디렉토리의 위치는 여전히 /docker_projects/프로젝트명/project 여야한다.
  • ls는 gradlew의 파일 상태를 리스트한 명령어이고, chmod 744 명령어를 통해 권한을 설정한다.
cd /docker_projects/market/project
ls -alh | fgrep gradlew
chmod 744 gradlew
ls -alh | fgrep gradlew

 

  • 그 다음은 Dockerfile이라는 파일을 생성과 동시에 수정이 필요하다.
# Dockerfile 생성 및 편집기 열기
vi Dockerfile

FROM openjdk:17-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","/app.jar"]

 

  • 이제 빌드와 서버 내의 스프링부트를 실행해보도록 합시다.
  • 빌드를 실행할 때 만약 테스트가 실패한다면 아래의 -x test가 붙혀진 버전으로 다시 빌드를 실행해준다.
  • 빌드가 완료되면  스프링부트를 실행해보면 되는데 명령어에서 말하는 jar_파일_이름은 /docker_projects/프로젝트명/project/build/libs 디렉토리로 이동해서 확인할 수 있다.
  • ll을 통해 파일을 확인하고 가장 위에 있는 기본 SNAPSHOT.jar 파일명을 그래도 복사하여 명령어에 붙혀넣으면 된다.
# 빌드 실행
./gradlew clean build
./gradlew clean build -x test

# 스프링부트 실행
java -jar -Dspring.profiles.active=prod build/libs/jar_파일_이름

jar 파일명 확인

 

  • 마지막으로 Docker를 통해 배포를 하기 전에 기존 Docker 이미지가 있다면 제거해주고 새로운 이미지를 생성하여 실행하면 실제로 도메인 네임이나 공인 IP를 통해서 자신이 빌드한 프로젝트 사이트에 진입할 수 있다.
  • 아래 명령어를 차례로 입력하면 된다.
  • 이미지 실행까지 완료되면 사진과 같이 docker ps라는 명령어를 입력했을 때 MariaDB와 프로젝트 이미지가 나타나야된다.
  • 필자는 현재 프로젝트 이미지를 제거한 상태라 사진에 표시되지 않았다.
# 도커 이미지가 있다면 삭제
docker rm -f 프로젝트명
docker rmi -f 프로젝트명

# 도커 이미지 생성
docker build -t 프로젝트명 .

# 도커 이미지 실행
docker run \
    --name=프로젝트명 \
    --restart unless-stopped \
    -p 80:8080 \
    -e TZ=Asia/Seoul \
    -d \
    프로젝트명

docker 프로세스 확인

 

반응형