[docker-swarm] docker swarm 시작하기 (1)

업데이트:     Updated:

카테고리:

태그:

docker-swarm

Docker의 현재 버전에는 Docker 엔진 클러스터를 관리하기 위한 swarm이 포함되어 있습니다.

Swarm은 swarm 모드에서 실행 되고 관리자(manager)와 작업자(worker) 역할을 하는 여러 Docker 호스트로 구성됩니다.

노드(node)

노드는 swarm에 참여하는 Docker 엔진의 호스트이며, 관리자 또는 작업자 노드로 구분됩니다.

  • 관리자(manager):
    • task(container)를 작업자 노드에 할당합니다.
    • swarm이 원하는 상태를 유지하기 위한 오케스트레이션 및 클러스터 관리 기능을 제공합니다.
    • 관리자 노드는 동시에 작업자 노드의 역할로도 수행할 수 있지만 일반적으로 관리자용 노드로만 구성합니다.
  • 작업자(worker):
    • 관리자 노드에서 할당한 task를 수신하고 실행합니다.
    • 각 작업자 노드에는 할당된 task 상태를 관리자 노드에 보고하기 위한 agent가 실행됩니다.

서비스(service) 및 작업(task)

서비스는 관리자 또는 작업자 노드에서 실행할 tasks의 정의입니다.

  • replica: 구동되길 원하는 tasks의 수를 지정합니다.
  • global: 서비스에 대해 각 노드에서 하나의 task를 실행합니다.
  • task: Docker 컨테이너 이미지와 컨테이너 내에서 실행할 명령으로 구성됩니다.

부하 분산

  • Swarm 관리자는 인그레스 로드 밸런싱을 사용하여 외부에서 서비스에 접근할 수 있도록 노출합니다.
  • Swarm 관리자는 노출될 publishedPort를 자동으로 할당하거나 지정할 수 있습니다. publishedPort를 지정하지 않는 경우 Swarm 관리자는 30000~32767 범위의 포트를 임의로 할당합니다.
  • Swarm 으로 구성된 모든 노드의 인바운드 트래픽은 실행 중인 task로 라우팅됩니다.
  • Swarm 모드에는 각 서비스에 대한 DNS 레코드를 자동으로 할당하는 내부 DNS 구성 요소가 있습니다. 이것은 DNS 이름을 기반으로 클러스터 내의 서비스 간에 요청을 처리할 수 있음을 의미합니다.

Swarm 구성

  • Swarm의 모든 노드는 관리자 IP 주소에 연결해야 합니다. 그렇기 때문에 관리자 IP 주소는 고정되어야 합니다.
  • 호스트 간의 통신을 위해 다음 포트를 개방하여야 합니다.
    • 클러스터 관리 통신용: TCP 2377
    • 노드 간 통신을 위한: TCP 및 UDP 7946
    • 오버레이 네트워크 트래픽용: UDP 4789
  • 다음 절차에 따라 Swarm을 구성할 수 있습니다.
# TODO 1. 관리자 노드로 실행하려는 머신에서 다음 명령을 실행하여 swarm을 생성합니다.
docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

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

# '--advertise-addr': 관리자 노드가 게시할 IP
# '--token': swarm에 새 노드를 결합할 때 token 값에 따라 관리자 또는 작업자로 참여합니다.

# TODO 2. 'docker info' 명령을 통해 현재 상태를 확인합니다.
docker info

Containers: 2
Running: 0
Paused: 0
Stopped: 2
  ...snip...
Swarm: active
  NodeID: dxn1zf6l61qsb1josjja83ngz
  Is Manager: true
  Managers: 1
  Nodes: 1
  ...snip...

# TODO 3. 'docker node ls' 명령을 통해 노드에 대한 정보를 확인합니다.
docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

# '*': 현재 연결된 노드
# 'dxn1zf6l61qsb1josjja83ngz': 노드 이름 (Docker Swarm 모드는 시스템 호스트 이름에 대한 노드 이름을 자동으로 지정)

# TODO 4. worker 노드 추가: woker 노드로 실행하려는 머신들에서 이전 manager 노드에서 'docker swarm init' 출력에서 생성된 명령을 실행합니다.
docker swarm join \
  --token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
  192.168.99.100:2377

This node joined a swarm as a worker.

# TODO 5. 관리자 노드에서 'docker node ls' 명령을 통해 조인된 작업자 노드를 확인합니다.
docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
03g1y59jwfg7cf99w4lt0f662    worker2   Ready   Active
9j68exjopxe7wfl6yuxml7a7j    worker1   Ready   Active
dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

# MANAGER 열이 비여있는 경우 Worker 노드로 간주합니다.
# 'docker node ls' 명령은 관리자 노드에서만 실행 가능합니다.

