docker service update
docker service update
docker service update는 실행 중인 서비스를 갱신하는 명령이에요. 스웜(Swarm) 서비스의 설정·이미지·마운트·네트워크·롤백 등을 바꿀 때 사용해요.
출처: 문서
본문
docker service update는 지정한 매개변수에 따라 서비스를 갱신해요. 매개변수는 docker service create와 동일해요. 자세한 내용은 그쪽 설명을 참고하세요.
보통 서비스 갱신은 변경 내용이 태스크 재생성을 요구할 때만 새 태스크로 교체돼요. 예를 들어 --update-parallelism 설정만 바꾸면 개별 태스크는 영향을 받지 않으므로 태스크를 재생성하지 않아요. 하지만 --force 플래그는 어떤 변경이 없어도 태스크를 강제로 재생성해요. 이걸로 서비스 매개변수 변경 없이 롤링 재시작을 수행할 수 있어요.
docker service update [OPTIONS] SERVICE
참고: 클러스터 관리 명령이라 스웜 매니저 노드에서 실행해야 해요.
지원하는 옵션은 다음과 같아요.
| 옵션 | 기본값 | 설명 |
|---|---|---|
--args |
서비스 명령 인자예요. | |
--cap-add |
API 1.41+ Linux 역량(capability)을 추가해요. | |
--cap-drop |
API 1.41+ Linux 역량을 제거해요. | |
--config-add |
API 1.30+ 서비스에 config 파일을 추가하거나 갱신해요. | |
--config-rm |
API 1.30+ config 파일을 제거해요. | |
--constraint-add |
배치 제약을 추가하거나 갱신해요. | |
--constraint-rm |
제약을 제거해요. | |
--container-label-add |
컨테이너 라벨을 추가하거나 갱신해요. | |
--container-label-rm |
키로 컨테이너 라벨을 제거해요. | |
--credential-spec |
API 1.29+ 관리 서비스 계정용 자격 증명 스펙(Windows 전용)이에요. | |
-d, --detach |
API 1.29+ 서비스가 수렴될 때까지 기다리지 않고 즉시 종료해요. | |
--dns-add |
API 1.25+ 사용자 지정 DNS 서버를 추가하거나 갱신해요. | |
--dns-option-add |
API 1.25+ DNS 옵션을 추가하거나 갱신해요. | |
--dns-option-rm |
API 1.25+ DNS 옵션을 제거해요. | |
--dns-rm |
API 1.25+ 사용자 지정 DNS 서버를 제거해요. | |
--dns-search-add |
API 1.25+ 사용자 지정 DNS 검색 도메인을 추가하거나 갱신해요. | |
--dns-search-rm |
API 1.25+ DNS 검색 도메인을 제거해요. | |
--endpoint-mode |
엔드포인트 모드예요 (vip 또는 dnsrr). | |
--entrypoint |
이미지의 기본 ENTRYPOINT를 덮어써요. | |
--env-add |
환경 변수를 추가하거나 갱신해요. | |
--env-rm |
환경 변수를 제거해요. | |
--force |
API 1.25+ 변경이 없어도 강제로 갱신해요. | |
--generic-resource-add |
API 1.32+ Generic 리소스를 추가해요. | |
--generic-resource-rm |
API 1.32+ Generic 리소스를 제거해요. | |
--group-add |
API 1.25+ 컨테이너에 보조 사용자 그룹을 추가해요. | |
--group-rm |
API 1.25+ 이전에 추가한 보조 사용자 그룹을 제거해요. | |
--health-cmd |
API 1.25+ 헬스 체크를 실행할 명령이에요. | |
--health-interval |
API 1.25+ 체크 사이 간격이에요 (ms/s/m/h). | |
--health-retries |
API 1.25+ unhealthy로 보고하는 데 필요한 연속 실패 횟수예요. | |
--health-start-interval |
API 1.44+ 시작 기간 중 체크 사이 간격이에요 (ms/s/m/h). | |
--health-start-period |
API 1.29+ 시작 기간이에요 (ms/s/m/h). | |
--health-timeout |
API 1.25+ 한 체크가 실행될 최대 시간이에요 (ms/s/m/h). | |
--host-add |
API 1.25+ 사용자 지정 host-to-IP 매핑을 추가해요 (host:ip). |
|
--host-rm |
API 1.25+ 사용자 지정 host-to-IP 매핑을 제거해요 (host:ip). |
|
--hostname |
API 1.25+ 컨테이너 호스트네임이에요. | |
--image |
서비스 이미지 태그예요. | |
--init |
API 1.37+ 각 서비스 컨테이너에 init을 넣어 시그널 전달과 프로세스 회수를 처리해요. | |
--isolation |
API 1.35+ 서비스 컨테이너 격리 모드예요. | |
--label-add |
서비스 라벨을 추가하거나 갱신해요. | |
--label-rm |
키로 라벨을 제거해요. | |
--limit-cpu |
CPU를 제한해요. | |
--limit-memory |
메모리를 제한해요. | |
--limit-pids |
API 1.41+ 최대 프로세스 수를 제한해요 (기본 0 = 무제한). | |
--log-driver |
서비스 로그 드라이버예요. | |
--log-opt |
로그 드라이버 옵션이에요. | |
--max-concurrent |
API 1.41+ 동시에 실행할 잡 태스크 수예요 (기본 --replicas와 동일). |
|
--memory-swap |
API 1.52+ 스왑 바이트예요 (-1은 무제한). | |
--memory-swappiness |
-1 |
API 1.52+ 메모리 스와피니스를 조정해요 (0-100), -1은 기본으로 초기화. |
--mount-add |
서비스에 마운트를 추가하거나 갱신해요. | |
--mount-rm |
대상 경로로 마운트를 제거해요. | |
--network-add |
API 1.29+ 네트워크를 추가해요. | |
--network-rm |
API 1.29+ 네트워크를 제거해요. | |
--no-healthcheck |
API 1.25+ 컨테이너가 지정한 HEALTHCHECK를 비활성화해요. | |
--no-resolve-image |
API 1.30+ 레지스트리에서 이미지 다이제스트와 지원 플랫폼을 조회하지 않아요. | |
--oom-score-adj |
API 1.46+ 호스트의 OOM 선호도를 조정해요 (-1000~1000). | |
--placement-pref-add |
API 1.28+ 배치 선호도를 추가해요. | |
--placement-pref-rm |
API 1.28+ 배치 선호도를 제거해요. | |
--publish-add |
게시된 포트를 추가하거나 갱신해요. | |
--publish-rm |
대상 포트로 게시된 포트를 제거해요. | |
-q, --quiet |
진행 출력을 숨겨요. | |
--read-only |
API 1.28+ 컨테이너 루트 파일시스템을 읽기 전용으로 마운트해요. | |
--replicas |
태스크 수예요. | |
--replicas-max-per-node |
API 1.40+ 노드당 최대 태스크 수예요 (기본 0 = 무제한). | |
--reserve-cpu |
CPU를 예약해요. | |
--reserve-memory |
메모리를 예약해요. | |
--restart-condition |
조건이 충족되면 재시작해요 (none, on-failure, any). |
|
--restart-delay |
재시작 시도 사이 지연이에요 (ns/us/ms/s/m/h). | |
--restart-max-attempts |
포기하기 전 최대 재시작 횟수예요. | |
--restart-window |
재시작 정책 평가에 쓰는 창이에요 (ns/us/ms/s/m/h). | |
--rollback |
API 1.25+ 이전 스펙으로 롤백해요. | |
--rollback-delay |
API 1.28+ 태스크 롤백 사이 지연이에요 (ns/us/ms/s/m/h). | |
--rollback-failure-action |
API 1.28+ 롤백 실패 시 동작이에요 (pause, continue). |
|
--rollback-max-failure-ratio |
API 1.28+ 롤백 중 허용 실패 비율이에요. | |
--rollback-monitor |
API 1.28+ 각 태스크 롤백 후 실패 모니터링 시간이에요 (ns/us/ms/s/m/h). | |
--rollback-order |
API 1.29+ 롤백 순서예요 (start-first, stop-first). |
|
--rollback-parallelism |
API 1.28+ 동시 롤백 최대 태스크 수예요 (0은 한 번에 모두). | |
--secret-add |
API 1.25+ 서비스에 시크릿을 추가하거나 갱신해요. | |
--secret-rm |
API 1.25+ 시크릿을 제거해요. | |
--stop-grace-period |
강제 종료 전 대기 시간이에요 (ns/us/ms/s/m/h). | |
--stop-signal |
API 1.28+ 컨테이너를 중지할 시그널이에요. | |
--sysctl-add |
API 1.40+ Sysctl 옵션을 추가하거나 갱신해요. | |
--sysctl-rm |
API 1.40+ Sysctl 옵션을 제거해요. | |
-t, --tty |
API 1.25+ 의사 TTY를 할당해요. | |
--ulimit-add |
API 1.41+ ulimit 옵션을 추가하거나 갱신해요. | |
--ulimit-rm |
API 1.41+ ulimit 옵션을 제거해요. | |
--update-delay |
갱신 사이 지연이에요 (ns/us/ms/s/m/h). | |
--update-failure-action |
갱신 실패 시 동작이에요 (pause, continue, rollback). |
|
--update-max-failure-ratio |
API 1.25+ 갱신 중 허용 실패 비율이에요. | |
--update-monitor |
API 1.25+ 각 태스크 갱신 후 실패 모니터링 시간이에요 (ns/us/ms/s/m/h). | |
--update-order |
API 1.29+ 갱신 순서예요 (start-first, stop-first). |
|
--update-parallelism |
동시 갱신 최대 태스크 수예요 (0은 한 번에 모두). | |
-u, --user |
사용자 이름 또는 UID예요. | |
--with-registry-auth |
레지스트리 인증 정보를 Swarm 에이전트에 전달해요. | |
-w, --workdir |
컨테이너 안 작업 디렉터리예요. |
서비스 갱신
$ docker service update --limit-cpu 2 redis
매개변수 변경 없이 롤링 재시작
$ docker service update --force --update-parallelism 1 --update-delay 30s redis
--force 플래그는 다른 매개변수 변경이 없어도 태스크를 종료하고 새로 교체해요. --update-parallelism 1은 한 번에 하나의 태스크만 교체하게 하고(기본 동작), --update-delay 30s는 태스크 사이에 30초 지연을 넣어 롤링 재시작이 점진적으로 일어나게 해요.
마운트 추가·제거 (--mount-add, --mount-rm)
--mount-add나 --mount-rm으로 서비스의 바인드 마운트 또는 볼륨을 추가·제거해요. --mount-add는 service create의 --mount와 같은 매개변수를 받고, --mount-rm은 마운트의 target 경로를 받아요.
$ docker service create \
--name=myservice \
--mount type=volume,source=test-data,target=/somewhere \
nginx:alpine
myservice
$ docker service update \
--mount-add type=volume,source=other-volume,target=/somewhere-else \
myservice
myservice
$ docker service update --mount-rm /somewhere myservice
myservice
게시된 포트 추가·제거 (--publish-add, --publish-rm)
--publish-add/--publish-rm으로 서비스의 게시된 포트를 추가·제거해요.
$ docker service update \
--publish-add published=8080,target=80 \
myservice
네트워크 추가·제거 (--network-add, --network-rm)
$ docker service update \
--network-rm my-network \
--network-add name=my-network,alias=web1 \
myservice
이전 버전으로 롤백 (--rollback)
--rollback 옵션으로 서비스의 이전 버전으로 롤백할 수 있어요. 가장 최근 docker service update 전의 설정으로 되돌려요.
$ docker service update --replicas=5 web
...
$ docker service update --rollback web
web
$ docker service ls
ID NAME MODE REPLICAS IMAGE
80bvrzp6vxf3 web replicated 0/4 nginx:alpine
--rollback과 다른 옵션을 함께 쓸 수도 있어요. 예를 들어 --update-delay 0s로 태스크 사이 지연 없이 롤백을 실행할 수 있어요.
갱신 실패 시 이전 버전으로 자동 롤백하도록 서비스를 설정할 수도 있어요. --update-failure-action=rollback을 쓰면 되고, --update-max-failure-ratio로 준 값보다 갱신에 실패한 태스크 비율이 크면 롤백이 발동해요.
롤백의 속도·병렬도·기타 매개변수는 --rollback-delay, --rollback-failure-action, --rollback-max-failure-ratio, --rollback-monitor, --rollback-parallelism 플래그가 정해요.
시크릿 추가·제거 (--secret-add, --secret-rm)
$ docker service update \
--secret-add source=ssh-2,target=ssh-2 \
--secret-rm ssh-1 \
myservice
잡(Job) 갱신
서비스를 잡으로 만들면(모드 replicated-job이나 global-job) 갱신 옵션은 제한돼요. 잡을 갱신하면 진행 중인 태스크가 즉시 멈추고 새 태스크 세트가 만들어져 완료 상태가 초기화돼요. 잡은 롤아웃이나 롤백이 불가능하고, 갱신·롤백 설정용 플래그는 잡 모드에서 유효하지 않아요. 잡을 같은 매개변수로 다시 실행하려면 --force 플래그로 강제 갱신하면 돼요.