소개
Docker Swarm 은 대규모로 Docker 컨테이너를 배포하고 관리할 수 있는 강력한 클러스터 관리 및 오케스트레이션 솔루션입니다. 이 튜토리얼에서는 Docker Swarm 을 설정하고, Swarm 서비스를 관리 및 확장하며, Docker 의 컨테이너 오케스트레이션 기능의 모든 잠재력을 활용하는 방법을 배웁니다.
Docker Swarm 은 대규모로 Docker 컨테이너를 배포하고 관리할 수 있는 강력한 클러스터 관리 및 오케스트레이션 솔루션입니다. 이 튜토리얼에서는 Docker Swarm 을 설정하고, Swarm 서비스를 관리 및 확장하며, Docker 의 컨테이너 오케스트레이션 기능의 모든 잠재력을 활용하는 방법을 배웁니다.
Docker Swarm 은 Docker 컨테이너를 위한 네이티브 클러스터링 및 오케스트레이션 도구입니다. Swarm 이라고 불리는 Docker 엔진 그룹을 관리하고, Swarm 에 서비스를 배포할 수 있습니다. Docker Swarm 에서 Docker 엔진들은 하나의 가상 Docker 호스트로서 함께 작동합니다.
노드 (Nodes): 노드는 Swarm 에 참여하는 개별 Docker 엔진입니다. 두 가지 유형의 노드가 있습니다: 매니저 (managers) 와 작업자 (workers).
서비스 (Services): 서비스는 애플리케이션의 원하는 상태를 정의합니다. 서비스는 단일 컨테이너일 수도 있고, 함께 작동하는 컨테이너 그룹일 수도 있습니다.
작업 (Tasks): 작업은 Swarm 에서 스케줄링의 원자 단위입니다. 각 서비스는 작업으로 나뉘며, 이 작업들은 사용 가능한 노드에 실행되도록 스케줄링됩니다.
로드 밸런싱 (Load Balancing): Docker Swarm 은 서비스에 대한 내장 로드 밸런싱 기능을 제공합니다. 매니저 노드는 자동으로 작업자 노드에 작업을 분산하여 높은 가용성과 확장성을 보장합니다.
네이티브 오케스트레이션 (Native Orchestration): Docker Swarm 은 네이티브 오케스트레이션 도구입니다. 즉, Docker 엔진에 내장되어 있으며 추가 소프트웨어가 필요하지 않습니다.
간편함 (Simplicity): Docker Swarm 은 설정 및 관리가 비교적 간편하여 소규모에서 중규모 배포에 적합한 선택입니다.
높은 가용성 (High Availability): Docker Swarm 은 자동 작업 스케줄링 및 로드 밸런싱과 같은 내장 고가용성 기능을 제공합니다.
확장성 (Scalability): Docker Swarm 은 필요에 따라 노드와 컨테이너의 수를 쉽게 확장하거나 축소할 수 있습니다.
보안 (Security): Docker Swarm 은 역할 기반 액세스 제어 및 암호화된 통신을 포함한 Docker 엔진과 동일한 보안 기능을 사용합니다.
이제 Docker Swarm 에 대한 기본적인 이해를 갖추셨으니, 다음 섹션인 Docker Swarm 초기화로 넘어가겠습니다.
Docker Swarm 을 초기화하기 전에 Docker 호스트 (노드) 세트를 준비해야 합니다. 물리적 또는 가상 머신을 사용할 수 있으며, Docker 버전이 동일해야 합니다.
Docker Swarm 을 초기화하려면 노드 중 하나를 매니저로 지정해야 합니다. 원하는 노드에서 다음 명령어를 실행하여 이를 수행할 수 있습니다.
docker swarm init --advertise-addr <MANAGER-IP>
<MANAGER-IP>를 매니저 노드의 IP 주소로 바꿔야 합니다.
이 명령어를 실행하면 Swarm 에 다른 노드를 작업자로 추가하는 데 사용할 수 있는 토큰을 받게 됩니다. 원하는 노드에서 다음 명령어를 실행하여 노드를 작업자로 추가할 수 있습니다.
docker swarm join --token <TOKEN> <MANAGER-IP>:2377
<TOKEN>을 docker swarm init 명령어에서 받은 토큰으로, <MANAGER-IP>를 매니저 노드의 IP 주소로 바꿔야 합니다.
매니저 노드에서 다음 명령어를 실행하여 Swarm 상태를 확인할 수 있습니다.
docker node ls
이 명령어는 Swarm 의 모든 노드 목록과 해당 노드의 역할 (매니저 또는 작업자) 및 상태를 표시합니다.
기본적으로 Swarm 내 노드 간 통신은 Raft 프로토콜을 사용하여 암호화됩니다. 그러나 mTLS(Mutual Transport Layer Security) 인증을 활성화하여 Swarm 을 더욱 안전하게 할 수 있습니다.
mTLS 를 활성화하려면 필요한 인증서를 생성하고 배포해야 합니다. 매니저 노드에서 docker swarm ca 명령어를 사용하여 이를 수행할 수 있습니다.
docker swarm ca --rotate
이 명령어는 새로운 루트 및 중간 인증서를 생성하고 Swarm 의 모든 노드에 배포합니다.
이제 Docker Swarm 을 초기화했으므로 다음 섹션인 Swarm 서비스 관리 및 확장으로 넘어가겠습니다.
Docker Swarm 에 서비스를 배포하려면 docker service create 명령어를 사용할 수 있습니다. 예를 들어, Nginx 웹 서버를 배포하려면 다음 명령어를 실행할 수 있습니다.
docker service create --name nginx -p 80:80 nginx:latest
이렇게 하면 "nginx"라는 새 서비스를 생성하고 Swarm 에 배포합니다. 서비스는 호스트에서 포트 80 을 노출하고 컨테이너 내부의 포트 80 으로 전달합니다.
docker service scale 명령어를 사용하여 서비스의 복제본 (작업) 수를 확장할 수 있습니다. 예를 들어, "nginx" 서비스를 5 개의 복제본으로 확장하려면 다음을 실행할 수 있습니다.
docker service scale nginx=5
이렇게 하면 "nginx" 서비스에 4 개의 추가 작업이 생성되고, 매니저 노드는 사용 가능한 작업자 노드에 자동으로 이들을 스케줄링합니다.
docker service update 명령어를 사용하여 서비스의 구성을 업데이트할 수 있습니다. 예를 들어, "nginx" 서비스를 다른 이미지 버전으로 업데이트하려면 다음을 실행할 수 있습니다.
docker service update --image nginx:1.19 nginx
이렇게 하면 "nginx" 서비스가 "nginx:1.19" 이미지를 사용하도록 업데이트됩니다.
docker service ls 및 docker service ps 명령어를 사용하여 Swarm 서비스의 상태를 모니터링할 수 있습니다. docker service ls 명령어는 Swarm 에서 실행 중인 모든 서비스 목록을 표시하고, docker service ps 명령어는 서비스 내 각 작업의 상태를 표시합니다.
## 모든 서비스 목록
docker service ls
## 특정 서비스의 작업 목록
docker service ps nginx
노드에서 유지보수를 수행해야 하는 경우, 해당 노드에서 실행 중인 작업을 다른 사용 가능한 노드로 다시 스케줄링하도록 하여 노드를 "배출 (drain)"할 수 있습니다. docker node update 명령어를 사용하여 이 작업을 수행할 수 있습니다.
docker node update --availability drain <NODE-ID>
<NODE-ID>를 배출하려는 노드의 ID 로 바꿔야 합니다.
이로써 Docker Swarm 서비스 관리 및 확장에 대한 기본 사항을 다루었습니다. 이 지식을 통해 Docker Swarm 에서 실행되는 애플리케이션을 배포, 확장 및 유지 관리할 수 있을 것입니다.
이 튜토리얼을 마치면 Docker Swarm 에 대한 확실한 이해와 Swarm 서비스 설정, 컨테이너화된 애플리케이션의 손쉬운 확장 방법을 갖추게 될 것입니다. Docker Swarm 의 기능을 활용하여 컨테이너 배포 및 관리 프로세스를 간소화하고, 애플리케이션의 고가용성과 확장성을 보장하십시오.