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 |