Project

[Project] Docker 적용기

육빔 2024. 10. 16. 15:53
728x90
반응형

프로젝트를 진행하다가 잠시 서버의 부재로 docker를 이용하여 서버를 열어야되는 상황에 놓였다. 내가 말했지만 약간은 후회했다. 팀원들이 고생해서.. 걍 내꺼 서버나 열껄. 내가 공부를 대충하고 제안해서 이꼴이 난 듯 하다..; 그래서 후딱 자소서쓰고 Docker 공부하면서 정리하고자 한다.

일단 Docker란?

Docker는 소프트웨어를 컨테이너라는 가벼운 격리 환경에서 패키징, 배포 및 실행할 수 있도록 도와주는 오픈 소스 플랫폼입니다.

 

다들 아시겠지만 뭐 관리할 필요없이 Docker파일로만 각종 다른 환경에서 사용하고자 하는 것이다. 근데 이번에 프론트엔드 측에서 java가 없으면 실행되지 않는 말도 안되는 문제가 발생했다. 지금 생각해봤는데 java 또한 도커파일로 실행시키고 -> spring 파일을 실행하면 될려나? docker-compose능력이 내가 부족해서 생긴 것 같았다.

우선 스프링에서 Docker 이미지 생성하려면 어떻게 해야될까? 내가 왜 jar 파일 안생기냐고 찡찡거렸는데 당연한거였다. 물론 Docker파일에서 Build 후 바로 이미지를 만드는 멀티스테이지 방식이 있지만 보통의 프로그래머들은 관심사 분리를 좋아하는데 찾아보니 이것 또한 관심사 분리였다. 빌드와 실행을 나누기 위해 이렇게 되면 장점이 많았다. 단순히 git에서 불러와서 빌드를 같이 해버리면 빌드 -> 이미지 -> 컨테이너 과정이 계속 필요하다. 그러나 분리는 하면 빌드 -> 컨테이너 재시작만 하면 되는 거였다.ㅎㅎ; 그래서 이점이 있다고 판단하여 분리를 진행

 

터미널에

./gradlew build


다음

도커파일 작성

FROM bellsoft/liberica-openjdk-alpine:21
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENV spring.jwt.secret=***
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

 

각각은 21 버전으로 libs 안에 jar 파일을 실행시킬때 환경변수 jwt 설정, 포트 8080으로 이미지를 실행시키면 맨 마지막 명령어를 실행시키겠다 라는 뜻.

 

하지만 실행시키면 아래와 같은 에러가 발생한다.

2024-10-13 17:24:20 java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of

 

그 이유는 Docker가 둥둥 떠다니며 실행되고 있지만 mysql 과 연동이 불가능하다. 그 이유는 도커는 격리된 환경이기에 외부로 접근할 수 없다. 그래서 jdbc에러가 발생하는것. 이를 해결하고자 docker-compose로 묶어서 관리한다.

 

여기서 주의점은 docker-compose는 docker랑 다른거여서 docker를 깐다고 설치가 안될 수 가 있다.

 

docker-compose --version

로 확인하자.

 

그 후 

services:
  db:
    image: mysql:8.0
    container_name: dibb-db-dev
    environment:
      MYSQL_ROOT_PASSWORD: 
      MYSQL_DATABASE: 
    ports:
      - "3307:3306"
    volumes:
      - db-data:/var/lib/mysql
      - ./backup.sql:/docker-entrypoint-initdb.d/backup.sql
    networks:
      - dev-network

  backend:
    container_name: dibb-backend-container-dev
    build: .
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: docker
      SPRING_DATASOURCE_URL: jdbc:mysql://dibb-db-dev:3306/dibb?useSSL=false&allowPublicKeyRetrieval=true
      SPRING_DATASOURCE_USERNAME: 
      SPRING_DATASOURCE_PASSWORD: 
      SPRING_JPA_HIBERNATE_DDL_AUTO: update
    depends_on:
      - db
    command: ["sh", "-c", "/wait-for-it.sh dibb-db-dev:3306 -- java -jar /app.jar"]
    networks:
      - dev-network

networks:
  dev-network:

volumes:
  db-data:

 

팀원이 아주 docker-compose 작성을 잘했다.. 배웁니다

 

MySQL과 Spring 백엔드 개발 환경을 동시에 시작하기 위한 코드인데 위부터 보면 db 이미지로 초기 설정, 포트, 미리 설정해둔 sql 파일과 volume을 설정. 그리고 docker의 격리된 환경에서 backend와 통신하고자 network 설정을 해준다. 그 뒤 8080포트로 docker파일을 실행시키고(같은 위치에 있어야됨) 데이터베이스 연결 정보를 넣어줍니다. 그리고 wait 명령어로 위 3306의 데이터가 많아질 경우 세팅시간이 길어져 spring과 연결 문제가 발생할 수 있음으로 db가 완전히 세팅이 전부 된 다음에 실행시키게 세팅을 해줬다. 이렇게 되면 아주 잘 실행되는 것을 볼 수 있다.

728x90
반응형