마이크로 서비스 배포
Spring Boot로 개발된 마이크로서비스는 독립적인 서비스로, 실행 환경으로는 가상 머신(VM), 컨테이너 기술, 그리고 다양한 클라우드 플랫폼을 고려할 수 있다.
몇 개 정도의 마이크로서비스가 있다면 웹 애플리케이션 서버(WAS)를 VM에 교차 배치하여 효율성과 가용성을 확보하는 방법도 가능하다.
그러나 수백 개 이상의 마이크로서비스를 운영할 때는 서비스 관리 및 고가용성 측면에서 Docker 같은 컨테이너 기술을 사용하는 것이 이점이 있다.
1. 컨테이너
컨테이너는 클라우드 환경에서 애플리케이션 및 애플리케이션 운영 환경을 분리한 공간을 의미한다.
이는 하드웨어 가상화 기술 중 하나이지만, 가상 머신과는 다르게 동작한다. 가상 머신은 게스트 운영 체제를 필요로하며, 하드웨어에 접근하려면 호스트 운영 체제를 통해야한다.
반면, 컨테이너 기반 가상화 기술은 운영 체제 수준의 가상화를 제공하며, 호스트와 같은 커널을 공유한다.
컨테이너를 사용하는 가상화 방식은 게스트 운영 체제를 별도로 설치하지 않아 성능 저하가 없으며, 경량화된 가상화로 분류된다. 또한, 이미지 크기에 따른 네트워크 부하 및 배포 시간이 줄어든다는 장점이 있다.
이러한 컨테이너는 OpenVZ, Virtuozzo, libvirt, Docker, systemd, Warden 등의 기술로 구현되며, 이 중에서도 Docker가 가장 많이 사용되는 컨테이너 기술이다.
2. 도커 개념과 구성 요소
도커는 마이크로서비스 또는 애플리케이션을 컨테이너라는 표준화된 유닛으로 패키징하여 신속하게 구축, 테스트 및 배포할 수 있는 오픈 소스 플랫폼이다. 도커는 도커 클라이언트, 도커 이미지, 도커 데몬, 도커 레지스트리, 도커 네트워크와 오케스트레이션 및 모니터링이 가능한 에코 시스템으로 구성된다.
2.1 도커 엔진
도커 엔진은 클라이언트-서버 애플리케이션으로 구성되며, 도커 데몬(서버), REST API, 그리고 CLI(Command Line Interface)로 구성된다. CLI는 스크립트 또는 CLI 명령어를 사용하여 도커 REST API를 통해 도커 데몬(서버)를 제어하고 상호작용한다. 도커 데몬은 도커 객체(이미지, 컨테이너, 네트워크, 볼륨 등)를 생성하고 관리하는 역할을 담당한다.
2.2 도커 아키텍처
도커는 클라이언트-서버 아키텍처를 사용한다. 도커 클라이언트는 도커 데몬과 통신하며, 도커 데몬은 도커 컨테이너를 빌드, 실행, 배포한다. 도커 클라이언트는 도커 데몬과 동일한 시스템에 위치할 수도 있고, 원격으로 연결할 수도 있다. 도커 클라이언트와 도커 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다.
2.2.1 도커 데몬(서버)
도커 데몬(dockerd)은 백그라운드에서 실행되며 도커 API 요청을 수신 대기하며 도커 객체(이미지, 컨테이너, 네트워크, 볼륨 등)를 관리한다. 도커 데몬은 다른 도커 데몬과 통신하여 도커 서비스를 관리할 수도 있다.
2.2.2 도커 클라이언트
도커 클라이언트는 CLI(Command Line Interface)로 도커 데몬(서버)로 명령을 전달하는 역할을 한다. 예를 들어, 'docker run'이라는 명령을 사용하면 로컬에서는 UNIX 소켓을 통해 도커 API를 호출하고, 원격에서는 TCP 소켓을 통해 도커 데몬(서버)로 전달한다. 도커 데몬은 해당 명령을 수신하고 실행한다.
2.2.3 도커 저장소
도커 저장소는 도커 이미지를 저장하는 곳이다. 도커 허브(Docker Hub)는 공용 저장소로 누구나 사용할 수 있으며, 도커는 기본적으로 도커 허브에서 이미지를 찾도록 설정되어 있다. 물론, 사용자는 개인적인 Private 저장소를 사용할 수도 있다. 'docker pull' 또는 'docker run' 명령을 사용하여 필요한 이미지를 가져올 수 있고, 'docker push'를 사용하여 이미지를 설정된 저장소에 업로드할 수 있다.
2.2.4 도커 객체
도커 객체에는 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 등이 있다. 여기서는 기본적인 이미지, 컨테이너, 서비스를 다룬다.
2.2.4.1 이미지
이미지는 도커 컨테이너를 생성하기 위해 사용되는 읽기 전용 템플릿이다. 이미지는 다른 이미지를 기반으로 하여 추가적인 커스터마이징을 할 수 있다. 예를 들어, 우분투 이미지를 기반으로 아파치 웹 서버와 애플리케이션, 그리고 필요한 세부정보와 의존성을 추가 설정할 수 있다. 사용자는 자신만의 이미지를 만들거나, 다른 사람이 만들어 저장소에 올린 이미지를 사용할 수 있다. 이미지를 만들기 위해서는 Dockerfile에 이미지 생성과 실행에 필요한 단계들을 정의해야 한다. Dockerfile의 각 명령은 이미지에 레이어를 생성하며, Dockerfile을 변경한 후 이미지를 다시 빌드하면 변경된 레이어만 재구성된다. 이러한 도커의 특성은 다른 가상화 기술과 비교했을 때 가볍고 작고 빠르게 이미지를 만들 수 있는 장점을 가지고 있다.
2.2.4.2 컨테이너
컨테이너는 이미지의 실행 가능한 인스턴스이다. 도커 API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있다. 컨테이너를 하나 이상의 네트워크에 연결하거나 새로운 저장소에 연결할 수 있으며, 컨테이너의 현재 상태를 기반으로 새 이미지를 만들 수도 있다. 기본적으로 컨테이너는 다른 컨테이너와 해당 호스트 시스템에서 격리되어 있다. 컨테이너의 네트워크, 저장소 또는 기타 하위 시스템이 다른 컨테이너나 호스트 시스템에서 격리된 상태를 제어할 수 있다. 컨테이너를 삭제하면 영구 저장소에 저장되지 않은 모든 변경 사항이 사라지게 된다.
2.2.4.3 서비스
서비스는 여러 도커 데몬에 걸쳐 컨테이너를 확장할 수 있도록 해주며, 이를 위해 managers와 workers가 함께 동작한다. 모든 데몬은 도커 API를 사용하여 통신한다. 기본적으로 서비스는 모든 worker 노드에서 로드 밸런싱되어 동작한다. 도커 서비스는 사용자에게는 단일 애플리케이션으로 보인다.
3. Spring Boot 애플리케이션 도커 이미지 변환
3.1 도커라이징
도커라이징이란 해당 애플리케이션을 도커 컨테이너에서 실행할 수 있도록 하는 과정이다. 도커 컨테이너에서 애플리케이션을 실행하기 위해서 도커 이미지를 생성해야 하는데 도커 이미지는 Dockerfile을 통해 생성할 수 있다.
Dockerfile은 사용자가 이미지를 조립하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서로서 도커 파일에 나열된 명령문을 차례대로 수행하여 이미지를 생성한다.
3.2 도커 이미지 변환
Jar 파일 생성 방법
Spring Boot를 활용한 MSA 애플리케이션 제작 과정에서 생성한 "카타로그 서비스"를 도커 이미지로 변환하기 전 Gradle 명령어를 실행하여 JAR 파일을 생성한다.
Catalog 프로젝트에서 Gradle 탭으로 가면, build 디렉토리 안에 jar 파일이 존재하는 것을 볼 수 있는데, 이를 아무리 눌러도 루트 디렉토리 > build 디렉토리 > lib 디렉토리가 존재하지 않는다.
이럴 때는 Gradle 탭에서 clean 파일을 실행시켜 build 등 동적 파일들을 전부 제거해 주고, bootJar 파일을 실행시켜 lib 디렉토리를 생성해주면 된다. (lib 디렉토리 안에 jar파일이 생성된다)
Dockerfile 생성하기
프로젝트 폴더 최상단에 Dockerfile을 생성한다.
FROM openjdk
EXPOSE 8081
WORKDIR /app
COPY ./build/libs/Catalogs-0.0.1-SNAPSHOT.jar catalog.jar
ENTRYPOINT ["java", "-jar", "catalog.jar"]
도커 이미지 변환
다음, Dockerfile을 만든 디렉토리로 이동해서 다음 명령을 실행한다
$docker build -t catalog .
docker build 명령의 형식은 docker build <옵션> <Dockerfile 경로>이다.
$docker images
docker images를 입력하면 자신의 모든 도커 이미지들이 나타난다.
생성된 도커 이미지는 docker run 명령으로 실행할 수 있다.
MSA로 서비스를 개발하는 가이드 작성이 끝났다. 네트워크 설정이나 보안 등 추가해야 할 부분은 너무나도 많지만 정말 기본적인 MSA 서비스를 만들어 보았다.
'DEV > MSA' 카테고리의 다른 글
MSA 개발 가이드(8) - Spring Cloud Bus(RabbitMQ) (0) | 2023.06.27 |
---|---|
MSA 개발 가이드(7) - Spring Cloud Config Server/Client (0) | 2023.06.26 |
MSA 개발 가이드(6) - Spring Cloud Gateway(Zuul) (0) | 2023.06.19 |
MSA 개발 가이드(5) - Spring Cloud Eureka(Service Registry) (0) | 2023.06.19 |
MSA 개발 가이드(4) - Resilience4j(Circuit Breaker) (0) | 2023.06.19 |