다음을 통해 공유


Swarm 모드 시작

적용 대상: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

"Swarm 모드"란?

Swarm 모드는 Docker 호스트의 네이티브 클러스터링 및 컨테이너 워크로드 예약을 포함하여 기본 제공 컨테이너 오케스트레이션 기능을 제공하는 Docker 기능입니다. Docker 엔진이 "Swarm 모드"에서 함께 실행되는 경우 Docker 호스트 그룹은 "Swarm" 클러스터를 형성합니다. Swarm 모드에 대한 추가 컨텍스트는 Docker의 기본 설명서 사이트를 참조하세요.

관리자 노드 및 작업자 노드

Swarm은 관리자 노드와 작업자 노드의 두 가지 유형의 컨테이너 호스트로 구성됩니다. 모든 Swarm은 관리자 노드를 통해 초기화되며 Swarm을 제어하고 모니터링하기 위한 모든 Docker CLI 명령은 해당 관리자 노드 중 하나에서 실행되어야 합니다. 관리자 노드는 Swarm 상태의 "키퍼"로 간주될 수 있으며, 함께 Swarm에서 실행되는 서비스의 상태에 대한 인식을 유지하는 합의 그룹을 구성하며, Swarm의 실제 상태가 개발자 또는 관리자가 정의한 대로 항상 의도한 상태와 일치하도록 하는 것이 해당 작업입니다.

참고 항목

Swarm에 관리자 노드가 여러 개 있어도 되지만, 항상 적어도 하나 이상의 관리자 노드가 있어야 합니다.

작업자 노드는 관리자 노드를 통해 Docker Swarm에 의해 오케스트레이션됩니다. Swarm을 조인하려면 작업자 노드가 Swarm을 초기화할 때 관리자 노드에서 생성한 "조인 토큰"을 사용해야 합니다. 작업자 노드는 단순히 관리자 노드에서 작업을 수신하고 실행하므로 Swarm 상태를 인식하지 않아도 됩니다.

Swarm 모드 시스템 요구 사항

모든 최신 업데이트와 함께 Windows 10 크리에이터스 업데이트 또는 Windows Server 2016을 실행하는 하나 이상의 물리적 또는 가상 컴퓨터 시스템(Swarm의 전체 기능을 사용하는 것이 좋습니다.) * 컨테이너 호스트로 설정(항목 참조, Windows 10의 Windows 컨테이너 또는 Windows Server의 Windows 컨테이너 참조) Windows 10에서 Docker 컨테이너를 시작하는 방법에 대한 자세한 내용을 보려면).

* 참고: Windows Server 2016의 Docker Swarm에는 KB4015217 필요합니다.

Docker 엔진 v1.13.0 이상

열린 포트: 각 호스트에서 다음 포트를 사용할 수 있어야 합니다. 일부 시스템에서는 이러한 포트가 기본적으로 열려 있습니다.

  • 클러스터 관리 통신용 TCP 포트 2377
  • 노드 간 통신을 위한 TCP 및 UDP 포트 7946
  • 오버레이 네트워크 트래픽에 대한 UDP 포트 4789

Swarm 클러스터 초기화

Swarm을 초기화하려면 컨테이너 호스트 중 하나에서 다음 명령을 실행하면 됩니다(HOSTIPADDRESS<를 호스트 컴퓨터의 로컬 IPv4 주소로 대체>).

# Initialize a swarm
C:\> docker swarm init --advertise-addr=<HOSTIPADDRESS> --listen-addr <HOSTIPADDRESS>:2377

지정된 컨테이너 호스트에서 이 명령을 실행하면 해당 호스트의 Docker 엔진이 관리자 노드로 Swarm 모드에서 실행되기 시작합니다.

Swarm에 노드 추가

Swarm 모드와 오버레이 네트워킹 모드 기능을 사용하기 위해 여러 노드가 필요하지는 않습니다. 모든 Swarm/오버레이 기능은 Swarm 모드에서 실행되는 단일 호스트(예: 명령으로 Swarm 모드로 전환되는 관리자 노드)와 함께 docker swarm init 사용할 수 있습니다.

Swarm에 작업자 추가

