본문 바로가기
Project/CI&CD

EC2에 docker로 Spring boot 배포하기(2) - docker 설치, docker 이미지 생성, docker container 실행하기

by rueMi 2024. 4. 17.

이전 포스팅에 이어서 Docker를 설치하고 생성한 Spring boot 프로젝트를 Docker 이미지로 만들어 실행해보자.

 

로컬에 Docker 설치

도커 설치는 다음과 같이 두 단계로 이루어질 것이다.

  1. WSL2 설치 및 활성화
  2. docker desktop 설치

우선 WSL2(Windows Subsystem for Linux 2), 즉 윈도우에서 리눅스를 사용할 수 있게 도와주는 기술이다. 이를 먼저 설치하자.

윈도우 10 버전 2004이거나 윈도우 11에는 기본적으로 wsl 명령어가 포함되어 있다. powershell을 관리자 모드로 열고 다음 명령어를 실행하면 된다.

$ wsl --install

 

 

설치가 끝나면 다음 명령어를 실행해 WSL 버전 기본 값을 2로 변경해준다.

wsl --set-default-version 2

 

완료!

 

이제 docker desktop을 설치하자

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

 

이 페이지에서 download for window를 클릭해 다운로드 받는다.

 

next 몇 번 누르면서 설치하면 된다.

설치 완료!


Spring Boot 프로젝트에 도커 설정

이제 Spring Boot 프로젝트로 다시 돌아와 도커 파일을 만들어준다.

🔎 도커 파일, docker file

도커 파일은 docker에서 이미지를 생성하기 위한 용도로 작성하는 파일이다. 만들 이미지에 대한 정보를 기술해둔 템플릿이라고 보면 된다.

 

프로젝트 우클릭하면 New → Dockerfile이 있고, 이를 클릭한다.

 

그러면 다음과 같이 도커파일을 생성해주며, 내용을 다음과 같이 바꿔준다.

FROM openjdk:11
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
  • FROM : 토대로 생성할 베이스 이미지
  • COPY : Host 내에 있는 파일 또는 디렉토리를 컨테이너의 파일 시스템으로 복사
  • ENTRYPOINT : 컨테이너 시작 시 실행될 command 지정
 

docker :: 도커파일(Dockerfile) 의 개념, 작성 방법/문법, 작성 예시

1. 도커파일(Dockerfile) 이란? 도커파일은 docker 에서 이미지를 생성하기 위한 용도로 작성하는 파일이다. 만들 이미지에 대한 정보를 기술해 둔 템플릿(template) 이라고 보면 된다. 도커 이미지를 만

toramko.tistory.com

 

완료했다면 powershell에서 Spring Boot 프로젝트의 root 경로로 가서 프로젝트를 빌드해준다.

cd [프로젝트 루트 경로]
./gradlew clean build

 

 

빌드 완료!


Docker 이미지 만들기

도커 이미지를 생성한다. 도커 명령어를 실행하면, Dockerfile에서 설정한 내용들이 실행된다.

나는 프로젝트 root 경로로 이동하여 도커 이미지를 생성했다.

docker build -t love00826/docker-study-pjt .

 

마지막에 .은 현재 경로를 의미한다. 빠트리면 안 된다! (내가 빠트렸었음..)

 

다음 명령어를 통해 생성된 도커 이미지를 확인할 수 있다.

docker images


Docker Container 실행

다음 명령어를 통해 도커 이미지로 컨테이너를 실행할 수 있다.

포트를 두 개 적는 이유는, Host Port와 Container Port를 연결하기 위함이다.

docker run -d -p 8080:8080 love00826/docker-study-pjt

 

다음 팝업이 뜨는데 허용했다.

 

다음 명령어를 통해 실행 중인 컨테이너를 확인할 수 있다.

docker ps

 

그런데 아무것도 뜨지 않았다!

 

뭐지 하고 docker desktop에 들어갔더니 컨테이너가 바로 중지되는 거 같았고, 다음과 같은 로그를 볼 수 있었다.

Error : 도커 실행 중단

🔎 Error: LinkageError occurred while loading main class org.springframework.boot.loader.launch.JarLauncher 2024-01-23 21:09:40 java.lang.UnsupportedClassVersionError: org/springframework/boot/loader/launch/JarLauncher has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

 

자바 버전 때문인가..? 도커파일의 자바 버전을 17로 수정하고 위 과정을 반복했다.

 

성공적으로 컨테이너가 실행되었다.

 

여기서 https://localhost:8080/ 경로로 들어가면 페이지를 확인할 수 있다고 한다.

 

근데 들어가자마자 또 중지..

 

🔎 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure … Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)

 

 

 

[ERROR] Communications link failure (Docker + MySQL + Spring JdbcTemplate 연동 실패) 에러 해결

문제 상황 스프링 환경에서 도커를 이용한 mysql + JdbcTemplate으로 db 연동을 하는 과정에서 아래 에러가 발생했다. Spring 애플리케이션을 실행하는 도중에 히카리풀에서 에러를 뱉으면서 jdbc 연결이

kth990303.tistory.com

 

*implementation*("org.springframework.boot:spring-boot-starter-jdbc") 를 dependency에 추가해주고 gradle를 update 해주었다.

 

🔎 Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
 

Spring 데이터베이스 연동 시 Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set 오류

자바 언어를 위한 객체 관계 매핑 프레임워크(ORM)으로,객체 지향 도메인 모델 -> 관계형 데이터베이스(RDB)로 매핑할때 쓰인다.JPA의 구현체중 하나로, SQL을 직접사용하지 않고, 메서드 호출만으로

velog.io

 

application.yml에 JPA 설정을 하지 않아서 그런 것 같다.

 

위에 추가해주었고,

다음과 같이 도커에 올리기 성공했다!