mongoDB를 먼저 docker 이미지에 올린 후
spring boot에서 docker compose를 통해 mongoDB + spring 을 합쳐서 로컬 개발 환경을 구축
여러개의 서버에서 docker 를 활용하여 컨테이너화를 시킨 뒤, 수평적 확장성이 높은 (특히, 여러개의 서버에서 데이터 베이스의 확장성이 높은 경우 유리한 mongoDB를 활용하게 되었다.) mongoDB와 spring 애플리케이션을 합쳐서 여러개의 논리적인 서버를 로컬 개발환경으로 구축하기 위함!
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
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
3️⃣-1️⃣ spring boot 에 mongoDB 연동
application.yml
spring:
data:
mongodb:
uri: mongodb://{MongoDB의 사용자 이름}:{MongoDB의 비밀번호}@{MongoDB 컨테이너의 이름}:27017/{사용할 데이터베이스 이름}
4️⃣ 스프링 애플리케이션 Docker 이미지 빌드
# 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"]
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 설정
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/{사용할 데이터베이스 이름
}
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 컨테이너 생성하기