본문 바로가기
Docker

Docker-compose를 작성해서 SpringBoot + MySql DB 서버 구동

by YoonJong 2023. 1. 14.
728x90

프로젝트 중 Docker를 이용해서 로컬서버로 띄우는데까지만 4일? 이 꼬박걸렸다.

인텔리제이에서 실행하면 잘되었는데, 도커로 실행하면 도무지 이해가 안되는 에러가 많이 발생했다.

구글이랑 스택오버플로우랑 다찾아보고 컨테이너를 몇십개는 삭제하고 실행해봤다.

 

정말 많은 삽질을 했는데 구글에는 정말 많은 코드가 있어서 복붙해서 사용하더라도 자신의 환경에 맞추어 사용할 줄 알아야 한다.

또한 실행되는 코드를 찾더라도 코드를 망가뜨려보는? 것도 계속해야 조금 더 이해할 수 있는 계기가 될 수 있다.


docker-compose 를 사용하는 이유는 여러 컨테이너들을 묶어서 관리하기 위해서이다.

 

먼저 확인하고 주의해야할 점

- Dockerfile 과 docker-compose는 꼭 같은 경로에 있어야 한다.

- jar 생성을 할때는 clean 후 build 또는 bootjar 할 것

 

Dockerfile

내 프로젝트는 현재 java17 버전을 사용중이다.

FROM openjdk:17-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Docker-compose

여기서 정말 많이 애먹었다.

정상적으로 실행되는 코드를 찾은 후, 왜 성공적으로 실행이 될까? 라고 생각했다.

나는 하나하나 다 바꾸어가면서 테스트를 해보았는데, 같은색의 네모칸은 서로 동일해야 정상적으로 실행이 되었다.

코드를 조금 더 상세히보자.

 

Docker-compose 한 파일에 같이 있더라도 서로 연동되는 것은 아니다.

따라서 서로 연결을 해주어야 한다.

연결을 안해주면 분명 mysql 은 도커컨테이너가 떠있는데 애플리케이션에서는 db 를 찾을 수 없어 연결이 안된다고 에러를 계속 내뱉는다.

 

서로 도커 컨테이너를 연결하는 방법으로 depends_on 과 networks 를 이용하는 것으로 이해했다.

database 라고 설정했으므로 ( 빨간박스 ) application 에서 depends_on 으로 database를 입력한다.

또한, enviroment (환경설정) 에서또한 데이터베이스에 관한 설정을 해주어야 한다.

networks 도 같은 네트워크를 사용한다고 설정해주어야 한다. 

나는 test_network 로 서로 연결했으며, 가장 아래 코드처럼 test_network를 사용한다고 적어주었다.

 

version: '3'

services:
  database:
    container_name: mysql_db
    image: mysql/mysql-server:8.0
    restart: always
    environment:
      MYSQL_DATABASE: shop
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: 1234
      TZ: 'Asia/Seoul'
    ports:
      - "3306:3306"
    command:
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"
    networks:
      - test_network

  application:
    container_name: docker-compose-test
    restart: always
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql_db:3306/shop
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "1234"
    depends_on:
      - database
    networks:
      - test_network

networks:
  test_network:

 

위와 같이 Dockerfile 과 docker-compose 를 작성했으면 아래 처럼 순서대로 실행하면된다.

1. 인텔리제이 화면 가장 오른쪽 Gradle 

2. clean -> build 또는 bootjar ( 둘다 잘 실행되었다. )

정상적으로 성공이 되면 libs 폴더에 jar 파일이 생성된다.

 

3. 터미널에서 docker-compose up -d 를 입력해준다 ( -d 옵션은 백그라운드에서 실행하는 명령어 )

조금 기다리다보면 아래 처럼 확인할 수 있다.

 

도커 데스크탑으로 들어가서 확인해보자.

 

이미지 파일부터 보면 docker-compose 에서 작성했던 애플리케이션과 mysql  총 2개가 생성된 것을 볼 수 있다.

 

이제 컨테이너를 확인해보자.

shop 클릭

 

아래를 보면 처음에는 드라이버가 서버랑 연결되지 못했다고 에러가 발생한다.

도커에서 같이 컨테이너를 띄우면 mysql 이 실행/진행 되는데 어느정도 시간이 소요되기 때문에 3~4번 정도 연결이 되지 않으며, 에러를 발생시킨다.

 

애플리케이션은 실패가 되면 계속해서 리스타트를 해주는데, docker-compose에서 restart: always 로 설정해놓았기 때문이다. 

mysql 이 실행이 완료되면 아래와 같이 정상적으로 8080 포트가 실행된 것을 확인할 수 있다.

 

 

나는 swagger 문서를 로컬로 띄울거기 때문에 정상적으로 로컬에 뜨는지 접속해본다.

정상적으로 작동한다.

728x90

댓글