[cubeTalk] spring boot + mongoDB docker compose를 활용한 컨테이너화

binda·2024년 8월 23일

프로젝트 정리

목록 보기
2/9

🙋‍♀️ 목표

mongoDB를 먼저 docker 이미지에 올린 후
spring boot에서 docker compose를 통해 mongoDB + spring 을 합쳐서 로컬 개발 환경을 구축

🤔 why ?

여러개의 서버에서 docker 를 활용하여 컨테이너화를 시킨 뒤, 수평적 확장성이 높은 (특히, 여러개의 서버에서 데이터 베이스의 확장성이 높은 경우 유리한 mongoDB를 활용하게 되었다.) mongoDB와 spring 애플리케이션을 합쳐서 여러개의 논리적인 서버를 로컬 개발환경으로 구축하기 위함!

  • ecs on fargate를 통해 추후 배포할 예정이나, 비용문제 때문에 로컬에서 개발할 때는 비슷한 역할을 하는 docker compose 로 구축하게 되었다.

1️⃣ MongoDB 설치

docker pull mongodb/mongodb-community-server

2️⃣ 27017 포트로 실행, Volumn 지정

docker run -v db-data:/mongo -d -p 27017:27017 --name mongo mongo:latest
  • MongoDB의 데이터는 db-data라는 이름의 Docker 볼륨에 저장
  • mongo라는 이름의 컨테이너를 생성

3️⃣ 프로젝트 루트 디렉토리에 'docker-compose.yml' 파일 생성

version: '3'
services:
  mongodb:
    image: mongo:latest
    container_name: mongo_new 
    environment:
      MONGO_INITDB_ROOT_USERNAME: {기본 관리자 계정의 사용자 이름}
      MONGO_INITDB_ROOT_PASSWORD: {기본 관리자 계정의 비밀번호}
    ports:
      - "27017:27017"
    volumes:
      - db-data:/mongo
  • docker-compose.yml 파일을 사용하여 MongoDB 서비스를 Docker Compose로 실행하는 설정

3️⃣-1️⃣ spring boot 에 mongoDB 연동

application.yml

spring:
  data:
    mongodb:
      uri: mongodb://{MongoDB의 사용자 이름}:{MongoDB의 비밀번호}@{MongoDB 컨테이너의 이름}:27017/{사용할 데이터베이스 이름}
  • {}안의 내용은 설정에 따라 바꾸면 됨

4️⃣ 스프링 애플리케이션 Docker 이미지 빌드

  • 스프링 애플리케이션 프로젝트의 루트 디렉토리에 Dockerfile생성 및 작성
# Dockerfile
FROM openjdk:17-slim

# 현재 작업 디렉토리를 /app으로 설정
WORKDIR /app

# cubetalk-server.jar 파일을 Docker 이미지의 /app 디렉토리로 app.jar로 이름을 변경하여 복사 
COPY build/libs/cubetalk-server.jar app.jar

# 애플리케이션을 실행하는 명령
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • 이 Dockerfile은 JAR 파일을 컨테이너 내부로 복사하고, 애플리케이션을 실행하는 방법을 정의

4️⃣-1️⃣ JAR 파일 빌드
스프링 애플리케이션의 JAR 파일을 빌드

build.gradle 파일에 아래의 명령어 추가

bootJar {
	archiveFileName = 'cubetalk-server.jar' // JAR 파일 이름 설정
}

위를 실행시키면

build -> libs 에 .jar 파일이 생성된 것을 확인할 수 있다.

4️⃣-2️⃣ Docker 이미지 빌드

docker build -t cubetalk-server:1.0 .

이 명령어는 Dockerfile을 사용해 cubetalk-server이라는 이름의 Docker 이미지에 버전 1.0의 태그를 붙여서 빌드


생성됨을 확인할 수 있다.

5️⃣ spring + mongoDB 설정

  • docker-compose.yml 작성
version: '3'
services:
  mongodb:
    image: mongodb:latest
    container_name: mongo_new
    environment:
      MONGO_INITDB_ROOT_USERNAME: {기본 관리자 계정의 사용자 이름}
      MONGO_INITDB_ROOT_PASSWORD: {기본 관리자 계정의 비밀번호}
    ports:
      - "27017:27017"
    volumes:
      - db-data:/mongo

  app1:
    image: cubetalk-server:1.0 # spring boot app1 에 사용할 docker 이미지 지정
    container_name: spring-app1-container # spring boot app1 컨테이너 이름 지정
    ports:
      - "8081:8080"
    depends_on:
      - mongodb # mongoDB 서비스가 먼저 실행
    environment: # Spring Boot 어플리케이션에 전달할 환경 변수들을 설정
      SPRING_DATA_MONGODB_URI:  mongodb://{사용자이름}:{사용자비밀번호}@{Docker Compose에서 정의된 MongoDB 서비스의 이름}:27017/{사용할 데이터베이스 이름.}
      
  app2:
    image: cubetalk-server:1.0 
    container_name: spring-app2-container 
    ports:
      - "8082:8080"
    depends_on:
      - mongodb 
    environment:
      SPRING_DATA_MONGODB_URI:  mongodb://{사용자이름}:{사용자비밀번호}@{Docker Compose에서 정의된 MongoDB 서비스의 이름}:27017/{사용할 데이터베이스 이름}
      
      
  app3:
    image: cubetalk-server:1.0 
    container_name: spring-app3-container 
    ports:
      - "8083:8080"
    depends_on:
      - mongodb 
    environment: 
      SPRING_DATA_MONGODB_URI:  mongodb://{사용자이름}:{사용자비밀번호}@{Docker Compose에서 정의된 MongoDB 서비스의 이름}:27017/{사용할 데이터베이스 이름![](https://velog.velcdn.com/images/leedabin2/post/fd65d9ed-a806-4466-a1f3-015fd7d58392/image.png)
}

volumes:
  db-data:
  

6️⃣ Docker Compose로 컨테이너 실행
이제 모든 컨테이너를 Docker Compose로 실행할 수 있다.

docker-compose up --build

이 명령어는 docker-compose.yml 파일에 정의된 모든 서비스를 빌드하고, 컨테이너를 실행

6️⃣-1️⃣ 컨테이너 상태 확인
Docker Compose를 통해 실행된 컨테이너의 상태를 확인하려면 다음 명령어를 사용

docker-compose ps

이 명령어는 현재 실행 중인 컨테이너 목록을 보여줌

👉 그외 ++
모든 컨테이너 중지 명령어

docker-compose stop

정상적으로 중지되는 것을 확인할 수 있었다.

이처럼 Docker Compose(여러 컨테이너를 정의 및 실행시킬 수 있는 도구)를 활용하여 Spring Boot 애플리케이션을 3개의 독립적인 컨테이너로 실행하고, 동일한 MongoDB 데이터베이스를 공유하면서 각 컨테이너를 다른 포트에서 실행할 수 있었다!

다음에 배포할 때는 ecs on fargate 를 활용해서 서버리스로 각 task를 관리해볼 예정이다!


참고문헌
[CI/CD] Docker에 MongoDB 설치
Docker Compose로 Spring Boot와 MySQL 컨테이너 생성하기

profile
🍤

0개의 댓글