같이보기
기본 사용법
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 사용하기
사전 작업
-
GPU GUID 확인
nvidia-smi -a | grep UUID # GPU-XXXXX
-
/etc/docker/daemon.json
파일 수정없으면 만듬
{ "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "default-runtime": "nvidia", "node-generic-resources": [ "NVIDIA-GPU=<위에서 확인한 GUID" ] }
-
/etc/nvidia-container-runtime/config.toml
에 아래 구문 추가swarm-resource = "DOCKER_RESOURCE_GPU"
-
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로 강등