본문 바로가기

Micro Service Architecture/Docker

9. [docker] Update(Rolling) & Rollback

반응형

Docker 공식 문서 참조 : https://docs.docker.com/engine/reference/commandline/service_update/

1. 컨테이너 update
- 배포와 같이 이미지 빌드를 통한 Registry에 새로운 버전이 올라올경우 운영에 update하는 작업

## nginx:latest -> nginx:1.13 버전으로 업데이트
## 참고 docker.io 에 nginx 검색
[root@docker1 bin]# docker search nginx:1.13
INDEX       NAME                                  DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/999lhh/nginx                nginx:1.13                                      0                    [OK]
docker.io   docker.io/huxizhun/nginx              huxizhun/nginx:1.13.8-v2                        0                   
docker.io   docker.io/ircmiguel/base-project      Docker environment: nginx:1.13, php:7.1-fp...   0                   
docker.io   docker.io/lancevo/alpine-nginx-node   alpine:3.7, nginx:1.13, node: 9.11.1            0                    [OK]
docker.io   docker.io/mythmoon/nginx              from nginx:1.13                                 0                    [OK]
docker.io   docker.io/nalbam/sample-web           nginx:1.13                                      0                    [OK]
docker.io   docker.io/nalbam/sample-webpack       nginx:1.13 / node:10                            0                    [OK]
 
 
## 현재 service 상태
[root@docker1 bin]# docker service ps nginx_test1
ID            NAME           IMAGE         NODE     DESIRED STATE  CURRENT STATE              ERROR  PORTS
axncfpoe4gxp  nginx_test1.1  nginx:latest  docker1  Running        Running about an hour ago        
iw0q79ccb4wf  nginx_test1.2  nginx:latest  docker3  Running        Running about an hour ago        
wginhalbmtd6  nginx_test1.3  nginx:latest  docker2  Running        Running about an hour ago        
 
## 이미지 업데이트
[root@docker1 bin]# docker service update --image nginx:1.13 nginx_test1
nginx_test1
 
## nginx_test1 의 service 상태 보기
[root@docker2 ~]# docker service ps nginx_test1
ID            NAME               IMAGE         NODE     DESIRED STATE  CURRENT STATE                ERROR  PORTS
npgsg1r4dccu  nginx_test1.1      nginx:1.13    docker1  Running        Running 30 seconds ago             
axncfpoe4gxp   \_ nginx_test1.1  nginx:latest  docker1  Shutdown       Shutdown about a minute ago        
mtaxuso9svpb  nginx_test1.2      nginx:1.13    docker3  Running        Preparing 29 seconds ago           
iw0q79ccb4wf   \_ nginx_test1.2  nginx:latest  docker3  Shutdown       Shutdown 28 seconds ago            
wginhalbmtd6  nginx_test1.3      nginx:latest  docker2  Running        Running about an hour ago          
 
## update 작업은 service가 속한 node에서 동시에 일어나는 것이 아니라 1개의 node 씩 차례로 일어난다.
## 참고 : --update-parallelism 옵션을 주면 동시에 작업 수를 정할 수 있다.
## 과정은 아래와 같다.
## 1. docker1 nginx:latest -> shutdown
## 2. docker1 nginx:1.13 -> Preparing -> Running
## 3. docker2 nginx:latest -> shutdown
## 4. docker2 nginx:1.13 -> Preparing -> Running
## 5. docker3 nginx:latest -> shutdown
## 6. docker3 nginx:1.13 -> Preparing -> Running
 
## 기존 버전을 shutdown하고 update 버전을 running, 끝나면 바로 다른 node에서 해당 과정이 반복된다.
## default 로 1개의 node씩 update 과정이 일어나며 update는 entrypoint나 cmd에서 과정까지만을 다루며 nginx 데몬이 뜨고 내부적으로 진행하는 준비과정에서는 관여하지 않는다.
## 따라서 nginx 내부적은 준비가 완료되는 시점의 delay 값을 주는 rolling update 방식이 필요하다

 

2. Rolling Update & Rollback

## Rollback 과정을 Rolling update로 진행
## Rolling update에서 설정하는 delay 값은 update나 rollback시 동일 적용 됨.
## 참고 : rollback에 대한 정보값은 default로 5개 까지만 기억하는데 이값은 아래와 같이 확인 가능함.
## Task History Retention Limit: 5
[root@docker3 ~]# docker system info
...
Swarm: active
 NodeID: miuah480u64gb1ppxzuiullun
 Is Manager: true
 ClusterID: zn7zyn9fsl1obxkblkks0zj5u
 Managers: 3
 Nodes: 3
 Orchestration:
  Task History Retention Limit: 5
...
 
