고 가용성 달성을위한 Docker Swarm



Docker Swarm에 대한이 블로그는 고 가용성을 달성하기 위해 구성된 Docker Swarm을 통해 Docker 엔진 클러스터를 설정하는 기능에 대해 설명합니다.

웹 기반 애플리케이션의 가장 중요한 기능은 무엇입니까? 많지만 나를 위해 고 가용성 가장 중요합니다. 이것이 Docker Swarm이 우리가 달성하는 데 도움이되는 것입니다! 응용 프로그램의 가용성을 높이는 데 도움이됩니다.

이전 블로그 , Docker Compose의 작동 방식을 설명했습니다. Docker Swarm에 대한이 블로그는 전자의 연속이며 여기에서는 다중 컨테이너 애플리케이션을 컨테이너화하기 위해 Docker Swarm을 사용하는 이점에 대해 설명했습니다.





이 블로그의 경우 Docker Swarm이 적용되는 Angular 애플리케이션 일뿐입니다.
노트 : MEAN Stack 앱을 컨테이너화하는 방법은 동일합니다.

그렇다면 Docker Swarm이란 무엇입니까?

도커 스웜 클러스터를 만들고 유지하는 기술입니다. Docker 엔진 . Docker 엔진은 다른 노드에서 호스팅 될 수 있으며 원격 위치에있는 이러한 노드는 클러스터 Swarm 모드로 연결되었을 때.



Docker Swarm을 사용하는 이유

이미 언급 한 이유 때문에! 달성 고 가용성 다운 타임없는 것은 모든 서비스 제공 업체의 우선 순위입니다. 고 가용성이 고객에게 깊은 인상을 줄까요? 글쎄요, 그들은 다운 타임에 직면하더라도 감명받지 않을 것입니다. 그것은 생각할 필요가 없습니다.

Docker Swarm의 다른 이점

다른 많은 서비스와 마찬가지로 Docker Swarm은 로드 밸런싱 우리를 위해. 따라서 DevOps 엔지니어는 하나가 실패 할 때 처리 요청을 다른 노드로 라우팅 할 필요가 없습니다. 클러스터의 관리자가 자동으로로드 밸런싱을 수행합니다.

분산 된 액세스 또 다른 이점입니다. 그게 무슨 뜻입니까? 즉, 관리자에서 모든 노드에 쉽게 액세스 할 수 있습니다. 관리자는 또한 정기적으로 노드에 메시지를 표시하고 다운 타임에 대처하기 위해 상태 / 상태를 추적합니다. 그러나 노드는 다른 노드 / 관리자에서 실행중인 서비스에 액세스하거나 추적 할 수 없습니다.



아니오를 확인할 수 있습니다. 노드에서 실행되는 컨테이너 수, 확장 아니. 컨테이너 또는 축소 아니. 요구 사항에 따라 하나의 명령 만 실행하면됩니다.

응용 프로그램이 배포 된 후에도 지속적 업데이트 CI (지속적 통합)가 달성되었는지 확인합니다. 롤링 업데이트는 한 노드에 차례로 발행되므로 다운 타임이없고 부하가 클러스터의 다른 노드간에 분산됩니다.

그럼 다음은? 명백한 일을하기 위해서. 이미 Docker에서 작업했거나 조직에서 안정적인 웹 서비스를 컨테이너화하려는 경우 Docker Swarm을 시작하십시오.

노트 : Docker 엔진은 독립 호스트 / 서버 또는 호스트의 여러 VM에 설치됩니다.

Swarm 모드 시작하기

에코와 인쇄의 PHP 차이점

Docker Swarm은 관리자에 의해 시작됩니다. 또는 이렇게 말하면 Swarm 클러스터를 시작하는 인스턴스가 관리자가됩니다. 클러스터를 시작하는 명령은 다음과 같습니다.

$ docker swarm init --advertise-addr ip-address

여기서‘–advertise-addr’플래그는 클러스터에 가입하려는 다른 노드에 자신을 알리는 데 사용됩니다. 관리자의 IP 주소는 플래그와 함께 지정되어야합니다. 아래는 샘플 스크린 샷입니다.

docker init 명령-docker swarm-edureka

Swarm 클러스터가 시작되면 관리자 쪽에서 토큰이 생성됩니다. 이 토큰은 스웜 클러스터에 참여하기 위해 다른 노드에서 사용해야합니다.

