docker swarm leave 명령어를 사용하여 노드 제거하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker swarm leave 명령어를 사용하여 Docker Swarm 내 노드를 관리하는 방법을 배우게 됩니다. 먼저 Docker Swarm 을 초기화하고 작업자 노드를 Swarm 에 가입시키는 것으로 시작합니다. 그 후, 작업자 노드를 Swarm 에서 제거하는 연습을 할 것입니다. 마지막으로, 강제 옵션 사용의 필요성을 포함하여 관리자 노드를 제거하는 과정을 살펴볼 것입니다.

Docker Swarm 초기화

이 단계에서는 Docker Swarm 을 초기화하는 방법을 배우게 됩니다. Docker Swarm 은 Swarm 모드로 실행되는 Docker 호스트의 클러스터입니다. Swarm 모드를 사용하면 Docker 노드 클러스터를 단일 가상 시스템으로 관리할 수 있습니다.

Swarm 을 초기화하기 전에, LabEx VM 에 설치된 현재 Docker 버전을 확인해 보겠습니다.

docker version

다음과 유사한 출력이 표시되어 Docker 버전이 20.10.21 임을 나타냅니다.

Client: Docker Engine - Community
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.9
 Git commit:        baedd2a
 Built:             Tue Oct 25 17:58:10 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.9
  Git commit:       305620d
  Built:            Tue Oct 25 17:56:51 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.10
  GitCommit:        b4bd567ea6c98e7b5d78a23676a0a79559d930d5
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Docker Swarm 을 초기화하려면 docker swarm init 명령어를 사용합니다. 이 명령어는 현재 Docker 호스트를 Swarm 관리자로 만듭니다.

docker swarm init

명령어를 실행하면 Swarm 이 초기화되었음을 나타내는 출력과 다른 노드를 작업자로 가입시키는 명령어가 표시됩니다. 출력은 다음과 유사합니다.

Swarm initialized: current node (xxxxxxxxxxxx) is now a manager.

To add a worker to this swarm, run the following command on the worker node:

    docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

출력은 현재 노드가 이제 Swarm 관리자임을 보여줍니다. 또한 이 Swarm 에 작업자 노드를 가입시키는 명령어를 제공합니다. 다음 단계에서 이 명령어를 사용합니다.

docker info 명령어를 사용하여 Swarm 상태를 확인할 수 있습니다.

docker info

출력에서 "Swarm" 섹션을 찾습니다. Swarm 이 "active"로 표시되어야 합니다.

...
 Swarm: active
  NodeID: xxxxxxxxxxxx
  Is Manager: true
  ClusterID: xxxxxxxxxxxx
  Managers: 1
  Nodes: 1
  Orchestration:
   TaskHistoryRetentionLimit: 5
  Raft:
   HeartbeatInterval: 100ms
   ElectionTimeout: 3s
   SnapshotInterval: 500ms
  Dispatcher:
   HeartbeatPeriod: 5s
  CA configuration:
   Expiry duration: 3 months
   Force rotate at: 7 weeks
  Root Rotation: false
  Local Node State: active
  Error: none
  Remote Manager:
   ID: xxxxxxxxxxxx
   Addr: 172.17.0.2:2377
   Addr: 172.17.0.2:2377
  Node Address: 172.17.0.2
  Manager Status:
   Cluster Address: 172.17.0.2:2377
   Leader: Yes
   Reachability: Reachable
...

이것은 Docker Swarm 이 이 노드에서 성공적으로 초기화되었음을 확인합니다.

작업자 노드를 Swarm 에 참여시키기

이전 단계에서 Docker Swarm 을 초기화했으며, 출력은 작업자 노드를 가입시키는 명령어를 제공했습니다. 실제 시나리오에서는 Swarm 에 작업자로 추가하려는 별도의 머신에서 이 명령어를 실행합니다. 그러나 단일 LabEx VM 을 사용하고 있으므로, 동일한 머신에서 join 명령어를 사용하여 작업자 노드 가입을 시뮬레이션합니다.

먼저, 작업자 노드에 대한 join 명령어를 검색해 보겠습니다. 관리자 노드 (현재 VM) 에서 docker swarm join-token worker를 실행하여 join 토큰과 명령어를 얻을 수 있습니다.

docker swarm join-token worker

출력은 다음과 유사합니다.

To add a worker to this swarm, run the following command on the worker node:

    docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377

출력에서 전체 docker swarm join --token ... 명령어를 복사합니다. 이 명령어에는 고유한 토큰과 Swarm 관리자의 IP 주소 및 포트가 포함되어 있습니다.

이제 복사한 명령어를 실행하여 현재 노드를 작업자로 Swarm 에 가입시킵니다.

docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377

토큰과 IP 주소를 docker swarm join-token worker 명령어에서 얻은 값으로 바꿉니다.

노드가 작업자로 Swarm 에 가입했음을 나타내는 출력이 표시됩니다.

This node joined a swarm as a worker.

노드가 Swarm 에 가입했는지 확인하려면 관리자 관점에서 Swarm 의 노드를 나열할 수 있습니다. 단일 VM 이 관리자 및 작업자 역할을 모두 수행하므로 docker node ls 명령어를 사용할 수 있습니다.

docker node ls

출력은 Swarm 의 노드를 표시합니다. 동일한 노드 ID 에 대해 두 개의 항목이 표시되어야 합니다. 하나는 상태가 "Ready"이고 역할이 "Manager"이고, 다른 하나는 상태가 "Ready"이고 역할이 "Worker"입니다.

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
xxxxxxxxxxxx *                labex-vm            Ready               Active              Leader              20.10.21
xxxxxxxxxxxx                  labex-vm            Ready               Active                              20.10.21