Note:

docker swarm init 명령의 출력 결과를 잊어버린 경우 manager 노드에서 docker swarm join-token worker 명령으로 다시 확인할 수 있다.

Swarm에 서비스 배포

# TODO 1. 관리자 노드에서 다음 명령을 실행합니다.
docker service create \
--replicas 1 \
--name helloworld \
alpine \
ping docker.com

9uk4639qpg7npwf3fn2aasksr

# 'docker service create' 명령은 서비스를 생성합니다.
# '--name' 옵션은 서비스 이름을 지정합니다.
# '--replicas' 실행 될 task 개수를 지정합니다.
# 'alpine' 컨테이너 이미지를 지정합니다.
# 'ping docker.com' 컨테이너 내부에서 실행 할 명령을 지정합니다.

# TODO 2. 관리자 노드에서 'docker service ls' 명령을 통해 서비스 목록을 확인합니다.
docker service ls

ID            NAME        SCALE  IMAGE   COMMAND
9uk4639qpg7n  helloworld  1/1    alpine  ping docker.com

Swarm에서 서비스 검사

# TODO 1. 관리자 노드에서 'docker service inspect --pretty <SERVICE-ID> 명령을 통해 읽기 쉬운 형식으로 서비스에 대한 세부 정보를 출력합니다.
$ docker service inspect --pretty helloworld

ID:		9uk4639qpg7npwf3fn2aasksr
Name:		helloworld
Service Mode:	REPLICATED
 Replicas:		1
Placement:
UpdateConfig:
 Parallelism:	1
ContainerSpec:
 Image:		alpine
 Args:	ping docker.com
Resources:
Endpoint Mode:  vip

# TDOO 2. 관리자 노드에서 'docker service ps <SERVICE-ID> 명령을 통해 서비스를 실행 중인 노드를 확인합니다.
$ docker service ps helloworld

NAME                                    IMAGE   NODE     DESIRED STATE  CURRENT STATE           ERROR               PORTS
helloworld.1.8p1vev3fq5zm0mi8g0as41w35  alpine  worker2  Running        Running 3 minutes

# 이 경우 worker2 노드에서 서비스가 실행 중입니다.
# Swarm은 서비스 정의에 따라 작업이 실행되고 있는지 확인할 수 있도록 'DESIRED STATE', 'CURRENT STATE' 열을 표시합니다.

# TODO 3. 서비스가 실행 중인 노드에서 'docker ps' 명령을 통해 실행 중인 task에 대한 세부 정보를 확인합니다.
[worker2]$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e609dde94e47        alpine:latest       "ping docker.com"   3 minutes ago       Up 3 minutes                            helloworld.1.8p1vev3fq5zm0mi8g0as41w35

Swarm에서 서비스 확장

# TODO 1. 관리자 노드에서 'docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>' 명령을 통해 실행 중인 서비스의 상태를 변경합니다.
docker service scale helloworld=5

helloworld scaled to 5

# TODO 2. 관리자 노드에서 'docker service ps <SERVICE-ID> 명령을 통해 업데이트된 task 목록을 확인합니다.
docker service ps helloworld

NAME                                    IMAGE   NODE      DESIRED STATE  CURRENT STATE
helloworld.1.8p1vev3fq5zm0mi8g0as41w35  alpine  worker2   Running        Running 7 minutes
helloworld.2.c7a7tcdq5s0uk3qr88mf8xco6  alpine  worker1   Running        Running 24 seconds
helloworld.3.6crl09vdcalvtfehfh69ogfb1  alpine  worker1   Running        Running 24 seconds
helloworld.4.auky6trawmdlcne8ad8phb0f1  alpine  manager1  Running        Running 24 seconds
helloworld.5.ba19kca06l18zujfwxyc5lkyn  alpine  worker2   Running        Running 24 seconds

# swarm이 총 5개의 task로 확장하기 위해 4개의 새 task를 생성하였습니다.
# task는 3개의 노드에 분산되었고, 그 중 하나는 manager1 노드에서 실행중입니다.

Swarm에서 실행 중인 서비스 삭제

# TODO 1. 관리자 노드에서 'docker service rm helloworld' 명령을 통해 서비스를 제거합니다.
docker service rm helloworld

helloworld

# TODO 2. 관리자 노드에서 'docker service inspect <SERVICE-ID> 명령을 통해 서비스가 제거됐는지 확인합니다.
docker service inspect helloworld
[]
Status: Error: no such service: helloworld, Code: 1

Note:

서비스가 더 이상 존재하지 않더라도 task를 정리하는 데 몇 초가 더 걸릴 수 있습니다.

📌출처

Docker Docs


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

docker 카테고리 내 다른 글 보러가기

댓글남기기