젠킨스와 도커를 이용하여 배포해보기3

[목표]

  • 젠킨스와 도커를 이용한 빌드/테스트/배포자동화
  • 무중단배포

지난 포스팅 때 만들었던 부분

지난 포스팅에서 만들었던 부분은 깃허브 원격 레포지토리의 master브렌치로 변경이 일어났을 때, 젠킨스가 이를 인지하고 변경된 소스를 받아 빌드한 후 빌드 성공시 운영 서버에게 원격으로 명령을 해, 변경된 소스를 기반으로 한 도커 이미지를 만드는 부분이었다.

오늘은 이 이미지를 가지고 운영중이던 컨테이너를 교체하는 작업을 해볼것이다. 도커 컴포즈(링크)와 스웜(링크), 도커 네트워킹(링크)에 대한 충분한 지식을 요구하기 때문에 한 번씩 본 후에 이 포스팅을 읽으면 되겠다.

계획은 이렇다 컴포즈를 이용하여 api서버 2대, front서버 2대를 실행시켜놓을 것이다. 후에 업데이트를 할때에는 사진에 보이는 색깔과 같이 green , blue로 나누어서 실행할 것이다. 이렇게 하면 green이 업데이트를 하느라 잠시 컨테이너를 교체하고 있을때에도, blue가 제역할을 하고 있다가 green의 업데이트가 끝나는 순간 이번에는 blue가 업데이트를 함으로써 무중단 배포를 할 수 있을것이라 생각했다.

컴포즈를 이용하여 서비스 실행하기

도커가 설치되있더라도 컴포즈는 또 따로 인스톨해야하기 때문에 위의 글의 컴포즈 링크를 따라서 설치해준다.

컴포즈가 설치되었다면 이제 간단하게 컴포즈 파일을 작성해 볼것이다.

docker-compose.yml

version: "3"
services:
  front:
    image: username/repository:tag
    deploy:
      replicas: 1
    ports:
        - "8080:8080"
  api:
    image: username/repository:tag
    deploy:
      replicas: 1
    ports:
        - "9090:9090"

컴포즈를 이용하여 Swarm에 서비스 배포하기. -c에는 docker-compose.yml을 가리키도록 만들고 뒤 서비스명을 만약 study라고 했다면 총 2개의 서비스가 실행이 될 것이다. stduy_api , study_front

docker stack deploy -c docker-compose.yml 서비스명
docker service ls
docker network ls

서비스가 제대로 떠있는지, 네트워크가 디폴트로 생성되었는지 확인한다.

서비스 업데이트하기

현재 실행중인 서비스들을 업데이트하는 것은 간단하다. 위에서 서비스를 다시 배포하면 알아서 update가 실행된다.

docker stack deploy -c docker-compose.yml 서비스명

또한 도커에서는 롤링 업데이트라는 것이 있다. 예로 맨 위의 사진에서와 같이 api서버와 front서버 2대씩을 각각 띄운뒤 업데이트할때 모든 것들이 동시에 업데이트하게 되버리면 서비스가 얼만큼 중지되어있을지 모른다, 하지만 롤링 업데이트를 이용한다면 다음과 같은 상황을 만들 수 있다.

각 컨테이너를 30초마다 1개씩 업데이트한다.

docker service update --force --update-parallelism 1 --update-delay 30s 서비스명

이로써 서비스의 중단 없이 배포할 수 있게 되었다!!! 이 뿐만이 아니라 위와 같은 방식외에도 Blue-green 배포 방식도 있다.

https://subicura.com/2016/06/07/zero-downtime-docker-deployment.html

이 글에서 설명하듯이 nginx를 이용하여 하는 방식으로 예시를 들면

  • nginx는 8080포트와 8081포트를 로드밸런싱하도록 하며,
  • 서비스를 8080, 8081 포트에 올린다.
  • 업데이트할 때 8080포트에 있는 서비스들을 먼저 업데이트한다.
  • 8080포트쪽이 업데이트 되어 올라가면 다음으로 8081쪽을 업데이트한다.

이정도가 아닐까 싶다.

나의 경우에는 위의 상황을 만들기 위해서 localhost에 nginx를 설치한 후 각각 운영서버의 8080포트와 8081포트를 가리키도록 하였다.

윈도우 nginx 설치 및 기본 설정 (링크)

마치며

  • 짧은 시간동안 정말 짧은 지식으로 CI/CD를 경험해보았다. 이번에는 많은 부분들을 도움없이 직접 생각해보면서 적용해보았다(전부다 도움없이 하지는 않았지만..). 결과물은 엉망일지 몰라도 이 과정을 직접 고민하고 적용했다는 것에 나름 만족한다.
  • 필요에 따라 계속 더 좋은 자동화를 위하여 이 카테고리를 지속적으로 업데이트하려고 한다.