컨테이너 오케스트레이션을 위한 Docker Swarm
게시 됨: 2019-08-08Docker Swarm에 대한 모든 것과 클러스터의 모든 컨테이너를 관리하고 오케스트레이션하는 방법.
도커 스웜이란?
Docker swarm은 Docker 엔진 클러스터를 처리하는 모드이므로 Swarm이라는 이름이 붙습니다. Docker 호스트 클러스터는 관리자와 작업자로 구성된 스웜 모드에서 실행됩니다. Swarm에 참여하는 docker-engine 인스턴스를 노드라고 합니다.
프로덕션 수준의 스웜 배포는 여러 서버에 분산된 도커 노드로 구성됩니다.
왜 사용합니까? – 컨테이너 오케스트레이션
프로덕션 환경에서 작업할 때 수백 개의 도커 컨테이너가 여러 애플리케이션을 실행합니다. 이러한 모든 컨테이너를 관리하는 것은 모든 DevOps 엔지니어에게 큰 고통이 될 수 있습니다. Docker Swarm이 도움이 되는 곳입니다. 여러 도커 컨테이너를 실행하는 클러스터를 쉽게 관리하고 오케스트레이션합니다.
다음은 일부 기능입니다.
- 고가용성 – 가동 중지 시간이나 중단을 제공하지 않는 것을 목표로 합니다.
- 로드 밸런싱 – 노드가 실패할 경우 클러스터의 다른 노드에 리소스와 요청을 자동으로 할당합니다.
- 탈중앙화 – 여러 관리자 노드가 프로덕션 환경에서 실행됩니다. 따라서 클러스터는 단일 관리자 노드에 종속되지 않습니다.
- 확장성 – 단일 docker swarm 명령을 사용하여 클러스터에서 컨테이너를 쉽게 확장하거나 축소할 수 있습니다.
Docker 컨테이너 조정
이제 Docker Swarm의 기본 사항을 알았으므로 구현 예를 살펴보겠습니다.
이 예에서는 아래 세부 정보를 사용하여 클러스터에서 3개의 머신을 실행하고 있습니다.
manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102
docker에서 swarm 모드를 초기화하려면 관리자 노드에서 아래 명령을 실행하십시오. --advertise-addr
플래그는 클러스터에 참여할 수 있는 노드에 자신을 광고하는 데 사용됩니다.
geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104 Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
위의 명령은 다른 노드에서 이 클러스터에 가입하는 데 사용할 토큰을 생성합니다. 생성된 토큰과 함께 명령을 복사하고 작업자 노드에서 실행하십시오.
worker1 노드에서 토큰을 실행합니다.
geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
worker2 노드에서 토큰을 실행합니다.
geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
이제 관리자 노드에서 클러스터에서 실행 중인 노드를 확인할 수 있습니다.
geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
Dockerfile Tutorial에서 사용한 geekflare_mongodb
도커 이미지를 빌드해봅시다.
docker build -t geekflare_mongodb .
Swarm 서비스를 생성하여 MongoDB 도커 이미지의 컨테이너를 실행합니다. 27017은 MongoDB가 노출되는 포트 번호입니다.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. kok58xa4zi05psh3uy6s5x9e6 overall progress: 1 out of 1 tasks 1/1: running verify: Service converged
docker swarm 서비스가 시작되었는지 확인하십시오. MODE 복제 는 클러스터의 모든 노드에서 컨테이너가 복제되었음을 의미하고 REPLICAS 1/1은 현재 하나의 스웜 서비스만 실행 중임을 의미합니다.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp
이 단일 서비스가 실행 중인 클러스터의 노드를 확인하겠습니다. manager1 노드에서 실행 중입니다.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago
docker ps 명령을 실행하여 이 Swarm 서비스를 실행하는 컨테이너에 대한 자세한 정보를 얻으십시오.
geekflare@manager1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx
기본 "복제" 모드 대신 "전역" 모드에서 스웜 서비스를 실행할 수도 있습니다. 글로벌 모드는 클러스터의 모든 노드에서 스웜 서비스의 하나의 작업을 실행합니다.
글로벌 모드에서 서비스를 실행하기 전에 실행 중인 기존 컨테이너를 제거하겠습니다.
geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
–mode 플래그를 사용하여 전역 모드에서 도커 컨테이너 내에서 swarm 서비스를 시작합니다.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. mfw8dp0zylffppkllkcjl8391 overall progress: 3 out of 3 tasks utdr3dnngqf1: running lssbyfzuiuh3: running xs6jqp95lw4c: running verify: Service converged
Swarm 서비스가 글로벌 모드에서 시작되었는지 확인하십시오. 클러스터에서 3개의 노드(관리자 1개, 작업자 2개)가 실행되고 있으므로 복제본의 수는 3입니다.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp
현재 3개의 노드에서 3개의 서비스가 실행 중입니다. 아래 명령어를 실행하여 확인하세요.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago 3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago
다음으로 복제본 수를 정의하는 방법을 보여 드리겠습니다. 그 전에 현재 실행 중인 컨테이너를 제거하겠습니다.

geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
명령에 –replicas 플래그를 사용하고 Swarm 서비스에 대해 원하는 복제본 수를 언급합니다. 예를 들어, Swarm 서비스의 두 복제본을 갖고 싶습니다.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. 4yfl41n7sfak65p6zqwwjq82c overall progress: 2 out of 2 tasks 1/2: running 2/2: running verify: Service converged
현재 실행 중인 Swarm 서비스를 확인합니다. 하나의 복제본이 manager1 노드에서 실행되고 다른 복제본이 worker1 노드에서 실행되는 것을 볼 수 있습니다.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago
worker1 노드로 이동하여 도커 컨테이너가 swarm 서비스를 실행 중인지 확인하십시오.
geekflare@worker1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv
이 컨테이너를 중지하려면 아래 명령을 실행하세요.
geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb
이제 manager1 노드에서 서비스를 실행 중인 모든 노드를 확인하면 manager1 노드와 worker2 노드에서 실행 중인 것을 볼 수 있습니다. worker1 노드의 CURRENT STATE는 Shutdown입니다(서비스를 실행하는 컨테이너를 중지했기 때문에). 그러나 이 서비스는 두 개의 복제본이 실행되어야 하므로 작업자 2에서 다른 서비스가 시작되었습니다.
이것이 docker swarm을 사용하여 고가용성을 달성하는 방법입니다.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago
도커 컨테이너를 확장하거나 축소하는 것은 매우 쉽습니다. 아래 명령은 mongo 컨테이너를 5로 확장합니다.
geekflare@manager1:~$ docker service scale Mongo-Container=5 Mongo-Container scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged
현재 실행 중인 mongo 컨테이너의 복제본 수를 확인합니다. 5개여야 합니다.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp
이 5개의 복제본이 클러스터에서 실행 중인 위치를 확인하십시오. 1개의 복제본은 manager1 노드에서 실행되고 2개의 복제본은 두 작업자 노드에서 각각 실행됩니다.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago
클러스터에서 서비스가 관리자 노드에서 실행되는 것을 원하지 않고 노드 관리용으로만 유지하려는 경우 관리자 노드를 배출할 수 있습니다.
geekflare@manager1:~$ docker node update --availability drain manager1 manager1
관리자 노드의 가용성을 확인하십시오.
geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
서비스가 더 이상 관리자 노드에서 실행되지 않는 것을 볼 수 있습니다. 클러스터의 작업자 노드에 분산되어 있습니다.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)" qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago
Docker Swarm과 Docker Swarm 모드에서 컨테이너를 오케스트레이션하는 방법에 대한 내용이었습니다. 작동 방식에 대한 아이디어를 얻으려면 비프로덕션 환경에서 이를 시도하십시오.