같이보기

기본 사용법

Swarm Manager 생성 & Worker 가입

Manager 생성

docker swarm init --autolock
  • 이때 출력 되는 following key 하단 키를 잘 보관해야함

  • 호스트PC 재부팅시 입력해야 될 수도 있음

    provide the following key:
    	SWMKEY-1-XDeU3XC75Ku7rvGXixJ0V7evhDJGvIAvq0D8VuEAEaw
개방할 포트
  • TCP-2377: Manager-Worker 간 통신 포트
  • TCP/UDP-7946: Overlay 네트워크 노드 검색
  • UDP-4789: Overlay 네트워크 트레픽 송/수신

Worker 가입

  • Manager 가 init 을 수행하면 이런 출력이 나옴
    해당 명령을 등록하려는 Worker 호스트pc에 입력

  • IP 주소는 내부IP 주소로 출력되므로 외부 호스트 연결은 외부 ip 주소로 대체 해야함

    docker swarm join --token <> <ip주>:<포트번>

Swarm 탈퇴 & Swarm 모드 중지

  • 아예 왼전히 Swarm 연관성을 제거하기위해서는 Worker, Manager 쪽 둘 다 해야함

Worker 쪽

docker swarm leave --force

Manager 쪽

docker swarm leave --force && docker node rm <호스트ID>
# 호스트 id는 docker node ls 로 확인 

swarm 정보확인

  • Manager 나, Worker가 자신이 어떤 swarm에 가입 되있는지 확인 가능
docker info
# swarm 부분 확인

Node 조회 & 관리

# 연결된 Manager & Worker 조회
docker node ls
 
# 연결된 node 삭제
docker node rm <node_id>
 
# 라벨 달기
docker node update --label-add <>=<> <node_id>

서비스 생성

# 기본 생성
docker service create --name <서비스> --replicas <replicas> <이미지>
 
# 포트 개방 시
docker service create --name <서비스> --replicas <replicas> <이미지> \
--publish=<바인딩 >:<내부포>
  • constraint 와 같은 조건을 걸지 안은 경우 명령을 수행하고 있는 호스트PC 에 replicas 값 만큼 컨테이너가 생성이 된다
  • 배치 제약 조건 (--constraint):
    • 특정 노드에 서비스를 배치하거나, 제외하고 전부 서비스에 배치가능
  • 배치 스프레드 (--placement-pref):
    • 설정한 replicas수 만큼 조건에 맞는 노드에 균등하게 배포함
    • 만약 replicas=4 라면 A=2개 B=2개 이런 식으로 균등하게 배치해서 로드 벨런싱이 가능한거

특정 Worker에 서비스 생성하기

docker service create --name <서비스> --replicas <replicas> \
--constraint node.hostname==<Worker 호스트> \
<이미지 명>
 
===만약 라벨을 경우 이렇게도 조건 가능==
--constraint node.labels.<>==<>

모든 호스트에 분산 처리하기

# hostname 을 가진 모든 node 에 replicas 수 만큼 나눠서 배치하기
docker service create --name <서비스> --replicas <replicas> \
--placement-pref 'spread=node.hostname' \
<이미지 명>

서비스 조회 & 관리

# 서비스 조회
docker service ls
 
# 서비스 삭제
docker service rm <서비스>
 
# 서비스 로그 보기
# -f 실시간으로 보기, -n 최대출력 줄
docker service logs -f -n <> <서비스>

swarm 을 Docker-Compose 로 관리 시 명령어

  • docker compose 명령어가 아닌 docker stack 을 써야함
# Compose 배포 
docker stack deploy -d -c <Compose> <stack>
 
# 배포된 swarm compose 목록 확인
docker stack ls
 
# swarm compose 삭제
# 컨테이너랑 네트워크는 삭제되는데 이미지는 삭제 안됨
docker stack rm <stack>

swarm 에서 GPU 사용하기

사전 작업

  1. GPU GUID 확인

    nvidia-smi -a | grep UUID
    # GPU-XXXXX
  2. /etc/docker/daemon.json 파일 수정

    없으면 만듬

    {
    	"runtimes": {
    		"nvidia": {
    			"path": "/usr/bin/nvidia-container-runtime",
    			"runtimeArgs": []
    		}
    	},
    	"default-runtime": "nvidia",
    		"node-generic-resources": [
    			"NVIDIA-GPU=<위에서 확인한 GUID"
    		]
    	}
  3. /etc/nvidia-container-runtime/config.toml에 아래 구문 추가

    swarm-resource = "DOCKER_RESOURCE_GPU"
  4. docker 재시작

    sudo systemctl restart docker

서비스 생성 시

  • ENV 에 NVIDIA_VISIBLE_DEVICES 를 추가

    docker service create --replicas 1 -e NVIDIA_VISIBLE_DEVICES='ALL' <이미>
  • (참고) docker-compose 사용 시

    services:
        run:
            deploy:
                replicas: 1
            environment:
                # docker swarm에서 gpu 사용을 위한 환경 변수 
                - NVIDIA_VISIBLE_DEVICES=ALL

명령어 정리

docker service create <옵션> <이미지명>

서비스 생성 & 실행

옵션

  • --name <서비스 이름>
    • 서비스 이름 지정
  • --hostname:
    • 호스트 이름 지정
  • --label:
    • 라벨 추가
  • --replicas <replicas 수>:
    • replicas 수 지정 (컨테이너 하나만 만들려면 1로)
  • --publish=<바인딩 포트>:<내부포트>:
    • service 포트 개방
  • --constraint:
    • 배치 제약 조건
    • 특정 노드에 서비스를 배치하거나, 제외하고 전부 서비스에 배치가능
  • --placement-pref:
    • 배치 스프래드
    • 설정한 replicas수 만큼 조건에 맞는 노드에 균등하게 배포함
    • 만약 replicas=4 라면 A=2개 B=2개 이런 식으로 균등하게 배치해서 로드 벨런싱이 가능한거

docker service update <옵션> <서비스 명>

해당 서비스 옵션 업데이트

옵션

  • --publish-add published=<바인딩 포트>,target=<내부포트>:
    • 개방할 포트 추가
  • --publish-rm:
    • 개방 포트 제거
  • -t:
    • tty 할당

docker node update <옵션> <적용할 node_id>

node 정보 업데이트

옵션

  • --availability <active | pause | drain>:
    • node 상태 변경
  • --label-add <라벨 키>:
    • 라벨 추가
  • --label-rm
    • node 라벨 삭제

docker node promote <적용할 node_id>

해당 node를 Manager로 승격
다만 잘 안되는듯

docker node demote <적용할 node_id>

해당 node를 Worker로 강등