Docker Swarm 명령어
docker service create 이미지명:태그
- 도커 서비스 생성
* 옵션
--mode global : 클러스터 내의 모든 노드에 컨테이너를 반드시 하나씩 생성함. 따로 --replica가 필요 없다.
보통 global 모드는 warm cluster를 모니터링 하기 위한 agent container 등을 생성할 때 유용하다.
--replica 숫자 : 생성할 컨테이너의 개수 명시
--name 이름 : 서비스의 이름 명시
-p 외부포트:내부포트 : 포트 설정. 도커와 동일
-network=이름 : 어떤 네트워크에 속할지 정의
--update-delay 시간s : 이 서비스에 대해 업데이트를 진행할 때, 각 task에 대한 업데이트 시 일정한 시간 간격을 두도록 설정
그외에도 --update-failure-action, --update-max-failure-ratio, --update-monitor, --update-order, --update-parallelism 등의 옵션을 줄 수가 있다.
docker service ls
- 현재 서비스 확인
docker-machine ls
각 노드 설정정보 (네트워크 등) 확인
docker service ps 서비스명
- 현재 서비스의 컨테이너들과 상세정보 확인
docker service logs 서비스명
- 현재 서비스의 로그 확인
docker service rm
- 서비스 제거
docker service scale 서비스명=숫자
- 해당 숫자만큼 전체 노드에 걸쳐 replica를 만든다. 만약 노드가 3개고 scale=3 이라면, 모든 노드에 각각 들어간다.
- 만약 scale=5라면, 두 노드는 2개, 한 노드는 1개 총 5개의 replica가 들어간다.
- 만약 sacle=5 에서 2로 줄이면, 그만큼 replica가 줄어든다.
- 서비스의 업무부하가 커지면, 이 명령을 사용하여 컨테이너 복제를 늘려 규모를 키울 수 있다.
이미 실행 중에 있는 서비스에서도 가능하다.
docker service inspect --pretty 서비스명
- 서비스의 상세정보 확인
- 옵션 --pretty 는 JSON형식의 Data를 사람이 읽기 쉽운 형태로 변환한다.
docker service update 이미지:태그
- 명시한 이미지로 서비스를 업데이트한다.
docker swarm update
도커 스웜의 설정을 변경할 때 사용한다.
예시 : nginx 웹서버 서비스 만들고 컨트롤하기
1. 생성하기
서비스의 이름은 myweb이고, replica를 2개 만들고, 포트는 80으로, 이미지는 nginx 의 latest를 사용
(주의 : 서비스 내의 컨테이너는 -d(detached) mode 로 동작하는 이미지를 사용해야 함)
docker service create --name myweb --replicas 2 -p 80:80 nginx:latest
생성하면, 아래와 같이 2개의 myweb이라는 서비스의 컨테이너 2개가 여러 노드에 걸쳐 생성된다.
각각 노드의 "IP:포트" 로 접속해서 확인할 수 있다.
2. Replica 늘리기
docker service sacle myweb=3
아래와 같이 3개로 늘어난 것을 확인할 수 있다.
3. Replica 더 많이 늘리기
docker service sacle myweb=6
Docker Swarm 에서 Rolling Update 수행하기
Rolling update란, 클러스터된 서비스에서, 서비스의 downtime을 가지지 않고 클러스터 노드를 하나하나 업데이트 하는 것을 말한다. Docker Swarm에서는 Rolling update를 자체 지원하여 간단하게 사용할 수 있다. 자세한 정보를 확인하려면 아래 링크를 참고한
https://docs.docker.com/engine/swarm/services/#configure-a-services-update-behavior
1. Swarm service 생성
docker service create --name myweb --replicas 4 --update-delay 20s -p 8888:80 nginx:1.18
다음과 같이 현재 상태를 확인할 수 있다.
2. 업데이트 수행
docker service update --image nginx:1.19 myweb
이렇게 명령을 수행하면서 watch docker service ps myweb 명령으로 2초간격으로 새로고침하여 지켜볼 수 있다.
지켜보면, 맨 먼저 4개중 한개의 컨테이너(nginx1.18)가 종료되고, 그다음 종료된 노드에서 새로운 nginx1.19가 시작된다. 그 후 위에서 설정한 update-delay 20초가 지난 후에, 또 다른 하나의 컨테이너가 종료되고 새로운 컨테이너가 시작되는 과정이 반복된다. 최종적으로 아래와 같이 업데이트가 완료된다.
즉 전체 slot에 대해 “한 노드에서 기존 컨테이너를 죽인 후 새로운 높은 버전의 컨테이너를 생성하고 update delay 시간만큼 기다린 후 또 새로운 노드에서 해당 작업을 반복하는 것" 이다. 이 동안, 서비스는 문제없이 지속된다. 왜 서비스가 문제없이 지속되는지는, 다음 포스팅을 참고한다.
2020/07/08 - [Docker Advanced] - [Docker Advanced] Docker Swarm network 개념 이해
Docker Swarm 에서 Update Rollback 수행하기
업데이트를 수행한 후, 문제가 있어 이전 버전으로 원상복귀를 원할 때, rollback 명령을 사용할 수 있다. 위에서 업데이트한 상태를 rollback 해 보자. 아래는 현재 상태이다.
* 서비스 롤백
docker service rollback myweb
위 명령을 수행하면, 바로 rollback이 진행되며, rollback은 update-delay가 적용되지 않아 빠르게 진행된다. 아래와 같이 최종 결과로 붉은색 네모칸처럼 nginx가 1.18로 롤백되었다.
롤백도 마찬가지로 서비스에 문제없이 지속되며, 업데이트처럼 현재 버전 컨테이너들이 순서대로 하나씩 shutdown 되고 롤백할 낮은 버전으로 새로 컨테이너가 생성된다.
# 참고 : 기록은 언제까지 남아있는가?
docker service ps 명령으로 보면 해당 이미지의 변경 기록이 계속 남아 있는데, 이 값은 docker info의 Task History Retention Limit 값에 의해 히스토리 보관 수량이 결정된다. 이 값은 다음 명령어로 조절할 수 있다.
docker swarm update --task-history-limit 3
Docker swarm의 node 유지보수
노드, 즉 도커 엔진이 올라가 있는 물리적(또는 가상) 서버에 어떤 작업을 하기 위해 다운타임이 필요할 수 있다. 그러면 해당 노드에 있는 task (컨테이너들)을 제거해야 한다. 이 작업을 위해서는 drain 설정을 사용할 수 있다.
docker node update --availability drain 노드명
이 명령은 해당 노드의 availability 값을 active에서 drain으로 변경한다. drain 상태의 노드에는 올라가 있던 task들이 모두 종료되고 다른 노드에서 해당 task들이 실행된다. 또한 새로운 task가 실행될 때 drain 상태의 노드에서는 실행되지 않는다. 다음과 같이 모든 컨테이너가 사라진 것을 확인할 수 있다. (myweb의 scale 값은 4이므로, 다른 노드에 myweb이 실행된 것을 확인할 수 있다)
또한 아래와 같이 노드의 상태도 확인할 수 있다.
drain 값을 다시 active하기 위해서는 다음과 같이 수행한다. 이렇게 원복해도, task들이 다시 해당 노드에서 실행되지는 않으며, 현재상태가 계속 유지된다.
docker node update --availability active 노드명
Docker Swarm 에서 문제가 발생하면?
* 컨테이너에 문제가 생기는 경우
- 예를들어, docker rm -f 컨테이너명 으로 해당 컨테이너를 삭제하면, 컨테이너가 다시 살아납니다.
* 노드에 문제가 생기는 경우
- 다음과 같이 swarm-node3를 init 0 으로 종료시켜 버리면,
- 다른 살아있는 노드로 컨테이너들이 생성됩니다.
- 노드가 다시 살아나도, 다른 노드에 올라온 컨테이너는 다시 돌아오지 않습니다. 그대로 유지됩니다.
'Docker Advanced' 카테고리의 다른 글
Docker 예제 : 단독 컨테이너 실행 예제 (0) | 2020.07.16 |
---|---|
[Docker Advanced] Docker Swarm network 개념 이해 (5) | 2020.07.08 |
[Docker Advanced] Docker Swarm Cluster 구축 (0) | 2020.07.02 |
Docker 예제 : 웹서버 어플리케이션 (0) | 2020.05.15 |