관리자 노드에서 Swarm이 초기화되면 다른 호스트를 다른 간단한 명령을 사용하여 작업자로 Swarm에 추가할 수 있습니다.

C:\> docker swarm join --token <WORKERJOINTOKEN> <MANAGERIPADDRESS>

<여기서 MANAGERIPADDRESS>는 Swarm 관리자 노드의 로컬 IP 주소이며 <WORKERJOINTOKEN>은 관리자 노드에서 실행된 명령에서 출력 docker swarm init 으로 제공되는 작업자 조인 토큰입니다. Swarm이 초기화된 후 관리자 노드에서 다음 명령 중 하나를 실행하여 조인 토큰을 가져올 수도 있습니다.

# Get the full command required to join a worker node to the swarm
C:\> docker swarm join-token worker

# Get only the join-token needed to join a worker node to the swarm
C:\> docker swarm join-token worker -q

Swarm에 관리자 추가

다음 명령을 사용하여 Swarm 클러스터에 추가 관리자 노드를 추가할 수 있습니다.

C:\> docker swarm join --token <MANAGERJOINTOKEN> <MANAGERIPADDRESS>

<다시 말하지만, MANAGERIPADDRESS>는 Swarm 관리자 노드의 로컬 IP 주소입니다. 조인 <토큰인 MANAGERJOINTOKEN>은 Swarm에 대한 관리자 조인 토큰으로, 기존 관리자 노드에서 다음 명령 중 하나를 실행하여 가져올 수 있습니다.

# Get the full command required to join a **manager** node to the swarm
C:\> docker swarm join-token manager

# Get only the join-token needed to join a **manager** node to the swarm
C:\> docker swarm join-token manager -q

오버레이 네트워크 만들기

Swarm 클러스터가 구성되면 Swarm에 오버레이 네트워크를 만들 수 있습니다. Swarm 관리자 노드에서 다음 명령을 실행하여 오버레이 네트워크를 만들 수 있습니다.

# Create an overlay network
C:\> docker network create --driver=overlay <NETWORKNAME>

<여기서 NETWORKNAME>은 네트워크에 제공하려는 이름입니다.

Swarm에 서비스 배포

오버레이 네트워크가 만들어지면 서비스를 만들고 네트워크에 연결할 수 있습니다. 서비스는 다음 구문을 사용하여 생성됩니다.

# Deploy a service to the swarm
C:\> docker service create --name=<SERVICENAME> --endpoint-mode dnsrr --network=<NETWORKNAME> <CONTAINERIMAGE> [COMMAND] [ARGS…]

<여기서 SERVICENAME>은 서비스에 부여하려는 이름입니다. 이 이름은 서비스 검색(Docker의 네이티브 DNS 서버를 사용)을 통해 서비스를 참조하는 데 사용할 이름입니다. <NETWORKNAME>은 이 서비스를 연결하려는 네트워크의 이름입니다(예: "myOverlayNet"). <CONTAINERIMAGE>는 서비스를 정의할 컨테이너 이미지의 이름입니다.

참고 항목

이 명령의 두 번째 인수인 --endpoint-mode dnsrr은 DNS 라운드 로빈 정책을 사용하여 서비스 컨테이너 엔드포인트 간에 네트워크 트래픽을 분산하도록 Docker 엔진을 지정하는 데 필요합니다. 현재 Windows Server 2016에서 지원되는 부하 분산 전략은 DNS 라운드 로빈이 유일합니다. Windows Docker 호스트에 대한 라우팅 메시는 Windows Server 2019 이상에서 지원되고 Windows Server 2016에서는 지원되지 않습니다. 현재 Windows Server 2016의 부하 분산 전략을 대체할 방법을 찾고 있는 사용자는 NGINX 같은 외부 부하 분산 장치를 설치하고 Swarm의 포트 게시 모드를 사용하여 트래픽을 분산할 컨테이너 호스트 포트를 노출하면 됩니다.

서비스 크기 조정