정확히 어때? 관리자의 도커 엔진에서 생성 된 전체 토큰을 복사하여 노드의 도커 엔진에 붙여넣고 실행합니다. 위의 스크린 샷에서 강조 표시된 부분은 토큰입니다. 작업자 노드에서 토큰을 실행하면 아래 스크린 샷과 같습니다.

클러스터에 참여하는 모든 노드는 나중에 관리자로 승격 될 수 있습니다. Docker 엔진을 관리자로 가입하려면 관리자 끝에서 아래 명령을 실행하십시오.

$ docker swarm join-token 관리자

나중에 노드에 대한 토큰을 클러스터에 가입 시키려면 다음 명령을 실행하십시오.

$ docker swarm join-token 노드

계속해서 원하는 모든 노드에서 토큰을 실행하여 클러스터에 가입하십시오. 모든 작업이 완료되면 docker node list 명령을 실행하여 상태와 함께 클러스터에 가입 한 노드 수를 확인할 수 있습니다. 명령은 다음과 같습니다.

$ docker 노드 ls

스크린 샷은 다음과 같습니다.

Angular 앱용 Docker 이미지 만들기

모든 것이 정상이면 Docker 이미지가 빌드 된 경우 Swarm 서비스를 시작할 수 있습니다. Docker 이미지는 Dockerfile에서 빌드 할 수 있습니다. 애플리케이션을 빌드하는 데 사용되는 Dockerfile은 다음과 같습니다.

FROM node : 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY. / usr / src / app EXPOSE 4200 CMD [ 'npm', 'start']

Dockerfile은 기본 이미지에서 사용자 지정 Docker 이미지를 빌드하기 위해 일련의 명령을 함께 실행하는 데 사용됩니다. 보시다시피 제가 사용한 기본 이미지는‘Node : 6’입니다. NodeJS는 버전 6으로 태그가 지정된 Docker Hub의 이미지 I입니다.

그런 다음 컨테이너 내부에 새 Docker 디렉터리를 만들고 컨테이너 내부의 작업 디렉터리로 만듭니다.

내 로컬 컴퓨터에서 컨테이너의 작업 디렉터리로‘package.json’파일을 복사하고 있습니다. 그런 다음 'RUN npm cache clean'및 'RUN npm install'명령을 지정합니다. npm 설치 명령은 package.json 파일에 언급 된 종속성 버전을 다운로드합니다.

그런 다음 로컬 컴퓨터에서 컨테이너로 모든 프로젝트 코드를 복사하여 브라우저에서 Angular 애플리케이션에 액세스하기위한 포트 번호 4200을 노출하고 마지막으로 애플리케이션을 컨테이너화하는 npm start 명령을 지정합니다.

이제이 Dockerfile을 기반으로 Docker 이미지를 생성하려면 아래 명령을 실행합니다.

$ docker build -t angular-image.

노트 : Docker 이미지는 클러스터의 모든 노드에 빌드되어야합니다. 그것 없이는 컨테이너를 다른 Docker 엔진에서 회전시킬 수 없습니다.

자바의 프레임이란?

Docker Swarm 서비스 시작

Docker 이미지가 빌드되었으므로이 이미지에서 컨테이너를 회전 할 수 있습니다. 그러나 우리는 더 나은 것을 할 것입니다 : 그것으로부터 Docker Swarm 서비스를 만듭니다. 스웜 서비스를 만드는 명령은 다음과 같습니다.

$ docker service create --name 'Angular-App-Container'-p 4200 : 4200 각도 이미지

여기서 'name'플래그는 내 서비스에 이름을 부여하는 데 사용되고 'p'플래그는 컨테이너 포트를 호스트 포트에 노출하는 데 사용됩니다. package.json 파일에서 Angular 앱이 호스팅되어야하는 컨테이너 포트를 지정했습니다. 이 명령의 4200은 컨테이너의 포트 4200을 호스트의 포트 4200에 매핑하는 데 도움이됩니다.‘angular-image’는 이전에 구축 한 이미지의 이름입니다.

생각해 내다 : 서비스를 생성 할 때 클러스터의 모든 도커 엔진에서 호스팅 할 수 있습니다. 떼의 관리자가 호스팅 할 위치를 결정합니다. 그러나 호스트되는 노드에 관계없이 응용 프로그램은 클러스터에 연결된 모든 노드에서 localhost : 4200에 액세스 할 수 있습니다.

