[MSA스터디] 4. 도커를 사용한 마이크로서비스 배포

vector13·2022년 9월 27일
0
post-thumbnail

기술 요구사항

이 책에서 사용하는 모든 커맨드는 맥OS 모하비 기반의 맥북 프로에서 실행된다. 그리고 나는 여전히 윈도우다 😅
3장의 기술 요구사항을 충족해야 하며, 도커를 설치해야 한다

예제를 실행하려면 하나를 제외한 모든 CPU를 사용하도록 도커를 구성한다.
메모리는 6GB 이상 할당

https://docs.docker.com/desktop/install/windows-install/ 에서 Docker Desktop for Windows 클릭해서 도커 설치 (최신버전인 4.12.0 버전을 설치하였음)


cmd에서 도커 버전을 확인한다.

Preferences의 Advanced 탭에서 메모리 6GB 이상 할당을 하려했는데

이렇게 뜬다. 일단은 넘어감

export BOOK_HOME=~/Documents/Hands-On-Microservices-with-Spring-Boot-and-Spring-Cloud
git clone https://github.com/PacktPublishing/Hands-On-Microservices-with-Spring-Boot-and-Spring-Cloud 

부분도 일단은 넘어감

1 도커 소개

도커가 가상머신을 대체하는 경량 컨테이너 개념을 일반화했다. 컨테이너는 리눅스 호스트에서 실행된다.

run 커맨드 이용해 우분투 컨테이너 실행

docker run -it --rm ubuntu

그리고 docker desktop에 가면 컨테이너 생성됨

cat /etc/os-release | grep 'VERSION=' 으로 우분투 버전 확인 -> 잘됨

exit으로 컨테이너에서 나온다.
다시 윈도우로 돌아오는 것 확인.

exit명령어를 통해 컨테이너도 삭제 된다.

2 도커와 자바

이 책에서는 도커 태그가 openjdk:12.0.2인 자바 SE 12 이미지를 사용한다.
예전에는 자바와 컨테이너가 잘 맞지 않았지만, 자바 10부터는 상황이 달라졌다. 도커와 자바를 잘 조합해 보자.

도커 없이 자바 커맨드 실행

cmd에서 jshell 입력하고
jshell로 바뀌면 Runtime.getRuntime().avaliableprocessors()

jshell을 나와서
(리눅스는 grep , 윈도우는 findstr )

java -Xmx200m -XX:+PrintFlagsFinal -version | findstr MaxHeapSize

도커에서 자바 커맨드 실행

echo 'Runtime.getRuntime().availableProcessors()' | docker run --rm -i openjdk:12.0.2 jshell -q
을 했는데 Error가 떴다.

앞의 구문을 빼고 docker run --rm -i openjdk:12.0.2 jshell -q 만 진행헀다.


$1 ==> 8이 출력된다.(책은 12)
도커 컨테이너가 CPU 코어를 3개만 사용하도록 도커 옵션 -- cpus 3을 적용하고, JVM에 사용 가능한 프로세서 수를 질의해본다.

docker run --rm -i --cpus 3 openjdk:12.0.2
$1 ==> 3으로 응답한다.

jshell은 /exit으로 나갈 수있음

메모리 제한

도커는 메모리 제한이 없으면 메모리의 1/4을 컨테이너에 할당한다.
docker run -it --rm openjdk:12.0.2 java -XX:+PrintFlagsFinal -version | findstr MaxHeapSize
나는 왜 = 3284140032 일까.... 흑 😥 맞는건지 모르겠다.. (책은 4GB가 나왔는데)


도커 컨테이너가 최대 1GB의 메모리만 사용하도록 -m=1024M 도커 옵션으로 제한해본다.

ddocker run -it --rm -m=1024M openjdk:12.0.2 java -XX:+PrintFlagsFinal -version | findstr MaxHeapSize

오 잘 된다.

자바 SE 9 도커 컨테이너의 문제

자바 9는 CPU 제한을 준수하지 않는다. 그래서 CPU 코어 제한을 무시한다.
자바 SE 9는 도커에서 설정한 메모리 제약 조건을 따르지 않는다. 즉 최대 힙 크기는4GB

==> 도커로 자바 작업 수행시에는 자바 SE 10 이상을 사용해야 한다!

3 도커로 단일 마이크로서비스 실행

마이크로서비스를 도커 컨테이너로 실행 위해서

  • 도커 이미지로 패키징해야함
  • 도커 이미지 빌드에 필수인 Dockerfile을 먼저 만든 후, 도커에 맞춰 마이크로서비스를 구성한다.

컨테이너에서 실행되는 마이크로서비스는 자체 IP 주소, 호스트, 포트를 가짐. -> 다른 마이크로서비스와 같은 호스트에서 실행될 때와는 다른 구성이 필요 (ex. 포트 충돌 발생X, localhost 로는 통신못함)

코드는
https://github.com/PacktPublishing/Hands-On-Microservices-with-Spring-Boot-and-Spring-Cloud/tree/master/Chapter04 에서 확인

먼저 도커 환경을 위한 스프링 프로필을 속성 파일에 매개변수 변경 (포트 -> 8080)
(변경할 매개 변수는 포트뿐이다.)

