본문 바로가기
Docker

Docker compose Spring boot ,mysql 연동 방법

by 옹알이옹 2023. 8. 29.
목차

1. docker-compose 란

2. docker-compose 사용 방법

2-1. docker-compose 설정 파일 작성

2-2. 컨테이너 실행 순서를 컨트롤하는 방법

3. docker-compose 실행 확인

 


 1. docker-compose 란

docker-compose란 여러 개의 docker-container를 쉽게 관리하고 실행하기 위한 도구이다.

해당 글에서는 spring boot와 mysql을 연동하기 위해 docker-compose를 이용하였다.

 

* docker-compose의 컨테이너 연동 원리

연동 원리는 매우 간단하다. 이전 글에서 브릿지 네트워크를 생성한 뒤 해당 네트워크에 두 컨테이너를 포함시켜서
두 컨테이너를 연동 하였다.
docker-compose의 연동 원리도 똑같이 두 컨테이너를 동일 네트워크에 포함시키는 것이다.
하지만 docker-compose를 사용하면 따로 네트워크를 생성하여 두 컨테이너를 포함 시키는 작업을 하지 않아도 된다.

docker-compose를 사용하면 자동으로 브릿지 네트워크가 생기고 두 컨테이너는 해당 네트워크에 종속된다.

 

 2. docker-compose 사용 방법

  1. 프로젝트 루트 경로에 docker-compose.yaml 파일을 생성한다.
  2. docker-compose.yaml 파일의 내용을 작성한다.=> 2-1번에서 자세히 다룸
  3. mysql db 생성 스크립트를 작성한다. => 2-2에서 자세히 다룸
  4. docker-compose up을 실행한다.

 

2-1. docker-compose 설정 파일 작성

먼저 코드는 이렇다.

version: '3'
services: # 컨테이너
  db:
    image: mysql
    container_name: mysql-container2
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: helloDev
    ports:
      - "3307:3306"
    command: --init-file /docker-entrypoint-initdb.d/init.sql
    volumes:
        - ./init.sql:/docker-entrypoint-initdb.d/init.sql

  spring-boot-app:
    image: hellodev-image-compose
    container_name: hellodev-container
    ports:
      - "8081:8081"
    links:
      - db
    depends_on:
      - db #spring-boot-app
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/helloDev
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=1234

 

* 각 코드에 대한 설명

service : 해당 compose에 컨테이너를 지칭한다.

db: 첫 번째 컨테이너인 mysql-container를 db라는 이름으로 표시

image: mysql 이미지를 사용하며 미리 생성해 놓은 mysql 이미지를 사용한다. (없으면 hub에서 다운로드)

container_name: compose up을 통해 생성될 mysql container 이름을 명시.

environment: 해당 container의 환경 설정 값을 명시

* command :  해당 container가 생성되면서 실행할 명령을 설정하는 것으로, 여기선 helloDev라는 DB를 생성하기 위해 사용한다. init.sql 파일 안에 create database helloDev라는 sql 명령어를 작성한 뒤 루트 폴더에 저장하였다.

* volumes:  위에서 spring boot 안에 있는 init.sql 파일을 컨테이너 내부 경로로 복사한다
=> 컨테이너 내부에서 해당 파일이 실행됨.


spring-boot-app: 두 번째 컨테이너인 spring-boot container를 spring-boot-app이라는 이름으로 표시

links: 위에 생성한 db 컨테이너와 연결을 설정한다.

depends_on:위에 생성한 db 컨테이너와 의존 관계를 맺어 db 컨테이너가 먼저 실행한 뒤 hellodev-container가 실행이 되는데 중요한 것은 시작 순서만 보장되지 끝나는 시점이 보장이 되지 않아 문제가 생길 수 있다.

 

2-2. 컨테이너 실행 순서를 컨트롤하는 방법

지금 저 위의 세팅으로 docker compose up을 실행하면 mysql container 설정이 끝나기 전에 spring boot 컨테이너가 실행되면서 DB 커넥션 에러가 발생하게 된다.

 

위의 문제를 해결하기 위해 필자는 두 가지 방법을 찾아서 해결해 보았다.

 

1. spring-boot-app 하위의 추가 설정으로 restart: always를 추가한 뒤 실행하면 spring boot container가 정상적으로 실행이 될 때까지 작업을 반복한다.

2. mysql 컨테이너를 먼저 실행한 뒤 spring boot 컨테이너를 실행하는 방법으로 인텔리제이의 기능을 사용하였다.
* 아래의 빨간색으로 표시한 버튼을 누르면 각각 실행할 수 있다.

docker-compose

 

 3. docker-compose 실행 확인

위의 1,2번 방법 중 하나를 통해 성공적으로 docker-compose를 실행했다면 우선 두 컨테이너가 동일 네트워크에 포함되는지 확인한다.

 

1. docker network ls  입력

네트워크 확인

2. 프로젝트명_default라는 이름의 네트워크가 생성된 것이 확인되고 해당 이름을 통해 상세 조회 한다.
=> docker network inspect hellodevteam_default 입력

컨테이너 네트워크


 관련 글

Spring boot 도커 파일 생성 및 배포

 

Spring boot 도커 파일 생성 및 배포

HTML 삽입 미리보기할 수 없는 소스 1. 도커란 구글에 Docker에 대한 개념 설명이 잘 된 것이 많으므로 정의는 간략하게 정리하고 넘어가겠다.우선 간단하게 도커란 컨테이너 기반 가상화 오픈 소스

tytydev.tistory.com

2023.08.28 - [Docker] - Docker spring boot mysql 연동 자세히 설명

 

Docker spring boot mysql 연동 자세히 설명

HTML 삽입 미리보기할 수 없는 소스 1. Docker에서 spring boot, mysql 연동 방법 도커에서 spring boot와 mysql을 연동하여 배포하려면 spring boot 컨테이너와 mysql 컨테이너가 각각 필요하다. 이후 두 컨테이너

tytydev.tistory.com

반응형