수색…


소개

떼는 일괄 적으로 서비스 를 배포하는 수많은 Docker 엔진 (또는 노드 )입니다. Swarm은 여러 물리적, 가상 또는 클라우드 시스템에서 처리를 분산하는 데 사용됩니다.

통사론

비고

군중 모드는 다음 기능을 구현합니다.

  • Docker Engine과 통합 된 클러스터 관리
  • 분산 된 디자인
  • 선언적 서비스 모델
  • 스케일링
  • 원하는 상태 조정
  • 다중 호스트 네트워킹
  • 서비스 발견
  • 로드 균형 조정
  • 기본적으로 보안 설계
  • 업데이트 롤링

Swarm에 관한 Docker 공식 문서는 Swarm mode overview를 참조 하십시오.


군중 모드 CLI 명령

문서에 대한 명령 설명을 클릭하십시오.

떼 짓기

docker swarm init [OPTIONS]

노드 및 / 또는 관리자로서 군단에 가입하십시오.

docker swarm join [OPTIONS] HOST:PORT

새 서비스 만들기

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

하나 이상의 서비스에 대한 자세한 정보 표시

docker service inspect [OPTIONS] SERVICE [SERVICE...]

서비스 나열

docker service ls [OPTIONS]

하나 이상의 서비스 제거

docker service rm SERVICE [SERVICE...]

하나 또는 여러 개의 복제 된 서비스 확장

docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]

하나 이상의 서비스 작업 나열

docker service ps [OPTIONS] SERVICE [SERVICE...]

서비스 업데이트

docker service update [OPTIONS] SERVICE

docker-machine 및 VirtualBox를 사용하여 Linux에서 swarm 만들기

# Create the nodes
# In a real world scenario we would use at least 3 managers to cover the fail of one manager.
docker-machine create -d virtualbox manager
docker-machine create -d virtualbox worker1

# Create the swarm
# It is possible to define a port for the *advertise-addr* and *listen-addr*, if none is defined the default port 2377 will be used.
docker-machine ssh manager \
    docker swarm init \
    --advertise-addr $(docker-machine ip manager)
    --listen-addr $(docker-machine ip manager)

# Extract the Tokens for joining the Swarm
# There are 2 different Tokens for joining the swarm.
MANAGER_TOKEN=$(docker-machine ssh manager docker swarm join-token manager --quiet)
WORKER_TOKEN=$(docker-machine ssh manager docker swarm join-token worker --quiet)


# Join a worker node with the worker token
docker-machine ssh worker1 \
    docker swarm join \
    --token $WORKER_TOKEN \
    --listen-addr $(docker-machine ip worker1) \
    $(docker-machine ip manager):2377



작업자 및 관리자 조인 토큰 찾기

swarm에 새로운 노드의 프로비저닝을 자동화 할 때 관리자의 광고 주소뿐만 아니라 swarm에 대한 올바른 조인 토큰이 무엇인지 알아야합니다. 기존 관리자 노드에서 다음 명령을 실행하면이 문제를 알 수 있습니다.

# grab the ipaddress:port of the manager (second last line minus the whitespace)
export MANAGER_ADDRESS=$(docker swarm join-token worker | tail -n 2 |  tr -d '[[:space:]]')

# grab the manager and worker token
export MANAGER_TOKEN=$(docker swarm join-token manager -q)
export WORKER_TOKEN=$(docker swarm join-token worker -q)

-q 옵션은 토큰 만 출력합니다. 이 옵션을 사용하지 않으면 웜에 등록 할 수있는 전체 명령을 얻습니다.

그런 다음 새로 제공된 노드에서 웜을 사용하여 가입 할 수 있습니다.

docker swarm join --token $WORKER_TOKEN $MANAGER_ADDRESS

Hello world 응용 프로그램

일반적으로 복제 된 오케스트레이션 응용 프로그램을 구성하기 위해 서비스 스택을 생성하려고합니다.

일반적인 현대 웹 응용 프로그램은 데이터베이스, API, 프론트 엔드 및 역방향 프록시로 구성됩니다.

고집

