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 하는 것이 아니다
- green 컨테이너 생성
- green 컨테이너 생성 완료시 blue 컨테이너 중지
- 트래픽을 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 이다