✏️/Server

Docker를 이용하여 Spring Boot 배포해보기

sssbin 2023. 12. 30. 19:57

| 실습 환경: MacOS, M1

🐳 Docker란?

  • 로컬에서 서버에 올릴 때 문제 발생 ⇒ 도커 탄생!
    • 각종 디펜던시 설정의 번거로움
    • 디펜던시들의 버전 불일치 문제
  • 애플리케이션을 패키징 할 수 있는 툴
    • 컨테이너에 애플리케이션 + 시스템 툴 + 환경 설정 + 디펜던시를 하나로 묶어 어디에서나 쉽게 배포하고 안정적인 구동을 도와준다.
  • 구성 요소
    • Dockerfile - 컨테이너를 어떻게 만들어야 하는지에 대한 설명서
    • Image - 애플리케이션을 실행하는데 필요한 코드, 런타임, 환경, 시스템 툴, 시스템 라이브러리 등이 포함
    • Container - Image를 고립된 환경에서 개별적인 시스템 안에서 실행할 수 있는 공간

 

🔌 배포 실습

1. Docker 설치

2. DB 설정

  • application.properties 파일 → db 주소 바꿔주기
    • RDS를 쓰면 좋았겠지만,, 일단 연습용이기 때문에 내 IP 주소를 넣어줬다.
    • ⭐️ host.docker.internal를 쓰면 된다고 함.

3. Jar 파일 생성

  • 프로젝트 열기 → Gradle → build → bootJar

4. Dockerfile

  • 프로젝트 최상단에 Dockerfile 생성
    • FROM - 베이스 이미지를 지정
    • ARG - 변수 선언
    • COPY - 이미지 생성 시 파일 복사
    • ENTRYPOINT - 컨테이너의 어플 지정
    • ⭐️ jar 경로가 다르다거나.. 자바 버전이 안 맞는다거나.. 등등 하면 실행할 때 오류난다!
  • FROM openjdk:17 ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
  • 터미널에서 DockerFile이 있는 경로로 이동 후 Dockerfile 실행Apple Chip 사용중인 경우 아래 명령어를 실행..하라고는 하지만 이제 안 해도 되는 듯..? 일단 난 함..
  • $ docker build --platform linux/amd64 --build-arg DEPENDENCY=build/dependency --tag <이름>:<태그> .
  • $ docker build --tag <이름>:<태그> .
  • docker images → 만든 이미지 볼 수 있음

4. DockerHub로 Push

  • 로그인
  • $ docker login
  • push
  • $ docker push <이름>:<태그>

5. 배포

  • 실행
    • -i : 컨테이너와 상호적인 모드로 실행 → 표준입력(stdin)을 열어놓는다.
    • -t : 터미널을 할당하며, 터미널 입력을 받을 수 있게 한다. (사용하지 않을 경우 명령 입력은 가능하지만 쉘에 표시 X)
    • -p 8080:8080 : 호스트의 8080 포트를 컨테이너의 8080 포트로 매핑. 호스트와 컨테이너 간의 포트 포워딩 설정
  • $ docker run -p 8080:8080 <이름>:<태그>
  • 테스트

☄️ 트러블 슈팅

  • 실행했는데 스프링부트 올라가고 에러가 떴다.
    • <문제> SQLException: Access denied for user
    • <해결> DB 접근 권한 설정
    • # 사용자 추가 create user 'username'@'localhost' identified by 'password'; # 사용자 권한 설정 grant all privileges on *.* to 'username'@'localhost';

📚 참고 자료