위 목표를 달성하기 위해선 node 에label 이란걸 달아줄 수 있습니다.
예를 들어 node A 에 serviceA 라는 라벨을 달아 두고 추후에 serviceA 라벨을 가지고 있는 node 에게 특정 과제를 부여할 수 있습니다.
docker node update --label-add <label_name>=true <node_id|node_name>
제 경우 docker registry 를 담당하는 node 를 추가하는 작업중이라 위의 상황을 예제로 사용하겠습니다.
위 명령어를 통해 특정 node 에 원하는 이름의 label 추가를 할 수 있습니다.
docker node update --label-add d-registry=true <node_id|node_name>
docker node ls
위 명령어를 통해 <node_id|node_name> 를 확인할 수 있습니다.
onam@dev-1:~$ docker node inspect d-registry --format '{{.Spec.Labels}}'
map[]
onam@dev-1:~$ docker node update --label-add d-registry=true d-registry
d-registry
onam@dev-1:~$ docker node inspect d-registry --format '{{.Spec.Labels}}'
map[d-registry:true]
기존 d-registry 인스턴스에 없던 레이블이 명령어 사용 후 새롭게 생긴걸 확인할 수 있습니다.
docker node inspect <node_name> --format '{{.Spec.Labels}}'
위 명령어는 특정 docker swarm node 의 label 을 확인하는 명령어 입니다.
위에서map[d-registry:true]
를 명령어로 확인 가능하고 아래에서 docker service create 명령어를 사용할 때 위 레이블을 포함하고 있는 swarm node 만 할당시켜 줄 수 있습니다.
docker service create \
--name d-registry \
--publish published=5000,target=5000 \
--replicas 2 \
--constraint 'node.labels.d-registry == true' \
--mount type=bind,source=/mnt/registry-data,target=/var/lib/registry \
registry:2
- name: 생성하고자 하는 docker service 의 이름을 정할 때 사용합니다.
- publish host_port:container_port : 서비스를 외부에 노출하기 위해 포트를 매핑합니다.
- host_port: 호스트(또는 노드)의 포트 번호.
- container_port: 컨테이너 내부에서 서비스가 사용하는 포트 번호.
- 위 예시의 경우 클라이언트는 호스트의 5000번 포트를 통해 컨테이너의 5000번 포트에 접근할 수 있습니다.
- replicas: 서비스의 복제본(컨테이너)을 몇 개 실행할지 지정합니다.
- 여러 복제본이 필요하면 숫자를 늘리면 됩니다.
- 예: --replicas 3 → 3개의 컨테이너 실행.
- constraint: 특정 조건(제약)을 기반으로 서비스가 실행될 노드를 선택합니다.
- 구조: node.labels.<label_key> ==
label_key: 노드에 설정된 레이블 키.
value: 노드 레이블의 값.- 예시:
--constraint 'node.labels.d-registry == true'
: d-registry=true 레이블이 설정된 노드에서만 서비스가 실행됩니다.
--restart 옵션:
- no (기본값): 컨테이너가 멈춰도 자동으로 재시작하지 않음.
- always: 컨테이너가 종료되거나 호스트가 재부팅될 때 자동으로 재시작.
- on-failure: 컨테이너가 비정상 종료(에러 코드 반환)될 경우에만 재시작.
- unless-stopped: 컨테이너가 수동으로 중지되지 않는 한 항상 재시작
docker service create \
--name d-registry \
--publish 5000:5000 \
--replicas 1 \
--constraint 'node.labels.d-registry == true' \
--mount type=bind,source=/mnt/registry-data,target=/var/lib/registry \
--mount type=bind,source=/mnt/c/config.yml,target=/etc/docker/registry/config.yml \
registry:2
/mnt/c/config.yml 파일고 연동해서 서비스 생성하기