도커로 MSA 프로젝트 띄우기

haruceki·2024년 9월 17일
0

각 서비스를 각각 실행시키는 방법에서 도커 컴포즈를 이용하여 한 번에 띄우는 방법을 정리하였다.

  • Dockerfile
    도커 이미지를 만들기 위한 도커 파일을 작성
# build 에서 사용할 이미지
FROM gradle:8.10.1-jdk17 AS build

WORKDIR /app

ARG FILE_DIRECTORY

COPY $FILE_DIRECTORY /app

RUN gradle clean bootJar

# 실제 컨테이너로 만들 이미지 베이스
FROM openjdk:17-jdk-slim

# build 단계로부터 파일을 가져올 수 있다. AS build로 선언해놨기에 --from=build
COPY --from=build /app/build/libs/*SNAPSHOT.jar /app.jar

CMD ["java", "-jar", "app.jar"]
  • docker-compose.yml
    각 서비스의 경로와 이름을 설정하고 게이트웨이의 포트를 지정해준다.
services:
  eureka:
    build:
      dockerfile: Dockerfile
      args:
        - FILE_DIRECTORY=./eureka-server

  gateway:
    build:
      dockerfile: Dockerfile
      args:
        - FILE_DIRECTORY=./gateway
    ports:
      - "19091:19091"

  auth:
    build:
      dockerfile: Dockerfile
      args:
        - FILE_DIRECTORY=./auth

  tms:
    build:
      dockerfile: Dockerfile
      args:
        - FILE_DIRECTORY=./tms
  • eureka 서버 yml 파일
    defaultZone의 localhost 인 부분을 docker-compose.yml에서 지정한 서비스 이름으로 바꿔준다.
spring:
  application:
    name: eureka-server

server:
  port: 19090

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka:19090/eureka/ # <- localhost를 eureka로 변경

#eureka:
  #instance:
    #hostname: localhost
  • eureka 클라이언트 서비스 yml 파일
    데이터베이스를 도커로 띄울 경우 docker-compose.yml에 health check와 depens-on 설정과 함께 데이터 베이스를 함께 띄우면 된다.
    하지만 로컬에서 따로 연결하던 데이터베이스를 따로 두고 설정을 localhost로 하고 도커를 띄울 경우, 도커 컨테이너에서 localhost를 실행하는 것은 컨테이너 내의 localhost이므로 PC의 localhost(127.0.0.1)와는 다르다. 이때 host.docker.internal를 이용하면 도커 외부의 호스트 머신에 접근 가능하다.
server:
  port: 19095

spring:
  application:
    name: auth-service

  datasource:
    url: jdbc:mysql://host.docker.internal:3306/tms # <- localhost를 host.docker.internal로 변경
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true

jwt:
  secret:
    key: "401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429080fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65"


eureka:
  client:
    service-url:
      defaultZone: http://eureka:19090/eureka/ # <- localhost를 eureka로 변경

이때 mysql이 접근되지 않을 경우
1. my.ini 파일 경로를 찾은 후

SHOW VARIABLES LIKE 'basedir';
SHOW VARIABLES LIKE 'datadir';
  1. 해당 파일의 위치에서 다음 설정을 추가하고,
bind-address = 0.0.0.0
  1. mysql client 콘솔에 접속하여 로컬 mysql에 원격 접근 권한 부여 명령어 실행
mysql -u root -p

GRANT ALL PRIVILEGES ON *.* TO 'your_user'@'%' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;
  1. mysql 포트가 열려있는지 확인
netstat -an | find "3306"
profile
희망도 절망도 없이 매일 코딩을 한다.

0개의 댓글