Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 안드로이드
  • spring
  • 코딩테스트
  • 백준
  • 에라토스테네스의 체
  • 파이썬
  • 프리코스
  • 문자열
  • 코틀린
  • SQL
  • Android
  • Wil
  • til
  • 다이나믹 프로그래밍
  • 프로그래머스
  • kotlin
  • enum
  • elasticsearch
  • 레포지토리
  • webflux
  • rsocket
  • kibana
  • java
  • 내림차순
  • ec2
  • MariaDB
  • grafana
  • 코틀린 인 액션
  • 우아한테크코스
  • Docker

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

[TIL - 20230614] docker compose
TIL

[TIL - 20230614] docker compose

2023. 6. 15. 06:22

 

💻문제점

멀티 모듈을 어떻게 배포할 수 있을까... 하다가 우선 도커를 통해 이미지를 생성하기로 했다.

 

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:
728x90

'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
    'TIL' 카테고리의 다른 글
    • [TIL - 20230616]
    • [TIL - 20230615] EC2 + Docker Compose 통한 배포
    • [TIL - 20230612] OBS 방송 시작 관련 문제 해결
    • [TIL - 20230608] Webflux + Websocket + Kafka
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바