TIL

[TIL - 20230614] docker compose

Chef.Yeon 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