이는 노드가 Swarm 에 작업자로 성공적으로 가입했음을 확인합니다.

작업자 노드에서 Swarm 탈퇴

이전 단계에서 노드를 작업자로 Swarm 에 성공적으로 가입시켰습니다. 이제 노드를 Swarm 에서 제거하는 방법을 배우겠습니다. 작업자 노드에서 Swarm 을 탈퇴하려면 docker swarm leave 명령어를 사용합니다.

현재 노드가 작업자로서 Swarm 을 탈퇴하도록 다음 명령어를 실행합니다.

docker swarm leave

노드가 Swarm 을 탈퇴했음을 나타내는 출력이 표시됩니다.

Node left the swarm.

이제 노드가 Swarm 을 탈퇴했는지 확인해 보겠습니다. docker node ls 명령어를 다시 사용할 수 있습니다. 그러나 노드가 Swarm 을 탈퇴했으므로, 이 노드에서 docker node ls를 실행하면 더 이상 Swarm 의 일부가 아니기 때문에 오류가 발생합니다.

docker node ls

다음과 유사한 오류 메시지가 표시됩니다.

Error: This node is not a swarm manager. Use "docker swarm join" to join the swarm and try again.

이 오류는 노드가 더 이상 Swarm 의 일부가 아님을 확인합니다.

더 자세히 확인하기 위해 docker info를 사용하여 Swarm 상태를 확인해 보겠습니다.

docker info

출력의 "Swarm" 섹션은 이제 Swarm 이 "inactive"임을 나타내야 합니다.

...
 Swarm: inactive
...

이는 노드가 Docker Swarm 을 성공적으로 탈퇴했음을 확인합니다.

강제 옵션 없이 매니저 노드에서 Swarm 탈퇴 시도

이전 단계에서 작업자 노드를 Swarm 에서 성공적으로 제거했습니다. 이제 동일한 docker swarm leave 명령어를 추가 옵션 없이 사용하여 관리자 노드를 제거하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다.

다음 명령어를 실행하여 관리자 노드에서 Swarm 을 탈퇴하려고 시도합니다.

docker swarm leave

다음과 유사한 오류 메시지를 받게 됩니다.

Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Use the --force flag to force the node to leave the swarm. Note that this may disrupt the swarm, so use this option with caution.

이 오류 메시지는 명시적으로 강제하지 않고는 관리자 노드에서 Swarm 을 탈퇴할 수 없음을 나타냅니다. 이는 특히 다중 관리자 설정에서 Swarm 의 우발적인 중단을 방지하기 위한 안전 메커니즘입니다.

노드가 여전히 관리자이고 Swarm 의 일부인지 확인하려면 docker info 명령어를 사용할 수 있습니다.

docker info

"Swarm" 섹션은 여전히 "active" 및 "Is Manager: true"를 표시해야 합니다.

...
 Swarm: active
  NodeID: xxxxxxxxxxxx
  Is Manager: true
...

이는 force 플래그 없이 Swarm 을 탈퇴하려는 시도가 실패했으며 노드가 Swarm 관리자로 남아 있음을 확인합니다.

매니저 노드의 Swarm 강제 탈퇴

이전 단계에서 관리자 노드는 --force 플래그를 사용하지 않고는 Swarm 을 탈퇴할 수 없다는 것을 배웠습니다. 이는 Swarm 의 우발적인 중단을 방지하기 위한 것입니다. 이 단계에서는 --force 플래그를 사용하여 관리자 노드가 Swarm 을 탈퇴하도록 하겠습니다.

중요 참고 사항: 관리자 노드가 Swarm 을 강제로 탈퇴하도록 하면, 특히 마지막 관리자인 경우 Swarm 이 중단될 수 있습니다. 프로덕션 환경에서는 이 명령어를 주의해서 사용하십시오.

다음 명령어를 실행하여 관리자 노드가 Swarm 을 강제로 탈퇴하도록 합니다.

docker swarm leave --force

노드가 Swarm 을 탈퇴했음을 나타내는 출력이 표시됩니다.

Node left the swarm.

이제 노드가 Swarm 을 성공적으로 탈퇴했는지 확인해 보겠습니다. docker info 명령어를 사용할 수 있습니다.

docker info

출력의 "Swarm" 섹션은 이제 Swarm 이 "inactive"임을 나타내야 합니다.

...
 Swarm: inactive
...

이는 --force 플래그를 사용하여 관리자 노드가 Docker Swarm 을 성공적으로 탈퇴했음을 확인합니다. Swarm 은 더 이상 이 노드에 존재하지 않습니다.

요약

이 Lab 에서는 docker swarm init 명령어를 사용하여 Docker Swarm 을 초기화하는 방법을 배웠습니다. 이 명령어는 현재 노드를 관리자로 지정하고 다른 노드가 참여할 수 있는 명령어를 제공합니다. 그런 다음 새로 생성된 Swarm 에 작업자 노드를 참여시키는 연습을 했습니다.

이어서 docker swarm leave 명령어를 사용하여 Swarm 에서 노드를 제거하는 방법을 살펴보았습니다. 먼저 작업자 노드가 Swarm 을 탈퇴할 수 있는 방법을 시연했습니다. 그런 다음 force 옵션 없이 동일한 명령어를 관리자 노드에서 사용하려고 시도했으며, 기본적으로 허용되지 않음을 확인했습니다. 마지막으로 --force 플래그를 사용하여 관리자 노드가 Swarm 을 성공적으로 탈퇴하도록 했습니다.