상현
홈서버 덕후

swarm 스타트

( 업데이트: )

홈네트워크에 2021년 DS720+ 추가했다.

운영하는 NAS가 두대나 생기고 그 기기들의 역활을 정하다보니 docker swarm을 시도해보기로했다.

진행하면서 궁금했던 점 or 자료 정리

swarm 란?

도커에서 공식적으로 만든 오케스트레이션 툴이다.
오케스트레이션 툴? 여러 호스트 서버의 컨테이너들을 배포 및 관리를 위한 툴

배포 및 관리 뿐만 아니라 다양한 기능을 포함하고있다.

  • 컨테이너 자동 배치 및 복제
  • 로드밸런싱
  • 장애 모니터링
  • 클러스터 외부 노출
  • 컨테이너 확장 축소 (스케일업)
  • docker services 간 네트워크 노출

오케스트레이션 다른 툴

  • kubernetes 쿠버네티스 (k8s)

swarm 설정은 공식 홈페이지에서 살펴보는 것이 좋다 생각합니다.
Getting started with swarm mode | Docker Documentation

swarm manager, worker 호스트서버 사양은 어떻게 해야할까?

나는 각기 다른 사양의 머신을 가지고있다. 서버로서 사용할 수 있는 것들은

  • MacBook pro 2018 15 / i7 RAM32GB
  • DS720+
  • DS218+
  • Raspberry pi 4 RAM8GB
    그렇다면 manager는 좋은 사양으로 해야할까?
    이 것이 제일 궁금했다.

처음 설정할때 재대로 하고싶다는 생각 때문이었다.

아직 찾지 못했다. 정보 공유 코멘트 부탁드려요ㅎㅎ 🙏

docker-compose.yaml 🤝 docker swarm

나는 지금까지 docker-compose로 모든 서비스를 정의해왔다. 그럼 docker-compose로 어떻게 swarm에 배포를 해야할까?

docker stack deploy -c docker-compose.yaml {stack name}

위와 같은 방법으로 할 수 있다.

문제점 docker stack은 docker-compose.yaml의 env를 가져올 수 없다!

docker-compose.yaml 안에 env_file로 정의한 .env 파일의 내용을 가져올 수 없었다.
그래서 살펴보니 공식적으로 지원하지 않는다고

https://github.com/moby/moby/issues/29133#issuecomment-278198683

docker stack deploy -c <(docker-compose config) stackname

나는 위와같이 해서 해결했다.

위에서 docker-compose -f 컴포즈파일지정과 stack 이름만 변경해서 사용하면된다. 이렇게되면 .env파일이 적용된 config를 토대로 만들어진다.

특정 머신에 서비스 배포하기

특정 머신, 특정 호스트, 매니저 호스트 등등 특정 조건을 토대로 서비스를 배포하게 설정할 수 있다.

version: "3.8"

services:
  whoami:
    image: "test"
    deploy:
      placement:
        constraints:
          - node.hostname == ${HOSTNAME}Code language: JavaScript (javascript)

docker-compose.yaml과 다르게 deploy라는 부분안에서 설정하는게 기존 docker와 다른점이다.

위 예시에서 constraints node.hostname 설정은 특정 호스트에 배포하겠다는 뜻이다.

호스트네임은 docker node ls를 통해서 알 수 있다.