Docker swarm을 경험해보기 위한 Simple application입니다.
문의사항 있으시면 댓글로 남겨주시면 코멘트 드리겠습니다.
https://github.com/insummersnow/docker-swarm-simple-app
docker-compose/swarm을 이용한 무중단 빌드/배포/Scale In,Out 등의 Devops를 포함한 healthcheck sample spring boot application
기본 사용방법
- ./devops.sh build
어플리케이션 빌드 & Docker 이미지 생성
- ./devops.sh start
어플리케이션이 올라오기까지 20초가량 소요
-
./devops.sh stop
-
./devops.sh restart
조회) docker ps || docker service ls || docker stack ps simple || docker stack ls
배포시 사용방법
- ".env" file의 version 변경
- ./devops.sh build
- ./devops.sh deploy
한번에 컨테이너 2개씩 배포 어플리케이션 올라오는 시간 감안하여 딜레이 30초 start-first 방식으로 신규 컨테이너 올라온 후 구)컨테이너 Shutdown
scale in/out
- ".env" file의 SCALE 변경
- ./devops.sh scale
컨테이너 수를 줄이는 경우 최근에 뜬 컨테이너 순으로 Shutdown
요구사항 정리
- build script는 gradle로 작성
./spring-boot/build.gradle 스크립트 작성 gradle wrapper를 spring-boot 소스와 함께 이미지로 복사하여, 이미지 내에서 빌드 (Dockerfile 참고)
- 어플리케이션들은 모두 독립적인 Container 로 구성
nginx, spring-boot 컨테이너 독립적으로 구성
- 어플리케이션들의 Log 는 Host 에 file 로 적재
nginx access-log는 off 처리 spring-boot 로그는 호스트의 ./logs 폴더에 떨어지도록 volume 바인딩 spring-boot 로그 관련 설정은 application.preperties에 기재
- Container scale in/out 가능해야 함
docker service scale을 통해 처리 docker embedded DNS이므로 동일 포트로 셋팅
- 웹서버는 Nginx 사용
docker-compose_start.yml에서 nginx 컨테이너 띄우도록 설정
- 웹서버는 Reverse proxy 80 port, Round robin 방식으로 설정
nginx 80 port : host 80 port 바인딩 reverse-proxy 구성은 nginx-conf/reverse-proxy.conf 파일에 추가하였으며, volume 바인딩을 통해 해당 설정이 nginx 이미지에 적용되도록 구성 Round robin 방식은 docker embedded DNS를 통해 해결
- 무중단 배포 동작을 구현 (배포 방식에 제한 없음)
Docker Swarm 사용하여 Stack으로 컨테이너 구성 후 서비스 이미지 Update 하는 방식으로 구현
- 실행스크립트 개발언어는 bash/python/go 선택하여 작성
devops.sh bash script 작성
- 어플리케이션 REST API 추가, GET /health로 호출되도록 처리
actuator 사용 application.properties actuator endpoint path 추가