DevOps 사전 과제

Devops 에 관심이 많았던 내게 도전 과제가 생겼다. 내용은 아래와 같고, 설계는 github에 올릴예정입니다.

과제 : 웹 어플리케이션을 Docker를 통해 서비스 하려 합니다. 다음 요구사항에 부합하도록 설정, 빌드, 실행 스크립트를 구현해주세요.

요구사항

  • 웹 애플리케이션 예제
  • build script는 gradle로 작성
  • 어플리케이션들은 모두 독립적인 Container로 구성
  • 어플리케이션들의 Log는 Host에 file로 적재
  • Container scale in/out 가능해야함
  • 웹서버는 Nginx 사용
  • 웹서버는 Reverse proxy 80 port, Round robin 방식으로 설정
  • 무중단 배포 동작을 구현( 배포 방식에 제한 없음)
  • 실행스크립트 개발언어는 bash/python/go 선택하여 작성
  • 어플리케이션 Rest api추가
    • [GET /health] Health check
    • Rest API 응답 결과는 JSON Object로 구현
  • README.md 파일에 프로젝트 실행 방법 명시

필요 파일 : docker-compose 야믈 파일, Dockerfile 등

깃헙 주소 : https://github.com/wonizz/spring-docker-example

Docker Spring Boot 시작하기

Wonizz, growuplove7@naver.com v0.0.1, 2019-02-26

[Assignment]

안녕하세요, 워니즈입니다. 과제 해결을 위하여 다음의 내용 학습.

  • gradle 정리
  • 배포 구성
  • nginx 웹서버 구성
  • 도커 스웜 레플리카
  • 도커 무중단 배포

이 프로젝트는 간단한 스프링 부트 페이지를 도커로 container를 생성하여 서비스 하고 있습니다.

[개요]

devOps과제로 spring-boot-starter를 사용자 정의하여 만드는 예제를 포함하고 있는 프로젝트다. spring-boot-starter는 spring-boot-autoconfigure 내에 ~~AutoConfiguration과 ~~Properties 클래스가 함께 존재하며 자동구성 클래스라는 것을 정의하는 spring.factories 설정파일과 애플리케이션 속성파일에서 자동완성을 지원하기 위해 additional-spring-configuration-metadata.json이 함께 필요하다.

사용자정의 spring-boot-starter는 사내에서 프라이빗한 공통사항을 starter로 만들어 스프링 부트 기반으로 애플리케이션 개발시 요긴하게 사용할 수 있다.

[스프링 도커]

link:https://spring.io/guides/gs/spring-boot-docker/ 스프링 도커 관련하여 참고할 수 있는 공식 문서이다. 처음 스프링 부트를 도커를 이용하여 빌드/배포 한다면, 읽기 좋다.

[그레이들 빌드]

link:https://medium.com/@goinhacker/%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94-1-%EB%B9%8C%EB%93%9C-%EC%9E%90%EB%8F%99%ED%99%94-by-gradle-7630c0993d09 Gradle 을 이용하여 빌드하기와 간련하여 참고할 수 있는 유용한 블로그이다. 보통 Java를 이용하여 프로젝트를 작성하다보니, gradle 빌드 내용을 한눈에 보기 쉽게 정리해 두었다.

[도커 스웜]

link:https://subicura.com/2016/06/07/zero-downtime-docker-deployment.html 도커 스웜 레플리카 배포와 간련하여 참고할 수 있는 유용한 블로그이다.

[도커 빌드/배포 구성]

-git pull
	https://github.com/wonizz/spring-docker-example 의 프로젝트를 clone하였고, pull을 이용하여 소스를 최신으로 받는다. 
-gradle build
	현재 경로의 그레이들 툴을 사용하여 source빌드를 수행한다.
-jar파일 생성
	그레이들 빌드 후, build > libs 경로로 jar파일을 생성한다.
-이미지 빌드
	생성된 jar파일을 기준으로 docker image build를 수행한다.
-docker stack deploy(A/B)
	생성된 docker image를 기반으로 compose yml 파일로 배포를 수행한다. 

[사용법]

[빌드]

모든 내용은 프로젝트 내에 devops.sh에 작성되어있습니다.

명령 : ./devops build

빌드 수행시 현재의 경로에서 그레이들 빌드를 수행하여, build > libs 경로에 jar 파일을 생성합니다. 이후에, 도커 이미지 빌드를 수행하여 도커 이미지를 생성합니다. 빌드 수행시, 현재의 날짜 + 시간(시분초)로 태깅을 하고, 최신 빌드 수행을 latest로 추가 생성합니다. 예시)

docker_spring       20190226154956      703ac33aa142        About an hour ago   149MB
docker_spring       latest              703ac33aa142        About an hour ago   149MB
docker_spring       20190226142233      a34d7760509f        2 hours ago         149MB

[배포]

명령 : ./devops deploy [option]

[option] : tag날짜 (optional) tag날짜는 docker images로 확인이 가능합니다. 태그 날짜를 입력하지 않으면, latest로 배포가 됩니다.


[컨테이너 ]

명령 : ./devops restart|start|stop [option]

[option] : app name(blue/green) [required] 현재 도커 서비스가 되고 있는 app을 중지,시작,재시작이 가능합니다. docker service ls를 통해 확인된 서비스의 도커 컨테이너 관련 명령입니다.


[플로우]

개발자가 github에 수정한 소스를 push하면, 빌드/배포를 수행합니다. 빌드 명령으로 도커 이미지를 생성하고, 배포 명령으로 현재 서비를 blue/green배포 방식으로 배포를 합니다. 롤백 시에는 docker images에서 롤백이 필요한 이미지로 재배포를 수행합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다