본문 바로가기

프로젝트 기록

SpringBoot Dockerize 기록

Spring Boot를 도커라이즈 했던 과정이 결코 쉽지는 않았어서, 기록으로 좀 남겨두고자 한다.

 

1. 빌드 파일(jar) 생성

gradle > Tasks > build > bootJar 클릭

 

 

2. 프로젝트 최상단 위치에 Dockerfile과 docker-compose.yml 작성

 

Dockfile

FROM openjdk:8
ARG JAR_FILE=build/libs/ssafe-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

JAR_FILE에는 jar파일의 경로를 넣어준다.

 

 

docker-compose.yml

version: "3"
services:
  database:
    image: mysql
    container_name: "ssafe_db"
    environment:
      MYSQL_DATABASE: moramoram
      MYSQL_USER: moramoram
      MYSQL_PASSWORD: moramoram
      MYSQL_ROOT_PASSWORD: moramoram
    command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
    volumes:
      - ./db/data:/var/lib/mysql:rw
      - ./db/setup:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
  application:
    build: .
    container_name: "ssafe_app"
    ports:
      - "8080:8080"
    depends_on:
      - database
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://database:3306/moramoram?Timezone=UTC&characterEncoding=UTF-8
      SPRING_DATASOURCE_USERNAME: moramoram
      SPRING_DATASOURCE_PASSWORD: moramoram

mysql을 docker-compose를 통해 새로 생성하여 사용할 것이기 때문에, database의 environment 설정들은 앞으로 사용할 정보로 채워넣으면 된다.

 

또한, application에서 build : . 로 되어있는데, 이는 . 위치에 있는 Dockerfile을 찾아 이미지를 빌드할 거란 의미이므로, Dockerfile 생성 후 image를 생성하는 docker run 명령어를 입력하지 않아도 된다. docker-compose up으로 db와 app image 한 번에 다 된다.

 

- 기억할 것 1

application의 environment에서 DATASOURCE 관련 정보는, 앞에서 database에 입력한 정보와 동일하게 입력해야 한다. 

이 database를 사용해서 빌드할 거니까, 당연한 원리이다.

 

처음에 docker-compose.yml - environment - datasource url이 localhost:3306로 되어 있었는데, docker의 mysql을 쓸 것이므로 database:3306으로 바꿔야 한다.

 

 

- 기억할 것 2

database : volumns에 

    - ./db/setup:/docker-entrypoint-initdb.d

이걸 추가하지 않아서 docker compose를 실행해도 error가 났었다.

error내용은 db connection은 되는데 table이 없다는 에러였고, 현재 database에는 app과 맞는 스키마와 테이블이 하나도 형성되어 있지 않아서 발생하는 에러였다.

따라서, ./db/setup 폴더를 형성해 주고, setup.sql을 생성한 다음 원래 spring boot에서 쓰던 sql dump 파일을 넣어준다.

docker compose가 실행되며 컨테이너에서 가장 처음 실행되는 것이 docker-entrypoint인데, 이게 initdb.d를 실행하며 이 dump 파일과 mount되기 때문에 제대로 connection이 동작하게 된다.

 

 

 

-기억할 것 3

application.yml에 datasource 정보는 

로컬로 실행하려면 url을 localhost로, username과 password는 로컬 db의 정보를 넣어줘야 한다.

그런데 docker로 실행하려면 당연히 url, username, password는 모두 docker-compose.yml에 맞게 바꿔서 실행해야 제대로 실행된다!! 

 

 

+)

위 파일 작성 시 주로 참고한 사이트 : 

https://da2uns2.tistory.com/m/entry/Docker-%EB%8F%84%EC%BB%A4%EC%97%90-Spring-Boot-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0

 

[Docker] 도커에 Spring Boot 구축하기

목차 1. Spring Boot 코드 작성 2. jar 파일 생성 3. Dockerfile 만들기 4. 컨테이너 실행하기 1. Spring Boot 코드 작성 간단한 Hello World 코드를 구현했다. 소스코드는 다음과 같다. package hello.hellosprin..

da2uns2.tistory.com

https://doinge-coding.tistory.com/entry/Docker-docker-compose%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-Spring-boot-Mysql-%EB%B0%B0%ED%8F%AC-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1

 

Docker, docker compose를 이용한 Spring boot, Mysql 배포 환경 구성해보기

docker와 docker compose에 대한 공부를 하면서 까먹지 않게 블로그로 기록합니다. 이번 포스팅에서는 Spring boot로 만든 프로젝트를 Mysql과 연동하고, docker-compose로 작성해 배포하는 과정을 기록해보도

doinge-coding.tistory.com

 

3. cli에서 해당 프로젝트 위치로 이동 후, docker-compose up 명령어 실행

- 설정 파일(docker-compose.yml)에만 변경이 있는 경우 :

docker-compose down
docker-compose up

이것만 해 주면 업데이트 되어서 다시 실행됨.

 

- yml말고 다른 소스코드들이 변경되면, 이미지를 다시 빌드해서 실행

docker-compose down
docker build .
docker-compose up

이미지 없애고 다시 compose up 해줌