0부터 시작하는 Docker Swarm 공부 - Rolling Update

Jaehong Lee·2022년 8월 24일
1
post-thumbnail

1. Rolling update

  • rolling update 는 동작중인 컨테이너를 새로운 컨테이너로 업데이트 할 수 있다

    • 컨테이너 내부의 내용을 변경 하는 것이 아니라, 기존 컨테이너는 중지되고, 새로운 컨테이너로 대체되는 것이다. 기존 컨테이너는 roll back 에 대비해 대기하는 상태가 된다. 이는 Hot-Standby 이다
    • roll back 되면, 기존 컨테이너가 실행되고, 새 컨테이너는 대기 상태로 전환된다
  • 이미지를 전달하는 가장 좋은 방법은 사설 저장소를 사용하는 것이지만, 현재는 사설 저장소가 없으므로 Docker Hub 를 사용하자

2. 디렉터리 및 파일 생성

  • blue, green 디렉터리를 만들고, 각각 Dockerfile 을 생성하자
  • 각 디렉터리에 index.html 을 생성하고, 내용을 추가하자

Dockerfile 작성

FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html
CMD httpd -D FOREGROUND
  • 위 내용을 작성해주자
  • green 디렉터리의 Dockerfile 에도 내용을 복사해서 붙여넣자

3. Image Push

  • Docker Hub 에 repository 생성
  • blue Image 를 build 해주자
  • green Image 를 build 해주자
  • 두 Image 를 Tag 를 변경하여 dockerhub 에 Push 해주자
  • 저장소에 잘 Push 되었다

4. Service 배포

docker service create --name web --replicas 3 --with-registry-auth --constraint node.role==worker -p 80:80 lijahong/myweb:blue
  • with-registry-auth 를 통해 인증 정보를 넘겨주었다
  • blue Image 를 통해 Service 를 배포하자
  • 잘 접속된다

5. Portainer 에서 Scale 조정

docker container run -d --restart always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer
  • portainer 컨테이너도 배포하자
  • portainer 에서도 확인하자
  • Swarm 으로 배포한 Service 이므로 Service 로 확인해야 한다
  • Replicas 를 6으로 변경하자
  • 잘 적용되었다
  • 컨테이너가 6 개로 늘어났다

6. Update

docker service update --image lijahong/myweb:green web
  • web Service 의 Image 를 Update 해보자
  • 위와 같이 각 컨테이너에 적용한다
  • 컨테이너를 확인해보면, blue Image 로 배포한 컨테이너는 중지되고, green Image 로 배포한 컨테이너가 실행된다
  • green page 가 출력된다

update 를 하게 되면, 기존에 동작하고 있던 컨테이너는 down 상태가 되고, 새로운 Image 로 생성한 컨테이너가 외부에 서비스를 제공하게 된다. 기존 컨테이너의 내용을 update 하는 것이 아니다

  1. green 컨테이너 생성
  2. green 컨테이너 생성 완료시 blue 컨테이너 중지
  3. 트래픽을 green 컨테이너로 보내게 설정
  • 이 과정을 통해 서비스의 중단 없이 Update 를 수행할 수 있다. 만약, blue 컨테이너 중지부터 시키면, 서비스 중단이 일어나기 때문이다

7. Roll Back

docker service rollback web

  • web Service 를 rollback 시키자
  • green 은 down 상태가 되고, 다시 blue 가 서비스를 제공해준다

docker swarm 에서 roll back 을 하면, down 상태였던 blue 컨테이너가 다시 run 을 하는 것이 아닌, blue Image 로 컨테이너가 생성되어 서비스를 제공해주는 것이다

8. parallelism 설정

docker service create --name web --replicas 6 --update-delay 3s --update-parallelism 3 --with-registry-auth --constraint node.role==worker -p 80:80 lijahong/myweb:blue
  • 업데이트시 task 간 delay 를 3초로 설정하고, task 1 cycle 에 3 개씩 업데이트하게 설정해서 Services 를 배포하자
  • update 를 진행하면, 한 번에 3 개씩 update 를 하며, 첫 cycle 의 3 개 컨테이너에 대한 update 가 끝나면, 3초를 기다렸다가 다음 cycle 의 3 개 컨테이너에 update 를 수행한다
  • 다시 rollback 해주자

docker Swarm mode 에서의 rolling update 기능은 컨테이너를 대기상태가 아닌 중지시켜 shutdown 상태로 만드므로 cold-standby 이다

profile
멋진 엔지니어가 될 때까지

0개의 댓글