Docker
부두 몰이 모드
수색…
소개
떼는 일괄 적으로 서비스 를 배포하는 수많은 Docker 엔진 (또는 노드 )입니다. Swarm은 여러 물리적, 가상 또는 클라우드 시스템에서 처리를 분산하는 데 사용됩니다.
통사론
득점 군 초기화 : 멍청 해군 초기화 [옵션]
노드 및 / 또는 관리자로 swarm에 가입 : docker swarm join [옵션] HOST : PORT
새 서비스 만들기 : 도커 서비스 만들기 [옵션] 이미지 [명령] [ARG ...]
하나 이상의 서비스에 대한 자세한 정보 표시 : docker service inspect [옵션] SERVICE [서비스 ...]
서비스 나열 : docker 서비스 ls [옵션]
하나 이상의 서비스 제거 : docker service rm SERVICE [SERVICE ...]
하나 또는 여러 개의 복제 된 서비스 확장 : 도커 서비스 규모 SERVICE = 복제본 [서비스 = 복제본 ...]
하나 이상의 서비스 작업 목록 표시 : docker service ps [OPTIONS] SERVICE [SERVICE ...]
서비스 업데이트 : 고정 표시기 서비스 업데이트 [옵션] 서비스
비고
군중 모드는 다음 기능을 구현합니다.
- 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