어떻게 가능합니까? Swarm은 클러스터의 다른 모든 노드에서 액세스 할 수 있도록 포트 번호를 내부적으로 노출하기 때문입니다. 즉, 포트 번호입니다. 클러스터의 모든 노드 / 관리자에서 4200은 Angular 응용 프로그램을 렌더링합니다.

이제 뭐? 컨테이너가 활성화되어 있습니까?

docker service list 명령을 실행하여 서비스가 컨테이너화되었는지 확인할 수 있습니다. 그러나 컨테이너가 배포되는 데 1 분 정도 걸릴 수 있습니다. 다음은 명령입니다.

$ docker 서비스 ls

이 명령은 Swarm 클러스터에서 관리하는 모든 서비스를 나열합니다. 우리의 경우 하나의 활성 컨테이너를 표시해야합니다. 아래 스크린 샷을 참조하십시오.

여기서“REPLICAS = 1 / 1”은 클러스터에 해당 컨테이너의 단일 '서비스'가 있음을 나타냅니다. 'MODE = replicated'는 서비스가 클러스터의 모든 노드에 복제되었음을 나타냅니다.

이제 앱이 호스팅되는 노드 / 관리자를 식별하기 위해 docker service ps 명령 다음에 컨테이너 이름을 실행할 수 있습니다. 명령은 다음과 같습니다.

$ docker service ps Angular-App-Container

동일한 스크린 샷은 아래와 같습니다.

여기에는 서비스를 시작하는 데 사용되는 명령과 함께 애플리케이션이 호스팅되는 노드에 대한 세부 정보가 나와 있습니다.

‘docker ps’명령은 활성 컨테이너에 대한 세부 정보를 표시합니다. 명령은 다음과 같습니다.

$ docker ps

아래 스크린 샷을 참조하십시오.

그러나이 명령은 클러스터 관리자와 서비스가 실제로 호스팅되는 노드에서만 작동합니다.

실행중인 노드 수를 확인하려면 node list 명령을 실행하십시오. 명령은 다음과 같습니다.

$ docker 노드 ls

특정 호스트에서 실행중인 컨테이너를 확인하려면 node ps 명령을 실행하십시오. 명령은 다음과 같습니다.

$ docker 노드 ps

기억 하시나요? 이전에 서비스가 현재 복제 된 MODE에서 실행 중이라고 언급했습니다. 이는 서비스가 클러스터의 모든 노드에 복제됨을 의미합니다. 대안이 있다고 생각하십니까?

물론! 글로벌 모드라는 것이 있습니다. 이 모드에서는 클러스터의 모든 단일 관리자에서 실행되는이 컨테이너의 서비스가 있습니다. 다른 컨테이너 세트를 회전하기 전에 현재 서비스 / 컨테이너를 중지해야합니다.

이에 대한 명령은 다음과 같습니다.

$ docker service rm Angular-App-Container

전역 모드에서 컨테이너를 회전하는 명령은 다음과 같습니다.

$ docker service create --name 'Angular-App-Container'-p 4200 : 4200 --mode global angular-image

이렇게하면 클러스터의 3 개 노드에 3 개의 서비스가 생성됩니다. docker service list 명령을 실행하여 확인할 수 있습니다. 이 스크린 샷은 아래와 같습니다.

docker service ps 명령이 실행되면 다음과 같은 내용이 표시됩니다.

보시다시피 모드가 복제되고이 컨테이너의 복제본은 3이라고 표시되어 있습니다. 이제이 블로그의 가장 중요한 부분입니다.

3 개의 컨테이너간에 2 개의 서비스 복제본이 실행되도록하려면 replicas 플래그를 사용할 수 있습니다. 아래 명령을보십시오.

$ docker service create --name 'Angular-App-Container'-p 4200 : 4200 --replicas = 2 각도 이미지

이 두 서비스는 클러스터의 세 노드간에 부하가 분산되어 있음을 알 수 있습니다. docker service process 명령을 실행하여 컨테이너가 활성화 된 노드를 확인합니다. 아래 스크린 샷을 참조하십시오. 컨테이너는 하나의 관리자 노드와 하나의 작업자 노드에서 활성화됩니다.

작업자 노드에서 'docker ps'명령을 실행하여 컨테이너가 실행 중인지 확인할 수 있습니다.