서비스가 Swarm 클러스터에 배포되면 해당 서비스를 구성하는 컨테이너 인스턴스가 클러스터 전체에 배포됩니다. 기본적으로 서비스를 지원하는 컨테이너 인스턴스 수(서비스에 대한 "복제본" 또는 "작업" 수)는 1개입니다. 그러나 명령에 대한 옵션을 --replicas 사용 docker service create 하거나 서비스를 만든 후 크기를 조정하여 여러 작업으로 서비스를 만들 수 있습니다.

서비스 확장성은 Docker Swarm에서 제공하는 주요 이점이며, 단일 Docker 명령으로 활용할 수도 있습니다.

C:\> docker service scale <SERVICENAME>=<REPLICAS>

<여기서 SERVICENAME>은 크기를 조정하는 서비스의 이름이며 <REPLICAS>는 서비스의 크기를 조정하는 작업 또는 컨테이너 인스턴스의 수입니다.

Swarm 상태 보기

Swarm의 상태와 Swarm에서 실행되는 서비스를 보기 위한 몇 가지 유용한 명령이 있습니다.

Swarm 노드 나열

다음 명령을 사용하여 각 노드의 상태에 대한 informaiton을 포함하여 현재 Swarm에 조인된 노드 목록을 확인합니다. 이 명령은 관리자 노드에서 실행해야 합니다.

C:\> docker node ls

이 명령의 출력에서 별표(*)로 표시된 노드 중 하나를 확인할 수 있습니다. 별표는 명령이 실행된 노드인 현재 노드를 docker node ls 나타냅니다.

네트워크 나열

다음 명령을 사용하여 지정된 노드에 있는 네트워크 목록을 확인합니다. 오버레이 네트워크를 보려면 Swarm 모드에서 실행되는 관리자 노드에서 이 명령을 실행해야 합니다.

C:\> docker network ls

서비스 나열

다음 명령을 사용하여 해당 상태에 대한 정보를 포함하여 Swarm에서 현재 실행 중인 서비스 목록을 확인합니다.

C:\> docker service ls

서비스를 정의하는 컨테이너 인스턴스 나열

다음 명령을 사용하여 지정된 서비스에 대해 실행되는 컨테이너 인스턴스에 대한 세부 정보를 확인합니다. 이 명령의 출력에는 각 컨테이너가 실행 중인 ID 및 노드뿐만 아니라 컨테이너 상태에 대한 인프롬이 포함됩니다.

C:\> docker service ps <SERVICENAME>

Linux+Windows 혼합 OS 클러스터

최근에 우리 팀의 한 구성원이 Docker Swarm을 사용하여 Windows+Linux 혼합 OS 애플리케이션을 설정하는 방법에 대한 3부로 구성된 짧은 데모를 게시했습니다. Docker Swarm을 익숙하지 않은 경우 시작하거나 혼합 OS 애플리케이션을 실행하는 데 사용할 수 있는 좋은 장소입니다. 지금 확인하세요.

Linux+Windows 혼합 OS 클러스터 초기화

혼합 OS Swarm 클러스터를 초기화하는 것은 쉽습니다. 방화벽 규칙이 제대로 구성되고 호스트가 서로 액세스할 수 있는 한, Swarm에 Linux 호스트를 추가하기만 하면 표준 docker swarm join 명령이 됩니다.

C:\> docker swarm join --token <JOINTOKEN> <MANAGERIPADDRESS>

```powershell
You can also initialize a swarm from a Linux host using the same command that you would run if initializing the swarm from a Windows host:

```powershell
# Initialize a swarm
C:\> docker swarm init --advertise-addr=<HOSTIPADDRESS> --listen-addr <HOSTIPADDRESS>:2377

Swarm 노드에 레이블 추가

혼합 OS Swarm 클러스터에 Docker 서비스를 시작하려면 해당 서비스가 디자인되고 그렇지 않은 OS를 실행하는 Swarm 노드를 구분하는 방법이 있어야 합니다. Docker 개체 레이블은 노드에 레이블을 지정하는 유용한 방법을 제공하므로 OS와 일치하는 노드에서만 실행되도록 서비스를 만들고 구성할 수 있습니다.

참고 항목

