[TIL 2024/10/15] MSA 프로젝트 Docker로 실행하기

2024. 10. 16. 00:40·TIL

msa 프로젝트를 배포하는 과정에서..

각 서비스마다

./gradlew build

java -jar ~~ 를 실행해주고 있자 하니

이게 무슨 노가다인가 싶다.

실행시켜야 할 서비스가 무려 7개다!!!!!

 

사실 로컬에서도 각 서비스를 개별로 run 시켜주고 있으니

서버 배포도 별 다를 게 없는거다..ㅎㅎ^^

 

로컬부터 실행을 도커로 해보자!

 

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"]

 

특강 자료에서 가져왔다;ㅎ

이전 프젝에서는 openjdk:17-jdk-slim 만 사용했던 거 같은데!

FROM이 두 가지 설정되어 있다.

( docker file에서는 FROM을 통해 베이스 이미지가 지정되어야 함 )

 

gradle:8.10.1-jdk17 AS build

Gradle을 사용해 애플리케이션을 빌드한다.

 

openjdk:17-jdk-slim

빌드된 JAR 파일을 실행한다.

 

생각해 보니 openjdk:17-jdk-slim 만 사용했을 때는 꼭 ./gradlew clean bootJar로 빌드 한 후 도커파일을 실행해야 됐었다.

 

이렇게 두 단계로 나눠서 파일을 작성하니 한결 간결하고 편해지는 거 같다.

 

 

다음으론 docker-compose 파일을 작성해보자

services:
  eureka:
    build:
      dockerfile: Dockerfile
      args:
        - FILE_DIRECTORY=./eureka
    ports:
      - "19090:19090"
    networks:
      - image_network
    env_file:
      - .env
  gateway:
    build:
      dockerfile: Dockerfile
      args:
        - FILE_DIRECTORY=./gateway
    ports:
      - "19099:19099"
    networks:
      - image_network
    depends_on:
      - eureka
    env_file:
      - .env
  upload:
    build:
      dockerfile: Dockerfile
      args:
        - FILE_DIRECTORY=./upload
    ports:
      - "19092:19092"
    networks:
      - image_network
    depends_on:
      - eureka
      - gateway
      - data
      - kafka
    env_file:
      - .env

  zipkin:
    image: openzipkin/zipkin
    container_name: image_zipkin
    restart: always
    ports:
      - "9411:9411"
    networks:
      - image_network

  redis:
    image: redis:latest
    container_name: image_redis
    ports:
      - "6379:6379"
    networks:
      - image_network

networks:
  image_network:
    driver: bridge

 

실제 서비스들은 더 많은데 너무 길어져서 생략했다.

기존거에서 추가한 부분은 eureka, gateway, upload 부분이다.

depends_on은 설정한 서비스가 먼저 시작되도록 지정하는 것이다.

 

그리고 redis에 network도 추가해주었다.

같은 네트워크가 아니면 접근이 안 되는듯 했다..

 

이제 각 서비스가 Docker 컨테이너로 격리된 환경에서 실행되어, localhost를 통해 다른 서비스와 통신하는 것이 불가하다!

docker compose.yml 파일의 service 명을 통해서 각 컨테이너와 통신할 수 있다.

 

예를들어

eureka:
  client:
    service-url:
      defaultZone: http://eureka:19090/eureka/  # Eureka 서버 URL
    register-with-eureka: true  # Eureka 서버에 등록
    fetch-registry: true  # Eureka 서버로부터 레지스트리 정보 가져오기

기존엔 http://localhost:19090/eureka/로 통신하였지만

docker로 올리고 난 뒤면 http://eureka:19090/eureka/로 통신이 가능하다.

 

이렇게 되면 prod 파일도 필요없겠는데? 싶었다..

 

 

백그라운드 실행

docker compose up —build -d

 

 

특정 서비스만 다시 빌드하고 싶다면

docker-compose up --build -d eureka

 

 

특정 서비스 로그 확인하고 싶다면

docker-compose logs eureka

 

 

실시간 로그 보기

docker-compose logs -f eureka

 

 

특정 라인 로그 보기

docker-compose logs --tail 100 eureka

 

'TIL' 카테고리의 다른 글

Docker : no space left on device  (0) 2024.10.22
docker compose, kafka 그리고 TimeoutException  (2) 2024.10.18
[WIL] 프로젝트 2주차  (0) 2024.10.07
[TIL 2024/10/01] docker db 연결 오류  (1) 2024.10.03
[TIL 2024/09/30] 이미지 서버 모듈  (1) 2024.10.01
'TIL' 카테고리의 다른 글
  • Docker : no space left on device
  • docker compose, kafka 그리고 TimeoutException
  • [WIL] 프로젝트 2주차
  • [TIL 2024/10/01] docker db 연결 오류
dev_ajrqkq
dev_ajrqkq
알고리즘 천재가 될 거야
  • dev_ajrqkq
    기록이 자산이다
    dev_ajrqkq
  • 전체
    오늘
    어제
    • 분류 전체보기 (147) N
      • Front-end (0)
      • Back-end (11)
        • Spring (1)
        • Java (8)
      • CS (9)
        • 데이터베이스 (5)
        • 네트워크 (4)
      • Algorithm (80) N
      • 이것저것 (0)
      • 버그잡기 (1)
      • TIL (37)
      • 후기 (1)
      • 취준 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      TypeScript
      코딩테스트준비
      개발자취업
      티스토리챌린지
      Til
      오블완
      항해99
      99클럽
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    dev_ajrqkq
    [TIL 2024/10/15] MSA 프로젝트 Docker로 실행하기
    상단으로

    티스토리툴바