Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BSVR-25] docker 추가 #11

Merged
merged 22 commits into from
Jul 7, 2024
Merged

[BSVR-25] docker 추가 #11

merged 22 commits into from
Jul 7, 2024

Conversation

wjdwnsdnjs13
Copy link
Member

📌 개요 (필수)

  • docker-compose.yml 추가
  • dockerfile 추가

🔨 작업 사항 (필수)

  • server와 DB docker compose 추가!
    • server는 ubuntu 20.04
    • mysql은 8.x 버전
  • dockerfile
    • ubuntu 20.04
    • jdk 17
    • build 된 jar 파일을 복사해서 실행

⚡️ 관심 리뷰 (선택)

  • 멀티 모듈이라 build를 어디하는 게 좋을지 몰라서 일단 전체 build 대상으로 작성했는데, 이 부분 확신이 안 가는 상태라서 코멘트가 필요할 듯!ㅎㅎ

@wjdwnsdnjs13 wjdwnsdnjs13 self-assigned this Jul 3, 2024
@github-actions github-actions bot added the size/S label Jul 3, 2024
@wjdwnsdnjs13 wjdwnsdnjs13 changed the title [BSVR-25] docker-compose 추가 [BSVR-25] docker 추가 Jul 3, 2024
Copy link
Collaborator

@EunjiShin EunjiShin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 이거 로컬에서 잘 돌아가? 나 Pull 받아서 docker-compose up --build 해보니까 실행 안되는데..

스크린샷 2024-07-05 오전 12 43 50