그다음으로 도커 이미지를 빌드하는 데 사용할 Dockerfile을 생성한다.

도커 이미지 빌드

도커 이미지를 빌드하려면 product-service의 배포 아티팩트, 즉 팻 JAR 파일을 빌드해함

코드가 있는 곳으로 가서 cmd 열고

gradlew :microservices:product-service:build 빌드 성공

이름을 product-service로 지정한 도커 이미지를 빌드

docker desktop도 확인 -> Image 빌드 잘 됨

명령어로도 확인
docker images | findstr product-service

서비스 시작

빌드는 됐고, 이제 서비스 시작

product 마이크로서비스를 컨테이너로 실행
docker run --rm -p8080:8080 -e "SPRING_PROFILES_ACTIVE=docker" product-service


curl 로 확인


잘 된다.
3장에서 본 것과 비슷하지만 한가지 큰 차이점이 있는데"serviceAddress":"267aa7651c6f/172.17.0.2:8080" 항목이다.
==> 포트 8080은 알고있는거고 ip주소 172.17.0.2는 도커의 내부 네트워크에서 컨테이너에게 할당한 ip주소이다. 호스트 네임 267aa7651c6f은
docker ps 에서 컨테이너 id와 동일함을 확인할 수 있다.

컨테이너를 분리 모드로 실행

컨테이너를 시작한 터미널 창을 멈춰 있는 상태로 두지 않고 계속 사용하려면 -> 분리(detached) 모드로 컨테이너를 시작

  • docker run

  • -d 옵션 : 분리모드로 컨테이너 시작

  • --name 옵션 : 컨테이너 이름 지정

  • docker log : 컨테이너 로그 보기 위한 명령어

  • docker rm : 컨테이너를 중지 및 제거

  • -f 옵션 : 컨테이너가 실행중이더라도 도커가 컨테이너 제거 (자동으로 중지, 제거)

여기까지는 단일 마이크로서비스를 도커 컨테이너로 실행하는 방법임.

전체 마이크로서비스 시스템 환경을 관리하려면 ? --> 도커 컴포즈 이용

4 마이크로서비스 환경 관리 using Docker Compose

도커 컴포즈를 사용하면 전체 시스템 환경을 관리할 수 있다. 단일 커맨드로 도커 컨테이너 기반 공조 마이크로서비스 그룹의 로그를 기록하고 빌드, 시작, 종료할 수 있다.

소스코드

도커 컴포즈를 사용하려면
1. 도커 컴포즈가 관리할 마이크로서비스를 설명하는 구성 파일(docker-compose.yml 만들고
2. 나머지 마이크로서비스를 위한 Dockerfile을 만들고
3. 각 마이크로서비스에 docker 프로필을 추가

product-composite-service는 핵심 서비스를 찾아야함. 도커에서 실행할 때는 각 서비스의 호스트 이름이 모두 다르고, 포트 번호는 8080으로 같다. (원래는 localhost에서 모든 서비스 실행해서 호스트이름이 localhost로 모두 같았고 포트번호는 7001~7003이었음) 아래 내용을 yml에 추가

docker-compose.yml 파일도 추가

그럼 이제 빌드하고 실행해보자

마이크로서비스 환경 시작

그래들로 배포 아티팩트를 빌드한 후 gradlew build
지난번 테스트 관련 빌드오류나서 -x test 를 같이 줘서 build gka

도커 컴포즈로 도커 이미지를 생성한다 docker-compose build

docker desktop에서 확인

명령어로도 확인

마이크로서비스 환경을 시작한다
docker-compose up -d

컨테이너의 시작 로그를 모니터링 docker-compose logs -f
와우! 😍

업로드중..
역시 curl을 날려본다.
업로드중..

마이크로서비스 환경을 종료한다
docker-compose down

-- 정리 및 느낀점

도커를 사용해 마이크로서비스를 배포하는 신기한 경험을 해봤다. Dockertile이나 Docker Compose 파일을 이용해 전체 마이크로서 비스 환경을 하나의 커맨드로 시작해보고, 여러 스프링 프로필을 사용해 도커용 구성과 이외의 구성을 분리해서 처리하는 것도 해봤다.
전체 마이크로서비스가 도커 컨테이너에서 실행되고, 도커 엔진 이외의 다른 인프라도 필요 없게 되는게 신기했다.
java 와 도커의 관계와 se10이상으로 해야한다는 교훈도 얻고간다. (나중 플젝 응용때 머리에 박아두기)
테스트는 여전히 왜 안되는지 모르겠고 이 책은 너무 mac기준으로 써있어서 조금 서운하다 😤

** 도커 컴포즈 : 여러 개의 컨테이너의 실행을 한 번에 관리를 할 수 있게 해 주는 yml 포맷의 기술. 흔히 한개 의 컨테이너가 한개의 애플리케이션 담당하려하면 여러개 컨테이너 필요하니까 마이크로서비스에서는 도커 컴포즈가 필필수수!

profile
HelloWorld! 같은 실수를 반복하지 말기위해 적어두자..

0개의 댓글