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-addservice 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 플래그로 강제 갱신하면 돼요.

더 알아보기