Docker Swarm의 구조와 서비스 배포하기
그러면 Docker Swarm에 Application을 배포해 보겠습니다. Docker Swarm에 Application Image를 배포하기 위해 선, 서비스를 생성해야 합니다. Service Big은 Application Context를 받아들이는 Microservice의 이미지를 의미하며, HTTP Server, Database 또는 반대 환경에서 실행하려는 다양한 유형의 런타임 프로그램이 여기에 속한다고 할 수 있습니다. 서비스를 생성하고자 할 때, Container Image와 Container 내에서 검색해 보세요. 또한, 다음과 같은 옵션을 정의하여 사용합니다.
- Docker Swarm 외부에서 접속할 수 있는 포트
- Docker Swarm 내부의 또 다른 서비스와 커뮤니케이션하기 오버레이 네트워크
- CPU 및 메모리 사용에 대한
- 롤링 업데이트
- Image의 Replica 구성
서비스
Service가 라이센스형 컨테이너를 직접 실행하는 방식으로 비교하는 주요 이점 중 하나는, 수동으로 서비스를 다시 사용하려면 필요 없이 연결된 네트워크 및 볼륨 등의 구성을 가질 수 있습니다. Docker는 구성을 수정하고 종료한 구성의 서비스 작업을 중지하도록 요청하고, 원하는 구성과 일치하는 새로운 작업을 생성할 것입니다. Docker가 Swarm 모드에서 실행 중이라고, 서비스 능력뿐만 아니라 Swarm에 참여하고 있는 모든 Docker 호스트에 대해 실행형 컨테이너를 플레이할 수 있습니다. Service와 면면형 컨테이너의 주요 차이점은 Service는 Manager Node에서만 관리할 수 있고 면형 컨테이너는 모든 Docker Daemon에서 실행될 수 있다는 점입니다.
서비스가 태스크를 태스크가 컨테이너를
Service를 배포할 때 먼저 Manager Node는 Service 정의서로 생성할 Service에 대한 상태 및 설정 정보를 받습니다. 다음과 같은 타 노드에서 서비스에 대한 복제 작업을 실행하도록 Scheduling합니다. 이 때, 노드들은 서로 독립적인 작업을 수행합니다. 컨테이너는 격리된 프로세스이며, 각자의 작업은 정확히 하나의 컨테이너를 호출하게 됩니다. 일단 컨테이너가 나타나면, Scheduler는 작업을 실행하면서 상태를 인식하고, 컨테이너의 상태를 검사하지 않거나 종료하면 작업이 종료됩니다.
Task는 Docker Swarm의 가장 작은 Scheduling 단위입니다. 서비스를 생성하거나 수정하기 위해 서비스의 상태를 정의하면 Ochestrator는 작업을 예약하여 정의된 상태로 서비스를 정의하게 됩니다. 예를 들어, Ochestrator에게 마이크로 서비스를 항상 3개의 인스턴스로 유지하도록 서비스를 정의하려고 했을 때, Ochestrator는 3개의 작업을 생성하는 것입니다. 각각의 작업은 스케줄러가 컨테이너를 생성하여 표시하는 슬롯 이라고 할 수 있도록 컨테이너는 작업이 완료되도록, — 준비 — 실행의 방향으로 처리됩니다. 만약 작업이 실행되지 않으면 Ochestrator는 해당 작업과 컨테이너를 제거한 다음, 이를 대체할 새로운 작업을 생성합니다. 아래 그림은 Docker Swarm에서 서비스 생성 요청을 받아들이고, 작업을 작업자 노드에 예약하는 방법을 유지합니다.
![](https://miro.medium.com/v2/resize:fit:700/0*MlNGOdA3HvaCFrnH.png)
서비스 배포
서비스 배포에는 복제와 글로벌이라는 두 가지 유형이 있습니다. 복제된 서비스는 사용자가 원할 수 있을 만큼 작업을 동일하게 생성하여 실행되는 서비스입니다(가장 일반 서비스 유형이며, 일반 애플리케이션을 배포할 때 사용하도록 생각하면 됩니다). Global Service는 모든 Node에서 하나의 작업을 실행하는 서비스이며, 새롭게 지정된 Task의 변경이 없습니다. Swarm에 노드를 추가할 때마다, Ochestrator는 작업을 생성하는 Scheduler는 작업을 새로운 노드에합니다. 글로벌 서비스는 모니터링 에이전트, 바이러스 백신 스캐너 또는 Swarm의 모든 노드에서 실행해야 하는 컨테이너를 만들 수 있습니다. 아래 그림은 나비로 표현된 3개의 Replicated Service와 회색으로 표현된 Global Service를 표시합니다.
![](https://miro.medium.com/v2/resize:fit:700/0*aVfAgtx89r-J8Nqy.png)
서비스의 배제 처리
Docker Swarm의 Manager Node는 서비스가 수많은 요청을 수용할 수 있도록 하기 위해 Ingress Load Balancing 기능을 사용합니다. 그러기 위해, Manager Node가 자동으로 해당 서비스의 반대 포트(PublishedPort)를 이용하거나, 관리자가 직접 해당 서비스를 PublishedPort에 접근할 수도 있습니다(만약 포트를 입장하지 않는 경우, Manager Node는 30000 ~ 32767 범위내의 포트입니다) 이를 자동으로 처리합니다). 이 후 외부에서는 Node가 현재 작업을 실행 중 인지 여부와 관계 없이, Cluster의 모든 Node의 PublishedPort를 사용할 수 있는 서비스에 접근할 수 있습니다.
또한, Docker Swarm은 내부 DNS 구성 요소에 해당하며, DNS 항목에 있는 각 서비스를 자동으로 할 수 있습니다. Manager Node는 내부 Load Balancing을 사용하여, Service의 DNS 이름에 따라 Cluster에서 서비스를 요청하고 싶습니다. 클러스터는 내부 컨테이너간 내부 로드 밸런싱과 클러스터에 보관하는 트래픽에 대한 외부 로드 밸런싱 모두 처리가 가능하며, Docker 엔진에 내장된 로드 밸런싱 기능을 수행할 수 있습니다.
서비스 배포하기
이제부터 직접 서비스를 Swarm에 배포해 보겠습니다(아래의 예제는 Docker 공식문서에서 .
Swarm Manager에서 서비스 배포
Docker Swarm의 Manager Node에 접속하세요.
![](https://miro.medium.com/v2/resize:fit:700/1*l9IOWhKoJbK1VhKATyAMGw.png)
서비스를 docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
생성합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*x2ziqMUlR4bRjUOYpiqWFw.png)
서비스가 생성되어 docer service ls [OPTIONS]
서비스 목록을 확인합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*-znKcA_KFLtgQtjLkcG8jw.png)
생성된 서비스가 로그인되어 로그인 docker service ps [OPTIONS] SERVICE [SERVICE...]
됩니다.
![](https://miro.medium.com/v2/resize:fit:700/1*xSQJfFjauQm8mv3DmjTIgA.png)
docker service inspect [OPTIONS] SERVICE [SERVICE...]
로 생성된 서비스의 상세정보를 확인합니다. --pretty
Option으로 JSON형식의 데이터를 사람이 쉽게 읽을 수 있도록 변환할 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*fn3C461po5gmCJn4BzNVKg.png)
Docker Swarm의 Manager Node에서 삶 docker-machine ls [OPTIONS] [ARG...]
과 로각 Worker Node의 URL
을(를) 경험하고, 접속합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*NFQ_NAoUYHKXGUmq-kehIA.png)
매니저 노드
![](https://miro.medium.com/v2/resize:fit:700/1*VmJ9cQJ5z_GXezZrk80BzQ.png)
워커 노드
![](https://miro.medium.com/v2/resize:fit:700/0*2Iz6kR9fGSCy9pgF.png)
![](https://miro.medium.com/v2/resize:fit:700/0*KX-zSpoxzOoLS-Te.png)
워커 노드에서 서비스 배포
구성한 작업자 노드 중 한 노드에 접속합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*MLoPimy-OyiCbj0Z5I0Hvg.png)
서비스를 docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
생성합니다. 서비스는 생성되지 않으며, Swarm Manager가 아닌 노드에서는 클러스터 상태를 유지할 수 있으며 오류 메시지를 처리할 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*OnUWUxFRrDVaoXx1gRT8sw.png)
배포된 서비스 확장하기
지금부터는 Docker Swarm에 배포된 서비스를 통해, Scaling과 배포된 애플리케이션의 버전 업데이트/롤백 기능을 살펴보겠습니다.
스케일링
docker service ls [OPTIONS]
으로 서비스 목록을 확인합니다. 현재 생성된 Service의 Replica 변경가 1인 것을 알 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*hULSIdHwVO-E6kmzZ67ZCw.png)
서비스 목록 중 서비스 하나를 선택하여 docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
로 원하는 만큼 Scaling합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*eWwU-8UJEDrXVuelnQBE9A.png)
Service가 Scaling docker service ls [OPTIONS]
으로 인해 확인되었습니다. REPLICAS열에서 대응할 수 있도록 변경할 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*x4yLsDN6IvJEZnJePS5IPw.png)
docker service ps [OPTIONS] SERVICE [SERVICE...]
로 실제로 몇 가지 작업을 실행 중인지 확인합니다. 교체해야 할 만큼 작업을 확장할 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*j8esC_4yYIJGgE5j3Tk7jg.png)
롤링 업데이트
docker service inspect [OPTIONS] SERVICE [SERVICE...]
로 생성된 서비스의 상세정보를 확인합니다. 해당 서비스는 최신 버전(1.13.6)의 Nginx Image를 바탕으로 생성된 것을 제공할 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*FllEwndS5huLX-SMH7IxkQ.png)
서비스의 이미지를 docker service update [OPTIONS] SERVICE
사용하여 다른 버전의 이미지로 변경합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*hQYxMqhC45cPtBM3l6Kvfw.png)
서비스가 업데이트되어, docker service ps [OPTIONS] SERVICE [SERVICE...]
로 확인합니다. 기존 작업의 상태는 Shutdown으로 변경되어 각 REPLICA마다 새로운 작업을 실행 중일 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*9Ttkk4hujBZofR5xXM4w7w.png)
그것, docker service inspect [OPTIONS] SERVICE [SERVICE...]
로 서비스의 이미지에 대한 상세정보를 확인합니다. Image가 변경되는 버전이 있을 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*2ygMdwek9WW78hCxhG2HBQ.png)
롤백
docker service rollback [OPTIONS] SERVICE
로 이전 상태의 버전으로 복구합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*P73_lhWFrHgzL10HERuJYw.png)
그것, docker service inspect [OPTIONS] SERVICE [SERVICE...]
로 서비스의 이미지에 대한 상세정보를 확인합니다. 1.12.2 버전으로 생성된 서비스의 상태가 종료로 변경되고, 다시 최신 버전으로 작업이 생성되어 실행 중인 상태를 확인할 수 있습니다.
![](https://miro.medium.com/v2/resize:fit:700/1*oJk-qwGOJ0exvVr0MYk1iw.png)
그것, docker service inspect [OPTIONS] SERVICE [SERVICE...]
로 서비스의 이미지에 대한 상세정보를 확인합니다. Image가 변경되기 전에 버전을 변경해야 합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*OkZuH0pwulGCb9LabV7X3Q.png)
서비스 삭제하기
docker service ls [OPTIONS]
와로 docker service ps [OPTIONS] SERVICE [SERVICE...]
현재 실행 중인 서비스 목록을 확인합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*6lDeCBpYjKkMFkttoDi5lQ.png)
docker service rm SERVICE [SERVICE...]
으로 서비스를 삭제하세요.
![](https://miro.medium.com/v2/resize:fit:700/1*f7WYKn2APC7L6Te3gztm-g.png)
서비스를 삭제하고 docker service ls [OPTIONS]
로 docker service ps [OPTIONS] SERVICE [SERVICE...]
확인합니다.
![](https://miro.medium.com/v2/resize:fit:700/1*MBSIwVH_fIEcO3pG7BZtQQ.png)
Docker Swarm의 서비스는 배포된 애플리케이션의 고가용성을 가리키고 있습니다. 롤링 업데이트와 롤백 기능을 제공함으로써, 배포 시 발생할 수 있는 서비스 중단 상황에 대비할 수 있도록 할 수 있도록 해야 하며, 정의된 Replica의 범위를 조정하는 컨테이너를 유지하기 위해 주기도 합니다. 또한, 트래픽에 따라 Load Balancing이 존재하도록 관리됩니다. 이 모든 것들이 본질적으로 동작할 수 없다는 것은 점, 클러스터 노드간 또는 배포된 서비스나 컨테이너간 연결 Docker의 네트워크 구조에 영향을 미칠 수 있습니다. 따라서, 다음 관련자들에서는 Docker의 Network에 대해 뛰어난 품질을 확보할 수 있습니다.