## 현재 서비스 프로세스 정보
## 아래와 같이 task 당 5개까지 기억된다.(nginx_test1.1 이라는 task 는 꼭 같은 node에서 일어나는 것은 아님)
[root@docker1 bin]# docker service ps nginx_test1
ID            NAME               IMAGE         NODE     DESIRED STATE  CURRENT STATE                    ERROR  PORTS
4a7dm5btk0nu  nginx_test1.1      nginx:latest  docker1  Running        Running 6 minutes ago                  
qm3vrz6dloao   \_ nginx_test1.1  nginx:1.13    docker3  Shutdown       Shutdown 6 minutes ago                 
x7k9fkexbgen   \_ nginx_test1.1  nginx:latest  docker1  Shutdown       Shutdown 8 minutes ago                 
npgsg1r4dccu   \_ nginx_test1.1  nginx:1.13    docker1  Shutdown       Shutdown 10 minutes ago                
axncfpoe4gxp   \_ nginx_test1.1  nginx:latest  docker1  Shutdown       Shutdown 32 minutes ago                
xpb6uu2xbe0y  nginx_test1.2      nginx:1.13    docker3  Running        Starting less than a second ago        
zpzvnx5c7koj   \_ nginx_test1.2  nginx:latest  docker3  Shutdown       Shutdown less than a second ago        
15jm67tw5l7r   \_ nginx_test1.2  nginx:1.13    docker3  Shutdown       Shutdown 6 minutes ago                 
i51ww8fgzqc9   \_ nginx_test1.2  nginx:latest  docker3  Shutdown       Shutdown 8 minutes ago                 
mtaxuso9svpb   \_ nginx_test1.2  nginx:1.13    docker3  Shutdown       Shutdown 10 minutes ago                
rj9qdbjhhdyx  nginx_test1.3      nginx:1.13    docker3  Running        Starting less than a second ago        
pivz1mcl9hv4   \_ nginx_test1.3  nginx:latest  docker1  Shutdown       Shutdown less than a second ago        
n8op9i6fpcld   \_ nginx_test1.3  nginx:1.13    docker3  Shutdown       Shutdown 6 minutes ago                 
wroq9wqjxkq3   \_ nginx_test1.3  nginx:latest  docker2  Shutdown       Shutdown 8 minutes ago                 
v3dt4qxjr0or   \_ nginx_test1.3  nginx:1.13    docker2  Shutdown       Shutdown 10 minutes ago           
 
 
## rollback은 1.31 이후 버전부터 롤백 명령어가 바뀌었다.
## 1.31버전 이후는 docker service rollback <service name>
## delay 값을 7초로 주고 동시에 작업가능한 task 수를 2개로 주었다.
[root@docker1 bin]# docker service update --rollback --update-delay 7s --update-parallelism 2 nginx_test1
nginx_test1
 
 
## docker1,2 -> nginx:1.13 으로 변경 되었으며 docker3은 nginx:latest 로 delay 되고 있다.
[root@docker1 bin]# docker service ps nginx_test1
ID            NAME               IMAGE         NODE     DESIRED STATE  CURRENT STATE            ERROR  PORTS
1vy48y3b9fm4  nginx_test1.1      nginx:1.13    docker1  Running        Running 3 seconds ago          
lq3wx3ilgmcx   \_ nginx_test1.1  nginx:latest  docker1  Shutdown       Shutdown 4 seconds ago         
4qkk3rmuc2tt   \_ nginx_test1.1  nginx:1.13    docker1  Shutdown       Shutdown 9 minutes ago         
4a7dm5btk0nu   \_ nginx_test1.1  nginx:latest  docker1  Shutdown       Shutdown 14 minutes ago        
qm3vrz6dloao   \_ nginx_test1.1  nginx:1.13    docker3  Shutdown       Shutdown 21 minutes ago        
ioegp3fede1v  nginx_test1.2      nginx:1.13    docker1  Running        Running 3 seconds ago          
jqxbo4ejwvp1   \_ nginx_test1.2  nginx:latest  docker1  Shutdown       Shutdown 4 seconds ago         
xpb6uu2xbe0y   \_ nginx_test1.2  nginx:1.13    docker3  Shutdown       Shutdown 9 minutes ago         
zpzvnx5c7koj   \_ nginx_test1.2  nginx:latest  docker3  Shutdown       Shutdown 15 minutes ago        
15jm67tw5l7r   \_ nginx_test1.2  nginx:1.13    docker3  Shutdown       Shutdown 21 minutes ago        
kws66rtzmdn4  nginx_test1.3      nginx:latest  docker3  Running        Running 9 minutes ago          
rj9qdbjhhdyx   \_ nginx_test1.3  nginx:1.13    docker3  Shutdown       Shutdown 9 minutes ago         
pivz1mcl9hv4   \_ nginx_test1.3  nginx:latest  docker1  Shutdown       Shutdown 15 minutes ago        
n8op9i6fpcld   \_ nginx_test1.3  nginx:1.13    docker3  Shutdown       Shutdown 21 minutes ago        
wroq9wqjxkq3   \_ nginx_test1.3  nginx:latest  docker2  Shutdown       Shutdown 23 minutes ago        
 
 
## docker 1.28버전 이후부터 --rollback-delay --rollback-parallelism 가 생겨 update, rollback 시 서로 다르게 delay 설정이 가능해 졌다.
## delay, Parallelism 값은 아래와 같이 확인 가능
[root@docker1 bin]# docker service inspect --pretty nginx_test1
 
...
UpdateConfig:
 Parallelism:   2
 Delay:     7s
 On failure:    pause
 Max failure ratio: 0
...

 

3. service task의 수정내용없이 재시작 하는 방법

## nginx등의 config 파일이 container에 있지 않고 volume으로 host나 nfs를 참조하고 있다면 참조 하고 있는 config 파일의 변경이 일어나면 컨테이너를 재시작해줄 필요가 있다.
## standalone 컨테이너는 restart 옵션을 제공하므로 task가 할당된 노드에서 재시작해주면되지만 replica가 많은 경우 번거롭다.
## 롤링 업데이트 방법을 이용하여 옵션값 변경없이 다음과 같이 실행한다.
[root@docker1 ~]# docker service update --force --update-parallelism 1 --update-delay 30s test2
test2
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged
반응형