ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] Docker Compose를 사용하여 Spring 컨테이너와 로컬 MySQL 연결하기
    Backend/Docker 2023. 6. 13. 20:30

    시작

    Spring 프로젝트를 진행하면서 초기에는 도커없이 서버에서 로컬로 mysql과 스프링을 연결했다. 하지만 이후 도커 적용이 필요해지면서 dockerfile과 docker-compose.yml 파일을 작성했다. 이때 대부분 MySQL도 컨테이너로 생성해 스프링 컨테이너와 연결하는데, 나의 경우 로컬에서 사용하던 DB를 계속사용해야 했기 때문에 스프링 컨테이너와 로컬 MySQL을 연결해야했다. 

     

    Spring Dockerfile

    Dockerfile의 경우 프로젝트에서 사용하는 jdk를 지정하고 gradle을 통해 build된 jar 파일을 컨테이너에 포함시켜 jar파일을 실행시킨다. 여기서 중요한 점은 대부분 파일 경로 상 docker-compose.yml 밑에 Dockerfile이 존재하게 되는데 Dockerfile에서의 경로는 docker-compose.yml 경로를 기준으로 작성해야 한다. 

    FROM openjdk:17.0.1-jdk-slim
    
    ADD /build/libs/test-0.0.1-SNAPSHOT.jar test.jar
    
    ENTRYPOINT ["java","-jar","-Dspring.profiles.active=local", "/test.jar"]

     

    Spring Datasource 설정

    MySQL을 사용한다면 application.yml에 datasource를 설정해주어야 한다. 사용하는 데이터베이스 이름과, 사용자명, 패스워드를 설정한다.

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Seoul
        username: test
        password: test
    
      jpa:
        properties:
          hibernate:
            show_sql: true
            format_sql: true
        hibernate:
          ddl-auto: update

     

    Docker Compose 설정

    Docker Compose는 docker-compose.yml 파일을 통해 설정한다. 

    version: '3'
    
    services:
      backend:
        build:
          context: .
          dockerfile: ./backend/Dockerfile
        expose:
          - 8080
        network_mode: "host"
        volumes:
          - ./build/libs/:/backend/
        restart: always
        stdin_open: true
        tty: true
    • 작성했던 스프링 Dockerfile을 가지고 image를 생성하여 백엔드 컨테이너를 생성
    • 여기서 중요한 점은 network_mode를 host로 설정하는 것(로컬 MySQL과 연결되도록)
      • 이전에 Spring에서 datasource를 정의할 때 localhost로 접속하도록 설정
      • 로컬의 localhost와 도커 컨테이너 안의 localhost가 다르기 때문에 도커 컨테이너에서는 localhost를 컨테이너 안으로 생각함
      • 따라서 로컬의 localhost를 공유할 수 있도록 설정하는 것이 필요
      • 다른 방법으로는 spring datasource 설정 시에 도커 컨테이너의 ip를 적어주는 방식도 있음
    • network_mode 설정 시에는 port 설정을 같이 할 수 없음
      • port 설정이 있다면 “host” network_mode is incompatible with port_bindings 에러가 발생
      • 호스트 모드로 동작시키려면 포트 맵핑을 지워야함

     

     

     

    댓글

Designed by Tistory.