Docker 개체 레이블은 컨테이너 이미지, 컨테이너, 볼륨, 네트워크 등 다양한 Docker 개체에 메타데이터를 적용하는 데 사용할 수 있으며 그 외에도 다양한 목적으로 사용할 수 있습니다(예: 레이블을 사용하면 프런트 엔드 마이크로서비스는 '프런트 엔드' 레이블이 지정된 노드에서만 예약 가능하고 백 엔드 마이크로서비스는 '백 엔드' 레이블이 지정된 노드에서만 예약 가능하게 하여 애플리케이션의 '프런트 엔드' 구성 요소와 '백 엔드' 구성 요소를 분리할 수 있음). 이 경우 노드에서 레이블을 사용하여 Windows OS 노드와 Linux OS 노드를 구분합니다.

기존 Swarm 노드에 레이블을 지정하려면 다음 구문을 사용합니다.

C:\> docker node update --label-add <LABELNAME>=<LABELVALUE> <NODENAME>

<LABELNAME> 다음은 만드는 레이블의 이름입니다. 예를 들어 이 경우 노드를 OS로 구분하므로 레이블의 논리적 이름은 "os"일 수 있습니다. <LABELVALUE>는 레이블의 값이며, 여기서는 "windows" 및 "linux" 값을 선택할 수 있습니다. (물론 일관성을 유지하는 한 레이블 및 레이블 값에 대한 이름 지정을 선택할 수 있습니다.) <NODENAME>은 레이블을 지정할 노드의 이름이며 docker node ls 명령을 실행하여 노드 이름을 미리 알릴 수 있습니다.

예를 들어 클러스터에 Windows 노드 2개와 Linux 노드 2개를 포함하여 4개의 Swarm 노드가 있는 경우 레이블 업데이트 명령은 다음과 같을 수 있습니다.

# Example -- labeling 2 Windows nodes and 2 Linux nodes in a cluster...
C:\> docker node update --label-add os=windows Windows-SwarmMaster
C:\> docker node update --label-add os=windows Windows-SwarmWorker1
C:\> docker node update --label-add os=linux Linux-SwarmNode1
C:\> docker node update --label-add os=linux Linux-SwarmNode2

혼합 OS Swarm에 서비스 배포

Swarm 노드에 대한 레이블을 사용하면 클러스터에 서비스를 쉽게 배포할 수 있습니다. 명령을 사용하려면 다음 --constraint 을 수행합니다 docker service create .

# Deploy a service with swarm node constraint
C:\> docker service create --name=<SERVICENAME> --endpoint-mode dnsrr --network=<NETWORKNAME> --constraint node.labels.<LABELNAME>=<LABELVALUE> <CONTAINERIMAGE> [COMMAND] [ARGS…]

예를 들어 위의 예제에서 레이블 및 레이블 값 명명법을 사용하면 Windows 기반 서비스에 대한 명령과 Linux 기반 서비스에 대한 서비스 만들기 명령 집합이 다음과 같이 표시될 수 있습니다.

# Example -- using the 'os' label and 'windows'/'linux' label values, service creation commands might look like these...

# A Windows service
C:\> docker service create --name=win_s1 --endpoint-mode dnsrr --network testoverlay --constraint 'node.labels.os==windows' microsoft/nanoserver:latest powershell -command { sleep 3600 }

# A Linux service
C:\> docker service create --name=linux_s1 --endpoint-mode dnsrr --network testoverlay --constraint 'node.labels.os==linux' redis

제한 사항

현재 Windows의 Swarm 모드에는 다음과 같은 제한 사항이 있습니다.

  • 데이터 평면 암호화가 지원되지 않음(예: 옵션을 사용하는 --opt encrypted 컨테이너-컨테이너 트래픽)
  • Windows Docker 호스트용 라우팅 메시는 Windows Server 2016에서 지원되지 않고 Windows Server 2019 이상부터 지원됩니다. 현재 대체 부하 분산 전략을 원하는 사용자는 외부 부하 분산 장치(예: NGINX)를 설치하고 Swarm의 게시 포트 모드 를 사용하여 부하를 분산할 컨테이너 호스트 포트를 노출할 수 있습니다. 이에 대한 자세한 내용은 아래와 같습니다.

서비스 엔드포인트에 대한 포트 게시

