docker service update 명령어를 사용하여 서비스 수정 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker service update 명령을 사용하여 Docker 서비스를 효과적으로 관리하고 수정하는 방법을 배우게 됩니다. 먼저 간단한 서비스를 생성한 다음, 레플리카 수를 업데이트하여 서비스를 확장하는 방법을 살펴봅니다.

또한, 서비스의 롤링 재시작을 수행하고, 게시된 포트를 추가하거나 제거하며, Docker Swarm 환경에서 컨테이너화된 애플리케이션의 라이프사이클을 관리하는 데 필수적인 기술을 제공하는 이전 버전으로 서비스를 롤백하는 방법을 배우게 됩니다.

간단한 서비스 생성

이 단계에서는 간단한 Docker 서비스를 생성하는 방법을 배우게 됩니다. 서비스는 동일한 이미지의 컨테이너 그룹입니다. 서비스는 애플리케이션을 확장하고 고가용성을 보장하는 데 유용합니다.

먼저, Docker Hub 에서 alpine 이미지를 가져오겠습니다. 이 이미지는 매우 작고 테스트에 유용합니다.

docker pull alpine

이미지가 가져와지고 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다.

이제 alpine 이미지를 사용하여 my-service라는 서비스를 생성해 보겠습니다. 컨테이너 내에서 "Hello, LabEx!"를 출력하고 종료하는 간단한 명령을 실행합니다.

docker service create --name my-service alpine echo "Hello, LabEx!"

이 명령은 새 서비스를 생성합니다. --name my-service 플래그는 서비스에 이름을 지정합니다. alpine은 사용할 이미지이고, echo "Hello, LabEx!"는 컨테이너 내에서 실행할 명령입니다.

다음과 유사한 출력을 볼 수 있으며, 서비스 ID 를 나타냅니다.

<service_id>

서비스가 성공적으로 생성되었는지 확인하려면 서비스를 나열할 수 있습니다.

docker service ls

출력에 my-service가 나열된 것을 볼 수 있습니다.

서비스 복제본 업데이트

이 단계에서는 레플리카 수를 업데이트하여 Docker 서비스를 확장하는 방법을 배우게 됩니다. 레플리카는 서비스 컨테이너의 동일한 복사본입니다. 레플리카 수를 늘리면 서비스가 더 많은 부하를 처리하고 더 높은 가용성을 제공할 수 있습니다.

현재 my-service는 하나의 레플리카만 가지고 있습니다. docker service ls의 출력에서 "REPLICAS" 열에서 확인할 수 있습니다.

서비스를 3 개의 레플리카로 확장해 보겠습니다. --replicas 플래그와 함께 docker service update 명령을 사용하여 이 작업을 수행할 수 있습니다.

docker service update --replicas 3 my-service

이 명령은 Docker Swarm 에 my-service를 3 개의 레플리카로 업데이트하도록 지시합니다. Docker Swarm 은 원하는 레플리카 수에 도달하는 데 필요한 추가 컨테이너를 자동으로 생성합니다.

서비스가 업데이트되었음을 나타내는 출력을 볼 수 있습니다.

서비스가 확장되었는지 확인하려면 서비스를 다시 나열합니다.

docker service ls

my-service의 "REPLICAS" 열을 살펴보십시오. 이제 3/3이 표시되어 3 개의 레플리카가 원하는 상태이고 현재 3 개가 실행 중임을 나타냅니다.

개별 컨테이너를 보려면 서비스와 관련된 작업을 검사할 수도 있습니다.

docker service ps my-service

이 명령은 서비스의 각 레플리카 (작업) 의 상태를 보여줍니다. "Running" 상태로 표시된 세 개의 작업이 나열되어야 합니다.

서비스 롤링 재시작 수행

이 단계에서는 Docker 서비스의 롤링 재시작을 수행하는 방법을 배우게 됩니다. 롤링 재시작은 서비스의 작업을 하나씩 업데이트하여 업데이트 프로세스 동안 서비스의 가용성을 보장합니다. 이는 애플리케이션 가동 시간을 유지하는 데 매우 중요합니다.

롤링 재시작을 트리거하려면 --force 플래그와 함께 docker service update 명령을 사용할 수 있습니다. 이 플래그는 서비스 구성이 변경되지 않은 경우에도 새로운 업데이트를 강제로 수행합니다.

docker service update --force my-service

이 명령은 my-service의 롤링 재시작을 시작합니다. Docker Swarm 은 서비스의 각 레플리카를 순차적으로 중지하고 시작합니다.

서비스가 업데이트되었음을 나타내는 출력을 볼 수 있습니다.

진행 중인 롤링 재시작을 관찰하려면 서비스 작업을 지속적으로 모니터링할 수 있습니다.

docker service ps my-service

이 명령을 여러 번 실행합니다. 각 레플리카가 재시작될 때 작업의 "CURRENT STATE"가 "Running"에서 "Shutdown"으로, 다시 "Running"으로 변경되는 것을 볼 수 있습니다. 이 프로세스는 한 번에 하나의 레플리카씩 발생하여 재시작의 롤링 특성을 보여줍니다.

모든 작업이 재시작되면 docker service ps my-service의 출력은 "UPDATED" 열 아래에 업데이트된 타임스탬프와 함께 모든 작업이 "Running" 상태로 표시됩니다.