고 가용성을위한 Docker Swarm

이제 클러스터에 고 가용성이 있는지 실제로 확인하려면 노드 중 하나가 다운되고 클러스터의 다른 노드가이를 보완하는 시나리오를 경험해야합니다. 다음 명령을 사용하여 노드 중 하나에서 컨테이너를 수동으로 중지하여 해당 시나리오를 가져올 수 있습니다.

$ docker stop Angular-App-Container

컨테이너가 실행중인 노드 Worker-1에서 위 명령을 실행합니다.관리자에서 다음 명령을 실행하십시오.

$ docker service ps Angular-App-Container

이제 컨테이너가 이제 노드 작업자 -2 및 관리자에서 실행되고 있음을 알 수 있습니다. 그러나 노드 : Worker-1에서 종료되었습니다. 아래 스크린 샷에서도 마찬가지입니다.

이것이 방법입니다 Docker 고 가용성 성취됐다. 나는컨테이너가 Worker-1에서 비활성 상태 임에도 불구하고 해당 작업자 노드의 포트 번호 4200에서 응용 프로그램을 렌더링 할 수 있습니다. 이는 클러스터의 다른 노드에 내부적으로 연결되어 있고 브라우저에서 애플리케이션을 렌더링 할 수 있기 때문입니다.

서비스 확장 후 고 가용성

복제 모드 또는 전역 모드에 관계없이 클러스터에서 실행되는 서비스 수를 확장 할 수 있습니다. 확장 후에도 고 가용성을 유지할 수 있습니다. 대단하지 않나요?

그러나 우리의 요점으로 돌아가서 클러스터의 서비스 수를 확장하는 것이 얼마나 쉬운 지 살펴 보겠습니다. 클러스터에 2 개 또는 3 개의 복제본이 있다고 가정하고 단일 명령을 실행하여 서비스를 5 개로 확장하겠습니다. 명령은 다음과 같습니다.

$ docker 서비스 규모 Angular-App-Container = 5

이 스크린 샷은 아래와 같습니다.

docker service list 명령을 실행하면 복제본 수가 이제 5 개임을 알 수 있습니다. 그리고 서비스 이름과 함께 docker service ps 명령을 실행하면 5 개 서비스가 3 개 노드에서로드 밸런싱되고 분산되는 방식을 확인할 수 있습니다. . 명령은 다음과 같습니다.

$ docker service ls $ docker service ps Angular-App-Container

마지막으로 Docker Swarm 설정에서 관리자가 절차에 참여하는 것을 원하지 않고 프로세스를 관리하는 데만 사용하는 것을 원하지 않는 경우 관리자가 모든 애플리케이션을 호스팅하지 않도록 할 수 있습니다. 이것이 세상에서 작동하는 방식이기 때문이죠? 관리자는 다른 작업자를 관리하기위한 것입니다. 어쨌든이를 수행하는 명령은 다음과 같습니다.

$ docker node update --availability drain Manager-1

docker node list 명령과 docker service ps 명령을 실행하여 관리자가 이제 클러스터에 참여하고 있는지 확인할 수 있습니다.

$ docker node ls $ docker service ps Angular-App-Container

이제 컨테이너 서비스가 작업자 노드로 나뉘었고 관리자 노드가 서비스 컨테이너화에서 실제로 배출되었음을 알 수 있습니다. 스크린 샷은 아래와 같습니다.

tableau의 필터 유형

따라서 Docker Swarm에 대한이 블로그가 끝났습니다. 이 블로그가 고 가용성을 달성하기 위해 Swarm 모드를 구현하는 것이 얼마나 중요한지 설명했으면합니다. 이 Docker 자습서 시리즈에서 더 많은 블로그를 계속 지켜봐주십시오.

또는 아래 비디오를 시청하여 Docker Swarm의 작동 방식을 이해할 수 있습니다. 위에서 설명한 모든 개념은 비디오에서 다룹니다.

고 가용성을위한 Docker Swarm | Docker 튜토리얼 | DevOps 튜토리얼

이제 Docker에 대해 배웠으므로 전 세계에 걸쳐 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 작성했습니다. 이 Edureka Docker 인증 교육 과정은 학습자가 Docker를 구현하고 마스터하는 데 필요한 전문 지식을 습득하는 데 도움이됩니다.

질문이 있으십니까? 의견란에 언급 해 주시면 연락 드리겠습니다.