서비스 엔드포인트용 포트를 게시하려는 사용자는 포트 게시 모드 또는 Docker Swarm의 라우팅 메시 기능을 사용하면 됩니다.

서비스를 정의하는 각 작업/컨테이너 엔드포인트에 대해 호스트 포트를 게시하려면 명령에 대한 인수를 --publish mode=host,target=<CONTAINERPORT> 사용합니다docker service create.

# Create a service for which tasks are exposed via host port
C:\ > docker service create --name=<SERVICENAME> --publish mode=host,target=<CONTAINERPORT> --endpoint-mode dnsrr --network=<NETWORKNAME> <CONTAINERIMAGE> [COMMAND] [ARGS…]

예를 들어 다음 명령은 각 작업이 컨테이너 포트 80 및 임의로 선택된 호스트 포트를 통해 노출되는 서비스 's1'을 만듭니다.

C:\ > docker service create --name=s1 --publish mode=host,target=80 --endpoint-mode dnsrr web_1 powershell -command {echo sleep; sleep 360000;}

게시 포트 모드를 사용하여 서비스를 만든 후 서비스를 쿼리하여 각 서비스 태스크에 대한 포트 매핑을 볼 수 있습니다.

C:\ > docker service ps <SERVICENAME>

위의 명령은 서비스에 대해 실행되는 모든 컨테이너 인스턴스에 대한 세부 정보를 반환합니다(모든 Swarm 호스트에서). 출력의 열 중 하나인 “포트” 열에는 각 호스트의 포트 정보가 <HOSTPORT>-><CONTAINERPORT>/tcp 형태로 포함됩니다. 각 컨테이너가 자체 호스트 포트에 게시되므로 <HOSTPORT> 값은 컨테이너 인스턴스마다 다릅니다.

팁 및 인사이트

기존 투명 네트워크는 Swarm 초기화/오버레이 네트워크 생성을 차단할 수 있습니다. Windows에서는 오버레이 및 투명 네트워크 드라이버가 외부 vSwitch를 (가상) 호스트 네트워크 어댑터에 바인딩해야 합니다. 오버레이 네트워크를 만들면 새 스위치가 만들어지고 열린 네트워크 어댑터에 연결됩니다. 투명 네트워킹 모드는 호스트 네트워크 어댑터도 사용합니다. 동시에 지정된 네트워크 어댑터는 한 번에 하나의 스위치에만 바인딩할 수 있습니다. 호스트에 네트워크 어댑터가 하나만 있는 경우 vSwitch가 오버레이 네트워크용이든 투명한 네트워크용이든 관계없이 한 번에 하나의 외부 vSwitch에만 연결할 수 있습니다.

따라서 컨테이너 호스트에 네트워크 어댑터가 하나만 있는 경우 투명 네트워크가 현재 호스트의 유일한 가상 네트워크 인터페이스를 차지하고 있기 때문에 오버레이 네트워크 생성을 차단하는 투명한 네트워크(또는 그 반대의 경우도 마찬가지) 문제가 발생할 수 있습니다.

이 문제를 해결하는 방법에는 두 가지가 있습니다.

  • 옵션 1 - 기존 투명 네트워크 삭제: Swarm을 초기화하기 전에 컨테이너 호스트에 기존 투명 네트워크가 없는지 확인합니다. 투명 네트워크를 삭제하여 호스트에 오버레이 네트워크 생성에 사용할 무료 가상 네트워크 어댑터가 있는지 확인합니다.
  • 옵션 2 - 호스트에 추가(가상) 네트워크 어댑터 만들기: 호스트에 있는 투명 네트워크를 제거하는 대신 오버레이 네트워크 생성에 사용할 추가 네트워크 어댑터를 호스트에 만들 수 있습니다. 이렇게 하려면 PowerShell 또는 Hyper-V 관리자를 사용하여 새 외부 네트워크 어댑터를 만듭니다. 새 인터페이스를 사용하면 Swarm이 초기화되면 HNS(호스트 네트워크 서비스)가 호스트에서 자동으로 이를 인식하고 이를 사용하여 오버레이 네트워크 생성을 위해 외부 vSwitch를 바인딩합니다.