매일 조금씩

Spring boot 에서 docker로 mariadb 세팅, 사용 본문

Spring Framework

Spring boot 에서 docker로 mariadb 세팅, 사용

mezo 2021. 12. 6. 15:23
728x90
반응형

API를 개발하면서 docker와 docker compose를 처음 다루었는데

까먹지 않기 위해 기록해둔다.

 

다음 과정은 docker가 깔려있다는 가정하에 진행된다. 

docker를 설치하면 docker compose가 내장되어 있다. 

 

 

 

1. Spring boot Application 생성

내가쓰는 IntelliJ에서 Spring boot 프로젝트를 하나 만든다.

spring web만 dependencies에 추가하여 만들었다.  

 

 

 

2. docker-compose.yaml 작성

다음으로 프로젝트내에 docker-compose라는 이름의 yaml(또는 yml)파일을 만든다. 

> docker-compose.yaml

version: '3.8'
services:
  db:
    image: mariadb
    container_name: meeting-document-db
    restart: always
    environment:
      MYSQL_DATABASE: 'meeting_document'
      MYSQL_PASSWORD: 'root'
      MYSQL_ROOT_PASSWORD: '1234'
    ports:
      - '3306:3306'
    networks:
      - meeting-document-network
    healthcheck:
      test: "/usr/bin/mysql --user=root --password=root --execute \"SHOW DATABASES;\""
      interval: 2s
      timeout: 20s
      retries: 10
    volumes:
      - ./data:/docker-entrypoint-initdb.d
#  application:
#    container_name: meeting-document-application
#    build:
#      context: ./
#      dockerfile: Dockerfile
#    ports:
#      - "8080:8080"
#    networks:
#      - meeting-document-network
#    depends_on:
#      - "db"
networks:
  meeting-document-network:
    name: meeting-document-network
    driver: bridge

프로젝트에 docker-compose.yml 파일을 만들어서 위와 같이 작성한다. 

 

  • db : database 설정 부분 (db로 네이밍)
  • application : spring boot 서비스 설정 (application으로 네이밍)

 

1) database 설정 부분

image : mariadb 이미지를 사용 (뒤에 버전을 명시하지 않으면 최신 버전으로 사용)

environment (mariadb 환경변수 지정) :

  • MYSQL_DATABASE: meeting_document란 이름의 데이터베이스 생성
  • MYSQL_ROOT_PASSWORD: root password 지정

ports : 외부로 노출할 포트 지정 'host port : container port'가 됨. (3306:3306)

networks : 컨테이너 간 통신을 컨테이너의 이름으로 하기 위해서는 custom_network를 생성하고 해당 network에 컨테이너를 생성해야 한다. 

 

2) spring boot 서비스 설정 (application으로 네이밍)

build : 빌드에 대한 키워드 정의

ports : host의 8080 포트를 컨테이너의 8080 포트와 매핑한다.

depends_on : 

  • 의존성 추가, 스프링 부트는 실행할 때 database connection을 요청함.
  • 따라서 mariadb 컨테이너가 로드된 후 접속을 시도할 수 있게 추가해줌

environment   : 

도커의 경우 각 컨테이너별 개별 ip를 할당받기 때문에

스프링 환경변수로 접속할 db의 url을 지정해 준다.

  • SPRING_DATASOURCE_URL : 접속할 db의 url 지정, 위에서 지정한 데이터베이스 서비스 네임을 사용해도 됨.
  • SPRING_DATASOURCE_USERNAME : 사용자 이름
  • SPRING_DATASOURCE_PASSWORD : 사용자 비밀번호

networks : database 설정에서 설명한 내용과 동일.

 

3) networks

compose에 사용할 네트워크 meeting-document-network를 생성함.

 

 

3. application.properties 에 mariadb configuration 추가

# create, update, validate, none
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.database=mysql

# mariadb configuration
spring.datasource.url=jdbc:mariadb://localhost:3306/meeting_document?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

#spring.servlet.multipart.location=/Users/hyunseokoh/git/teespace/meeting-document-server/documents
spring.servlet.multipart.max-file-size=100MB

위와 같이 mariadb configuration을 적어준다. 

 

 

4. 소스 빌드 후 실행

1) 프로젝트 안에서 git bash를 실행시킨 후, docker-compose up 명령어를 실행시킨다.

docker 실행 명령어

// -d 붙이면 백그라운드로 실행

$ docker-compose up -d

 

// 상태 체크 

$ docker-compose ps

 

// stop, start

$ docker-compose stop

$ docker-compose start

 

// docker-compose 서비스 제거

$ docker-compose down (volumn, network 까지 다 삭제)

 

// 서비스 중인 컨테이너의 로그 확인

$ docker-compose logs

 

 

다음과 같이  docker ps로 container_id를 알아낸후

git bash를 하나 더 띄워서

다음 명령어로 docker 서버에 접속해서 설정해둔 database에 root 로 접속한다. 

$ docker exec -it (CONTAINER_ID) bash

 

728x90
반응형