<졸업프로젝트> 배포하기(1) - docker image 만들기

돔푸·2024년 5월 16일

졸업프로젝트

목록 보기
5/6

배포하는 가장 첫번째 관문, 도커 이미지를 생성하는 것이다.

docker image를 생성하기 위해서는,
1. application.yml을 입맛대로 설정하고,
2. 프로젝트 jar 파일을 빌드하고,
3. 해당 jar파일을 실행하는 Dockerfile을 작성하고
4. docker build를 통해 image를 만든다.
차근차근 살펴보자.

1. applicatoin.yml 수정하기


가장 처음으로 막혔던 부분인데, 그냥 무턱대고 jar파일로 빌드한다고 되는 것이 아니었다.
application.yml 파일을 잘 수정해주어야 하는데, 내 코드를 보면서 설명하겠다.

<application.yml>

spring:
  application:
    name: Hongpoong
  profiles:
    include: database  						...(1)
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    hibernate:
      ddl-auto: update						...(2)
    defer-datasource-initialization: true	...(3)
server:
  port: 8080
  • (1) : application-database.yml도 내 설정파일로 포함시킨다는 말이다. 나는 database 관련된 yml파일을 분리하고 싶어서 이렇게 사용했다.
  • (2) : ddl-auto가 보통 create나 create-drop으로 설정되어 있을텐데, update로 설정해야 DB가 reset되지 않고 유지될 수 있다.
  • (3) : 데이터소스 초기화를 애플리케이션 시작 시점에서 애플리케이션 컨텍스트 로드 완료 시점으로 미뤄, 각종 데이터베이스 오류를 방지할 수 있다.

<application-database.yml>

spring:
  datasource:
    url: jdbc:mysql://db:3306/hongpoong		...(4)
    username: root							...(5)
    password: 1234							...(6)
  session:
    jdbc:
      initialize-schema: always				...(7)
  • (4) : 로컬에서 테스트할 때는 보통 db:3306이 아니라 localhost:3306으로 설정할텐데, 우리는 도커를 사용해서 배포할 것이기 때문에 도커 컨테이너명인 db로 바꾸어준다.
  • (5), (6) : mysql 데이터베이스에 어떤 계정으로 접속할지 설정하는 것이다. 나는 mysql설정에서 root계정의 비밀번호를 1234로 만들 것이기 때문에 이렇게 설정한다.
  • (7) : Spring Session JDBC는 사용자 세션정보를 데이터베이스에 저장하는데, mysql을 사용하니 사용자 세션 테이블이 제대로 생성되지 않는 문제가 발생하여 넣어주었다. 이렇게 설정하면 매번 초기화하여 테이블이 제대로 생성된다. 다만, 제대로된 운영환경에서는 설정을 바꿔줘야할 것 같다.

자! 이렇게 application.yml, application-database.yml 파일을 작성하였다면 빌드할 준비가 완료되었다. 빌드 과정은 비교적 쉽다.

2. jar파일로 빌드하기


과거에 빌드되었던 내용을 싹 지우고 깔끔하게 빌드하기 위해 아래 명령을 실행한다.

./gradlew clean build

그러면,

Starting a Gradle Daemon (subsequent builds will be faster)
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
...
BUILD SUCCESSFUL in 10s
9 actionable tasks: 9 executed

이런 내용이 나오며 빌드가 성공적으로 끝났다는 정보가 나온다. gradle 빌드 과정에서는 내가 작성했던 테스트들도 열심히 통과되는 모습이 보였다.(119개의 테스트 성공...ㅠㅠ)

이렇게 빌드된 jar파일이 잘 생성되었다면 끝이다.

3. Dockerfile 작성하기

docker image를 만드는 방법은 크게 두가지가 있는데, 하나는 기본 컨테이너 위에서 작업한 후 커밋하는 방법이고, 나머지는 Dockerfile을 이용하는 방법이다.
Dockerfile은 어떤 명령들을 순서대로 실행하여 image를 구축하는 방법인데, 이것이 더 널리 쓰이고 편하다.

먼저 프로젝트 루트 폴더에 Dockerfile이라는 파일을 생성하고 다음과 같이 작성한다.

Dockerfile

FROM --platform=linux/amd64/v3 openjdk:21				#(1)
ARG JAR_FILE=build/libs/Hongpoong-0.0.1-SNAPSHOT.jar 	#(2)
COPY ${JAR_FILE} app.jar 								#(3)
ENTRYPOINT ["java","-jar","/app.jar"] 					#(4)
  • (1) : 가운데 --platform 옵션을 제외하고 보면 'FROM openjdk:21' 이다.
    베이스이미지를 jdk21로 가져가고 빌드한다는 뜻이다. 모든 명령들은 이 베이스이미지 위에서 실행되게 된다.
  • --platform=linux/amd64/v3 이란? docker ec2 ubuntu 기기는 운영체제가 linux/amd64/v3 이다. 이 운영체제에 맞춰 docker engine이 올라가고, 해당 docker engine에 맞춰 docker container가 올라가야 하기 때문에, 이렇게 맞춰준다. (이 부분은 시행착오를 통해 추가됐다.)
  • (2) : JAR_FILE이라는 변수를 생성하고 해당 변수를 우리 프로젝트가 빌드된 jar 파일로 잡아준다. 전에 생성한 jar파일을 잡아주면 된다.
  • (3) : 해당 JAR_FILE을 app.jar로써 컨테이너 내에 복사한다는 뜻이다. 이 명령이 실행되면 우리 프로젝트의 jar파일은 컨테이너 내에 위치하게 된다.
  • (4) : 이미지가 run되면 실행될 명령이다. 'java -jar /app.jar'는 우리 프로젝트 jar파일을 실행하게 된다.

이렇게 설정해주면 결론적으로 linux/amd64/v3 운영체제 위에서 내 jar파일을 자동적으로 실행하는 docker image를 만들기 위한 준비가 되었다. 이제 한번 image로 만들어보자!

4. 이미지 만들기

이미지를 만들기 위해서 docker build를 사용할 것이다. 문법은 다음과 같다.

docker build -t [dockerHub 사용자명]/[image명]:[tag명] .

이렇게 실행하면 이미지가 생성된다!

다음에는 ec2기기에 필요한 것들을 설치해주고 docker-compose.yml을 작성해보겠다.

profile
나중에 또 모를 것들 모음

0개의 댓글