Dockerfile Outdated
Comment on lines 15 to 16
# 빌드 결과물 복사
COPY build/libs/*.jar spot-server.jar
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

루트 build/libs/*.jar에는 plain-jar만 있어서 실행 안 될 것 같응뒤?!
executable jar를 활용하도록 수정해야 할 것 같아~

@pminsung12
Copy link
Collaborator

docker compose up 실행결과 아래와 같은 에러가 났어용
image

Copy link
Collaborator

@pminsung12 pminsung12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NACK: 실행불가

MYSQL_PASSWORD: test1234 # 임시 비밀번호
server:
container_name: spot-server-docker
image: ubuntu:20.04
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

도커 파일로 우분투 빌드해서 새로 우분투 이미지를 가져오는 게 아니라 그걸 그대로 쓰면 될 것 같아!
build . 를 사용하는 게 어때?

Dockerfile Outdated
Comment on lines 5 to 10
FROM ubuntu:20.04

# RUN 명령어는 명령어를 실행시키는 구문입니다.
# 기본적으로는 apt를 사용하는 것으로 했지만, yum 등으로 바꿔도 됩니다. (ubuntu에선 주로 apt를 사용합니다)
# RUN은 빌드 시 적용 -> 도커 이미지에 반영됨!
RUN apt update && apt install -y openjdk-17-jdk
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

우분투를 깔아서 jdk를 설치하기보다 그냥 openJDK이미지를 바로 사용하는 게 어때? 더 가볍고 자바 설치과정도 필요 없을 것 같아

ports:
- 8080:80 # 80번 - 80번 매칭
volumes:
- ./app:./app
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그러면 서버 부분은 아래처럼만 설정하면 돼

  server:
    build: . # 디렉토리에 있는 도커파일 이용해서 이미지 빌드
    container_name: spot-server-docker
    ports:
      - 8080:8080
    depends_on: # 항상 mysql 실행하고 서버 실행되게 .
      - mysql
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/spot
      SPRING_DATASOURCE_USERNAME: test1234
      SPRING_DATASOURCE_PASSWORD: test1234
      ```

@pminsung12
Copy link
Collaborator

해결해서 여기에 남길게.
1. 드라이버 충돌

  • H2 인메모리 데이터베이스를 사용하도록 되어 있는데 Docker 환경에서는 MySQL을 사용하기 때문에 이로 인한 데이터베이스 드라이버와 연결 정보가 불일치

infrastructure/jpa/src/main/resources/application-jpa.yaml -> 아래 내용을 h2가 아닌 mysql 버전으로 다시 작성!!

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:spot
    username: sa
    password:

  jpa:
    database: h2
    hibernate:
      ddl-auto: create
    database-platform: org.hibernate.dialect.H2Dialect
    open-in-view: false
    defer-datasource-initialization: true

  h2:
    console:
      enabled: true
      path: /h2-console

infrastructure/jpa/build.gradle.kts

  • h2의존성 추가했던 거 삭제하고 mysql 의존성 추가
dependencies {
    implementation(project(":domain"))
    implementation(project(":usecase"))

    // spring
    implementation("org.springframework.boot:spring-boot-starter-data-jpa:_")

    runtimeOnly("com.mysql:mysql-connector-j")
}

tasks.bootJar { enabled = false }
tasks.jar { enabled = true }

2. Dockerfile 아래와 같이 수정

  • 코멘트에 남김
  • 혹시 꼭 우분투로 한 이유가 있다면 알려줘!
FROM openjdk:17-jdk-slim

WORKDIR /app

COPY application/build/libs/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","app.jar"]

3. docker-compose.yml

  • 위에 코멘트 남김!
# docker-compose.yml

services:
  mysql:
    container_name: SPOT-db
    image: mysql:8 # 선호하는 버전 있을 경우 선정 예정!
    ports:
      - 3306:3306 # 혹시나 기존에 MySQL 사용 중일 경우 앞자리를 다른 포트로 바꿔야함.
    volumes:
      - ./db/mysql/data:/var/lib/mysql # 기존 데이터 파일과 격리를 위해 db/mysql/data 로 설정함!
    command:
      - '--character-set-server=utf8mb4'
      - '--collation-server=utf8mb4_unicode_ci'
    environment:
      TZ : "Asia/Seoul"
      MYSQL_ROOT_PASSWORD: test1234  # 임시 비밀번호
      MYSQL_DATABASE: spot # DB 이름 선정 시 변경 예정.
      MYSQL_USER: test1234		# 임시 유저
      MYSQL_PASSWORD: test1234		# 임시 비밀번호
  server:
    build: . # 디렉토리에 있는 도커파일 이용해서 이미지 빌드
    container_name: spot-server-docker
    ports:
      - 8080:8080
    depends_on: # 항상 mysql 실행하고 서버 실행되게 함.
      - mysql
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/spot
      SPRING_DATASOURCE_USERNAME: test1234
      SPRING_DATASOURCE_PASSWORD: test1234

@EunjiShin
Copy link
Collaborator

해결해서 여기에 남길게. 1. 드라이버 충돌

@pminsung12 요거 로컬에서 잘 돌아가면 너가 바로 여기 브랜치에 커밋 찍어주는거 어때?!
이미 작성 다 한건데 준원이가 한 번 더 복붙할 필요는 없을 것 같아서..!!

pminsung12
pminsung12 previously approved these changes Jul 5, 2024
@pminsung12
Copy link
Collaborator

커밋찍었어요~ 테스트 해주세요! @wjdwnsdnjs13 @EunjiShin

Copy link

github-actions bot commented Jul 5, 2024

Test Results

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 7b8166a. ± Comparison against base commit eca8047.

♻️ This comment has been updated with latest results.

@wjdwnsdnjs13
Copy link
Member Author

wjdwnsdnjs13 commented Jul 5, 2024

어머나 뭐지... 알람 실수로 껐나봐
메일이 계속 안 오고 있어서 모르고 있었다ㅠㅠ

혹시 꼭 우분투로 한 이유가 있다면 알려줘!

사실 나도 jdk가 편할 거라 생각했는데, 우리 처음 회의했을 때 ubuntu 기반으로 하기로 작성해놨던 거 때문에 우분투 했던거야 ㅋㅋ
우분투가 필요한 이유가 있어서 그런가 싶어서 우분투로 했는데, jdk 되면 그거로 하면 될 거 같애 ㅎㅎ
고마워...!!

커밋찍었어요~ 테스트 해주세요! @wjdwnsdnjs13 @EunjiShin

윈도우도 환경 변수 설정이랑 포트 변경만 하면 다 돌아가는 거 확인했어!

땡큐땡큐~~

@EunjiShin
Copy link
Collaborator

EunjiShin commented Jul 5, 2024

@pminsung12 @wjdwnsdnjs13 둘다 고생했어! 근데 지금도 안돌아간다 ^.ㅜ
로그 확인해보니까 MySQL이 완전히 세팅되기 전에 (외부 커넥션을 받을 수 없는 상태) Spring boot에서 jdbc connection을 시도해서 스프링 실행이 안되는 것 같아.

스프링이 연결 실패해서 죽은 상황인데 db 세팅이 진행되고 있는 사진

스크린샷 2024-07-05 오후 8 14 28

docker-compose에 사용된 depends_on은 컨테이너가 시작하는 순서만 지정해주지, 실행 가능한 상태까지 기다려주지는 않는 걸로 알고있어.

1. mysql 컨테이너 실행 요청
2. (첫 요청이라면) mysql 관련 초기화 설정 ing...
3. spring 컨테이너 실행 요청
4. spring은 application.yml 설정에 있는 DB로 연결 시도
5. 아직 DB가 실행 가능한 상황이 아니라서 커넥션 실패 -> 스프링 어플리케이션 가동 종료
6. mysql 세팅 완료 (= 요청 받을 수 있는 상태)

요런 이슈를 해결하기 위해서 이것저것 방법이 있는 것으로 알고있는데..! 그거 함 찾아보고 적용해줄래?

(! 혹시 너희 로컬에서 재현 안되면 말해줘~ 내가 쓱 추가할게!)

Comment on lines 21 to 24
decorator:
datasource:
p6spy:
enable-logging: true
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 지워진거는 다시 추가해줘!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다시 추가 완료! 확인해줘 ㅎㅎ

@wjdwnsdnjs13
Copy link
Member Author

@pminsung12 @wjdwnsdnjs13 둘다 고생했어! 근데 지금도 안돌아간다 ^.ㅜ 로그 확인해보니까 MySQL이 완전히 세팅되기 전에 (외부 커넥션을 받을 수 없는 상태) Spring boot에서 jdbc connection을 시도해서 스프링 실행이 안되는 것 같아.

스프링이 연결 실패해서 죽은 상황인데 db 세팅이 진행되고 있는 사진

스크린샷 2024-07-05 오후 8 14 28 docker-compose에 사용된 depends_on은 컨테이너가 시작하는 순서만 지정해주지, 실행 가능한 상태까지 기다려주지는 않는 걸로 알고있어.
1. mysql 컨테이너 실행 요청
2. (첫 요청이라면) mysql 관련 초기화 설정 ing...
3. spring 컨테이너 실행 요청
4. spring은 application.yml 설정에 있는 DB로 연결 시도
5. 아직 DB가 실행 가능한 상황이 아니라서 커넥션 실패 -> 스프링 어플리케이션 가동 종료
6. mysql 세팅 완료 (= 요청 받을 수 있는 상태)

요런 이슈를 해결하기 위해서 이것저것 방법이 있는 것으로 알고있는데..! 그거 함 찾아보고 적용해줄래?

(! 혹시 너희 로컬에서 재현 안되면 말해줘~ 내가 쓱 추가할게!)

healthcheck로 해봤는데 됐을까??
일단 윈도우에서는 계속 정상작동 돼!

@pminsung12
Copy link
Collaborator

pminsung12 commented Jul 6, 2024

잘 된다! 컨테이너 이름 db라고만 하면 헷갈릴 것 같아서 좀 더 직관적으로 바꿨어! approve 해주면 머지할게!
@wjdwnsdnjs13 @EunjiShin

Copy link
Collaborator

@EunjiShin EunjiShin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! ✨

@github-actions github-actions bot added size/M and removed size/S labels Jul 7, 2024
@pminsung12
Copy link
Collaborator

변경사항: docker-compose up --build를 할 때 gradle build 추가

쉘 스크립트 명령어

맨 처음 pull 받고 초기설정할 때 or 의존성 변경이나 도커 설정 변화 등 큰 변화 : docker-compose up --build
개발 중일 때 docker-compose restart server (mysql 컨테이너는 실행상태)
server 컨테이너 로그 보는 법 docker-compose logs -f server

빠른 개발을 위한 팁

#!/bin/bash
docker-compose restart server
docker-compose logs -f server

위와 같은 sh파일을 프로젝트 루트 파일에 놓고 chmod +x dev-restart.sh 명령어를 사용해 실행 권한 주입하면 이제 코드 변경하고 실행시킬 때 ./dev-restart.sh 명령어만 이용!

팀원마다 운영체제가 달라서 git에 포함시키지 않았어~ 쓸 사람은 각자 정의해서 쓰면 될 듯!

@pminsung12 pminsung12 merged commit 8f4dfe7 into main Jul 7, 2024
4 checks passed
@pminsung12 pminsung12 deleted the feat/BSVR-25 branch July 7, 2024 18:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants