💻문제점
멀티 모듈을 어떻게 배포할 수 있을까... 하다가 우선 도커를 통해 이미지를 생성하기로 했다.
ContentService, StreamingService, TranscodingService 각각에 Dockerfile을 생성했다.
ContentService
FROM eclipse-temurin:17-jdk-jammy
ARG JAR_FILE_PATH=./build/libs/*.jar
COPY $JAR_FILE_PATH app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
StreamingService
FROM eclipse-temurin:17-jdk-jammy
ARG JAR_FILE_PATH=build/libs/*.jar
COPY $JAR_FILE_PATH app.jar
EXPOSE 8080
EXPOSE 1935
ENTRYPOINT ["java", "-jar", "app.jar"]
TranscodingService
TranscodingService는 ffmpeg이 필요해서 apt를 통해 설치해주었다.
FROM eclipse-temurin:17-jdk-jammy
RUN apt-get update && apt-get install -y ffmpeg
ARG JAR_FILE_PATH=build/libs/*.jar
COPY $JAR_FILE_PATH app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
이후 최상위 프로젝트 하위에 docker-compose.yml을 생성해서 다음과 같이 작성해주었다.
ContentService에서 db를 사용해야하기 때문에 links와 networks를 설정했고, db 이미지를 먼저 생성하고 content-server를 생성하도록 했다.
version: "3.8"
services:
db:
image: postgres:14
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_DB: webflux
POSTGRES_PASSWORD: postgres123
restart: always
volumes:
- db-volume:/home/db
networks:
- commeow-network
content-server:
build:
context: ./ContentService
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
DATABASE_NAME: webflux
DATABASE_PORT: 5432
DATABASE_HOST: db
DATABASE_USERNAME: postgres
DATABASE_PASSWORD: postgres123
links:
- db
depends_on:
- db
networks:
- commeow-network
redis:
image: redis:alpine
command: redis-server --port 6379
container_name: redis_boot
hostname: redis_boot
labels:
- "name=redis"
- "mode=standalone"
ports:
- 6379:6379
streaming-server:
build:
context: ./StreamingService
dockerfile: Dockerfile
ports:
- "1935:1935"
environment:
- TRANSCODING_SERVER=http://transcoding-server:8083
- AUTH_SERVER=http://content-server:8083
depends_on:
- content-server
transcoding-server:
build:
context: ./TranscodingService
dockerfile: Dockerfile
ports:
- "8083:8083"
environment:
- RTMP_SERVER=rtmp://streaming-server:1935
volumes:
- stream-volume:/home/streams
networks:
commeow-network:
volumes:
stream-volume:
db-volume:
터미널에 docker compose up 명령어를 입력했더니, db와 redis, content-server 이미지를 생성이 되는데 streaming-server와 transcoding-server를 생성할 때 오류가 났다.
failed to solve: lstat /var/lib/docker/tmp/buildkit-mount4215466780/build/libs: no such file or directory
무슨 경로를 못 찾겠다는 거지...!
🔍해결
경로 앞에 /var/lib/docker 이런게 붙어있어서 도커 쪽 문제인 줄 알았는데 아니었다!
ContentService는 build를 해서 ./ContentService/build/lib 경로가 있지만 StreamingService와 TransCodingService는 없었다. 그래서 cd로 해당 폴더로 들어가 ./gradlew build를 했는데 오류가 났다.
아무래도 멀티 모듈이라 build.gradle 내용이 바깥에 있는게 문제 같았다.
그래서 프로젝트 최상위 경로에서 해당 모듈들을 빌드해주어야 할 것 같았다.
다음 명령어로 해당 모듈을 빌드해주었다.
./gradlew TranscodingService:bootjar
이후 다시 docker compose up 명령어를 입력하니 다음과 같이 이미지가 빌드되고 컨테이너가 실행되었다.
postman을 통해 확인해봤다. 결과가 제대로 나온다!
DB는 AWS RDS PostgreSQL 을 사용하는데, 제대로 저장이 되나 확인해보니 저장도 정상적으로 된다.
생각해보니 RDS를 쓰고, 레디스는 EC2에 설치할거라 docker-compose.yml 내용을 다음으로 변경했다.
version: "3.8"
services:
content-server:
build:
context: ./ContentService
dockerfile: Dockerfile
ports:
- "8080:8080"
redis:
image: redis:alpine
command: redis-server --port 6379
container_name: redis_boot
hostname: redis_boot
labels:
- "name=redis"
- "mode=standalone"
ports:
- 6379:6379
streaming-server:
build:
context: ./StreamingService
dockerfile: Dockerfile
ports:
- "1935:1935"
environment:
- TRANSCODING_SERVER=http://transcoding-server:8083
- AUTH_SERVER=http://content-server:8083
depends_on:
- content-server
transcoding-server:
build:
context: ./TranscodingService
dockerfile: Dockerfile
ports:
- "8083:8083"
environment:
- RTMP_SERVER=rtmp://streaming-server:1935
volumes:
- stream-volume:/home/streams
volumes:
stream-volume:
'TIL' 카테고리의 다른 글
[TIL - 20230616] (0) | 2023.06.17 |
---|---|
[TIL - 20230615] EC2 + Docker Compose 통한 배포 (0) | 2023.06.16 |
[TIL - 20230612] OBS 방송 시작 관련 문제 해결 (0) | 2023.06.13 |
[TIL - 20230608] Webflux + Websocket + Kafka (0) | 2023.06.08 |
[TIL - 20230606] Webflux + Websocket 전체 채팅 (0) | 2023.06.07 |