데이터베이스는 영속성을 필요로하기 때문에 웜의 모든 노드에서 공유되는 파일 시스템이 필요합니다. 그것은 NAS, NFS 서버, GFS2 또는 다른 어떤 것일 수 있습니다. 설정은 여기서 다루지 않습니다. 현재 Docker는 떼에서 지속성을 포함하지 않으며 지속성을 관리하지 않습니다. 이 예에서는 모든 노드에 /nfs/ shared 위치가 마운트되어 있다고 가정합니다.

회로망

서로 통신 할 수 있으려면 군대 내의 서비스가 동일한 네트워크에 있어야합니다.

IP 범위 (여기서는 10.0.9.0/24 )와 네트워크 이름 ( hello-network )을 선택하고 명령을 실행하십시오.

docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  --opt encrypted \
  hello-network

데이터 베이스

우리가 필요로하는 첫 번째 서비스는 데이터베이스입니다. postgresql을 예로 들어 보겠습니다. nfs/postgres 데이터베이스 폴더를 만들고 이것을 실행하십시오 :

docker service create --replicas 1 --name hello-db \
       --network hello-network -e PGDATA=/var/lib/postgresql/data \
       --mount type=bind,src=/nfs/postgres,dst=/var/lib/postgresql/data \
       kiasaki/alpine-postgres:9.5

--network hello-network--mount 옵션을 사용했음을 주목하십시오.

API

API를 작성하는 것은이 예에서 벗어나므로 username/hello-api 아래에 API 이미지가 있다고 가정 해 봅시다.

docker service create --replicas 1 --name hello-api \
       --network hello-network \
       -e NODE_ENV=production -e PORT=80 -e POSTGRESQL_HOST=hello-db \
       username/hello-api

데이터베이스 서비스의 이름을 전달했음을 주목하십시오. Docker Swarm에는 라운드 로빈 DNS 서버가 포함되어 있으므로 API는 DNS 이름을 사용하여 데이터베이스에 연결할 수 있습니다.

역방향 프록시

외부 세계에 API를 제공하기 위해 nginx 서비스를 만들어 보겠습니다. 공유 위치에 nginx 설정 파일을 만들고 이것을 실행하십시오 :

docker service create --replicas 1 --name hello-load-balancer \
       --network hello-network \
       --mount type=bind,src=/nfs/nginx/nginx.conf,dst=/etc/nginx/nginx.conf \
       -p 80:80 \
       nginx:1.10-alpine

우리는 포트를 공개하기 위해 -p 옵션을 사용했습니다. 이 포트는 웜의 모든 노드에서 사용할 수 있습니다.

노드 가용성

군중 모드 노드 가용성 :

  • 활성은 스케줄러가 태스크를 노드에 지정할 수 있음을 의미합니다.
  • Pause는 스케줄러가 새 태스크를 노드에 지정하지 않지만 기존 태스크는 계속 실행 중임을 의미합니다.
  • 드레인은 스케줄러가 노드에 새 태스크를 지정하지 않음을 의미합니다. 스케줄러는 기존 태스크를 종료하고 사용 가능한 노드에서 스케줄을 스케줄합니다.

모드 가용성을 변경하려면 다음을 수행하십시오.

#Following commands can be used on swarm manager(s)
docker node update --availability drain node-1
#to verify:
docker node ls

스웜 노드 승격 또는 강등

노드 또는 노드 집합을 승격 시키려면 관리자 노드에서 docker node promote 을 실행하십시오.

docker node promote node-3 node-2

Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.

노드 또는 노드 집합의 수준을 내리려면 관리자 노드에서 docker node demote 를 실행합니다.

docker node demote node-3 node-2

Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.

집을 떠나라.

작업자 노드 :

#Run the following on the worker node to leave the swarm.

docker swarm leave
Node left the swarm.

노드에 관리자 역할이 있으면 관리자 쿼럼을 유지 관리하는 것에 대한 경고가 표시됩니다. --force를 사용하여 관리자 노드에서 나갈 수 있습니다.

#Manager Node

docker swarm leave --force
Node left the swarm.

Swarm을 떠난 노드는 여전히 docker node ls 출력에 나타납니다.

목록에서 노드를 제거하려면 :

docker node rm node-2

node-2


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow