반응형
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
반응형
'Micro Service Architecture > Docker' 카테고리의 다른 글
12. [docker] drain (0) | 2021.03.16 |
---|---|
11. [docker] docker 명령어 모음 (0) | 2021.03.16 |
8. [docker] swarm : service create (0) | 2021.03.16 |
7. [docker] Orchestration (Docker Swarm) 구축 : Manager, Worker Node 구성 (0) | 2021.03.16 |
5. [docker] container run (0) | 2021.03.16 |