게시된 포트 추가 또는 제거

이 단계에서는 Docker 서비스에 게시된 포트를 추가하거나 제거하는 방법을 배우게 됩니다. 포트를 게시하면 컨테이너 내부의 포트를 Docker Swarm 클러스터 외부에서 액세스할 수 있게 됩니다. 이는 애플리케이션을 사용자 또는 다른 서비스에 노출하는 데 필수적입니다.

현재 my-service는 간단한 echo 명령을 실행하고 종료하기 때문에 게시된 포트가 없습니다. 포트 게시를 시연하기 위해 간단한 웹 서버를 실행하는 새 서비스를 만들어 보겠습니다. 이를 위해 nginx 이미지를 사용합니다.

먼저 nginx 이미지를 가져옵니다.

docker pull nginx

이제 web-service라는 새 서비스를 만들고 컨테이너의 포트 80 을 호스트의 포트 8080 으로 게시해 보겠습니다.

docker service create --name web-service --publish 8080:80 nginx

이 명령은 nginx 이미지를 사용하여 web-service라는 서비스를 만듭니다. --publish 8080:80 플래그는 컨테이너 내부의 포트 80 을 호스트의 포트 8080 에 매핑합니다.

서비스 ID 를 나타내는 출력을 볼 수 있습니다.

포트가 게시되었는지 확인하려면 서비스를 검사할 수 있습니다.

docker service inspect web-service

출력에서 EndpointSpec 섹션을 찾습니다. Ports 아래에 게시된 포트 매핑을 보여주는 항목 (예: PublishedPort: 8080, TargetPort: 80) 이 표시되어야 합니다.

이제 web-service에서 게시된 포트를 제거해 보겠습니다. 컨테이너 내부의 대상 포트를 지정하여 --publish-rm 플래그와 함께 docker service update 명령을 사용하여 이 작업을 수행할 수 있습니다.

docker service update --publish-rm 80 web-service

이 명령은 컨테이너 내부의 포트 80 에 대한 포트 매핑을 제거합니다.

서비스가 업데이트되었음을 나타내는 출력을 볼 수 있습니다.

포트가 제거되었는지 확인하려면 서비스를 다시 검사합니다.

docker service inspect web-service

EndpointSpec 섹션에는 방금 제거한 포트 매핑이 더 이상 표시되지 않아야 합니다.

서비스를 이전 버전으로 롤백

이 단계에서는 Docker 서비스를 이전 버전으로 롤백하는 방법을 배우게 됩니다. 롤백은 새로운 서비스 업데이트로 인해 문제가 발생할 때 필수적입니다. Docker Swarm 은 이전 서비스 구성을 추적하여 안정적인 상태로 빠르게 되돌릴 수 있도록 합니다.

먼저, 롤백하려는 업데이트를 시뮬레이션해 보겠습니다. web-service를 다른 가상의 이미지 버전으로 업데이트합니다 (실제로 가져오지는 않지만, 롤백에는 명령 구조가 중요합니다).

docker service update --image nginx:1.20.0 web-service

이 명령은 web-servicenginx:1.20.0 이미지를 사용하도록 업데이트하려고 시도합니다. 실제 시나리오에서는 버그가 있는 새 버전일 수 있습니다.

이제 이 업데이트에 문제가 있음을 발견하고 이전 버전 (기본 nginx 이미지를 사용하던 버전) 으로 롤백하려는 경우를 가정해 보겠습니다. docker service rollback 명령을 사용할 수 있습니다.

docker service rollback web-service

이 명령은 Docker Swarm 에 web-service를 이전 구성으로 되돌리도록 지시합니다. Docker Swarm 은 새 이미지를 실행하는 작업을 중지하고 이전 이미지 버전을 사용하는 작업을 시작합니다.

서비스가 롤백되고 있음을 나타내는 출력을 볼 수 있습니다.

롤백이 성공했는지 확인하려면 서비스를 다시 검사할 수 있습니다.

docker service inspect web-service

출력에서 Image 필드를 확인합니다. 이제 원래의 nginx 이미지가 표시되어야 합니다 (처음에 최신 기본 이미지를 가져왔다고 가정하면 :1.20.0 태그가 없음).

또한 서비스 작업을 확인하여 이전 이미지를 실행하는 컨테이너를 볼 수도 있습니다.

docker service ps web-service

이제 작업이 원래 이미지를 실행해야 합니다.

요약

이 랩에서는 docker service update 명령을 사용하여 Docker 서비스를 관리하는 방법을 배웠습니다. alpine 이미지와 기본 echo 명령을 사용하여 간단한 서비스를 만드는 것으로 시작했습니다.

이후 주요 서비스 업데이트 작업을 살펴보았습니다. 복제본 수를 수정하여 서비스를 확장하고, 다운타임 없이 서비스 작업을 업데이트하기 위해 롤링 재시작을 수행했으며, 서비스를 외부로 노출하기 위해 게시된 포트를 추가하거나 제거하는 방법을 배웠습니다. 마지막으로, 업데이트로 인해 문제가 발생하는 경우 변경 사항을 되돌리는 방법을 시연하면서 서비스를 이전 버전으로 롤백하는 연습을 했습니다. 이러한 단계는 Docker 서비스의 수명 주기 및 구성을 관리하는 데 실질적인 경험을 제공했습니다.