Hello, Freakin world!

[Spring boot]도커 컴포즈로 서비스 클러스터 구성하기 본문

Spring boot

[Spring boot]도커 컴포즈로 서비스 클러스터 구성하기

johnna_endure 2021. 3. 3. 13:06

 

도커를 이용해 위 그림처럼 동일한 인스턴스로 구성된 클러스터를 만들어보자.

 

우선 서비스를 만들기 위해 스프링 이니셜라이저를 이용해 프로젝트를 생성.

 

build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'springboot.study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

 

그리고 서비스 인스턴스가 잘 떴는지 확인하기 위한 엔드 포인트도 만들어 두자.

 

HelloController.class

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloRestController {

	@GetMapping("/hello")
	public String hello() {
		return "Hello!";
	}
}

 

그리고 설정파일도 끄적끄적.

 

application.yml

server:
  port: ${SERVER_PORT:9000}

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: ${DB_URL:jdbc:h2:tcp://172.30.1.44/~/servicedb}

 

설정은 변할 수도 있으니까 환경 변수를 참조하도록 하자. ${변수: 기본값} 형태로 구성했다.

 

h2 데이터베이스를 구성할 때, 위 그림처럼 동작하도록 하려면 h2가 서버모드로 돌아가야한다.

h2는 동작 방식에 따라 인메모리, 서버 등 각종 모드를 지원하는데 더 자세한 사항은 아래 링크를 통해 확인 가능.

 

 

Features

  Features Feature List H2 in Use Connection Modes Database URL Overview Connecting to an Embedded (Local) Database In-Memory Databases Database Files Encryption Database File Locking Opening a Database Only if it Already Exists Closing a Database Ignore

www.h2database.com

 

그리고 h2 서버가 루프백 주소인 로컬호스트가 아닌 다른 ip에서 접근하는 경우 실행할 때, 옵션을 줘야한다.

 

h2 데이터베이스를 다운받아 그 안에 h2/bin/h2.sh 파일을 열어보자.

 

h2.sh

#!/bin/sh
dir=$(dirname "$0")
java -cp "$dir/h2-1.4.199.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@"

 

위 파일에 -tcpAllowOthers를 마지막에 추가하면 된다.

 

h2.sh (수정 후)

#!/bin/sh
dir=$(dirname "$0")
java -cp "$dir/h2-1.4.199.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@" -tcpAllowOthers

 

위 작업까지 끝났다면 프로젝트 루트에서 ./gradlew build 명령어를 통해 jar파일을 생성한다.

 


이제 Dockerfile, docker-compose.yml 파일을 만들어보자.

 

Dockerfile

FROM openjdk:11
ENV SERVER_PORT=9000
ENV DB_URL='jdbc:h2:tcp://172.30.1.44/~/servicedb'
RUN mkdir /app
WORKDIR /app

COPY serviceinstance-0.0.1-SNAPSHOT.jar /app

CMD [ "java", "-jar" ,"/app/serviceinstance-0.0.1-SNAPSHOT.jar" ]

172.30.1.44는 호스트의 ip 주소다. (데이터베이스는 호스트에서 실행 중)

 

 

docker-compose.yml

version: "3.0"
services:
  ins1:
    build: .
    ports: 
      - 9001:9000
  ins2:
    build: .
    ports: 
      - 9002:9000

인스턴스는 2개를 생성했고 각각 9001, 9002 포트에 바인딩했다.

 

 

docker-compose.yml 이 존재하는 디렉터리로 이동해 docker-compose up 명령어를 이용하면 인스턴스들이 다 띄워진다.

이제 브라우저에서 localhost:9001/hello, localhost:9002/hello 를 각각 호출해보자.

 

성공!

 

서버를 종료시키려면 ctrl + c를 누르면 된다.

docker-compose down 명령어를 통해 올라간 인스턴스(컨테이너)들을 모두 삭제해 정리도 가능.

Comments