docker stack deploy 명령어를 사용하여 Swarm 서비스 관리 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker stack deploy 명령을 사용하여 Docker Swarm 서비스를 효과적으로 관리하는 방법을 배우게 됩니다. 먼저, 애플리케이션 스택의 청사진 역할을 하는 간단한 docker-compose.yml 파일을 준비하는 것으로 시작합니다.

준비가 완료되면 이 스택을 Docker Swarm 에 배포하고, 정의된 서비스의 성공적인 배포를 확인한 다음, compose 파일을 수정하여 스택을 업데이트하는 방법을 살펴보겠습니다. 마지막으로, 업데이트된 구성에서 더 이상 참조되지 않는 서비스를 정리하여 Swarm 이 깨끗하고 효율적으로 유지되도록 하는 방법을 배우게 됩니다.

Swarm 배포를 위한 간단한 docker-compose 파일 준비

이 단계에서는 Docker Swarm 에 스택을 배포하는 데 사용할 간단한 docker-compose.yml 파일을 준비합니다. docker-compose를 사용하기 전에 먼저 설치해야 합니다.

먼저, docker-compose를 설치해 보겠습니다. 바이너리를 다운로드하고 실행 가능하게 만들 것입니다.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

이 명령은 공식 GitHub 릴리스 페이지에서 docker-compose 바이너리를 다운로드하여 /usr/local/bin/docker-compose에 저장합니다. $(uname -s)$(uname -m) 부분은 운영 체제와 아키텍처를 자동으로 감지합니다. chmod +x 명령은 다운로드한 파일을 실행 가능하게 만듭니다.

이제 버전을 확인하여 설치를 확인해 보겠습니다.

docker-compose --version

콘솔에 설치된 docker-compose의 버전이 출력되어야 합니다.

다음으로, ~/project 디렉토리에 간단한 docker-compose.yml 파일을 생성합니다. 이 파일은 nginx 이미지를 사용하여 단일 서비스를 정의합니다.

nano ~/project/docker-compose.yml

다음 내용을 nano 편집기에 붙여넣습니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

docker-compose.yml 파일을 자세히 살펴보겠습니다.

  • version: '3.8'은 Compose 파일 형식 버전을 지정합니다. 버전 3.8 은 Swarm 배포에 적합합니다.
  • services:는 애플리케이션을 구성하는 서비스를 정의합니다.
  • web:은 서비스의 이름입니다. 원하는 이름을 선택할 수 있습니다.
  • image: nginx:latest는 이 서비스에 사용할 Docker 이미지를 지정합니다. 공식 nginx 이미지의 최신 버전을 사용하고 있습니다.
  • ports:는 호스트와 컨테이너 간의 포트를 매핑합니다. "80:80"은 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑합니다.

Ctrl + X, Y, Enter를 차례로 눌러 파일을 저장합니다.

이 서비스를 배포하기 전에 nginx:latest 이미지가 로컬에서 사용 가능한지 확인해야 합니다. docker pull 명령을 사용하여 이미지를 가져올 수 있습니다.

docker pull nginx:latest

이 명령은 nginx:latest 이미지를 Docker Hub 에서 로컬 머신으로 다운로드합니다.

이제 배포할 준비가 된 간단한 docker-compose.yml 파일과 필요한 이미지를 가져왔습니다.

compose 파일을 사용하여 Swarm 에 스택 배포

이 단계에서는 docker-compose.yml 파일에 정의된 스택을 Docker Swarm 에 배포합니다. 스택을 배포하기 전에 Docker Swarm 을 초기화해야 합니다.

먼저, Swarm 을 초기화해 보겠습니다. 단일 VM 을 사용하고 있으므로 단일 노드 Swarm 으로 초기화합니다.

docker swarm init

이 명령은 새 Swarm 을 초기화하고 현재 노드를 관리자 노드로 만듭니다. Swarm 이 초기화되었음을 나타내는 출력을 볼 수 있습니다.

이제 Swarm 이 초기화되었으므로 docker stack deploy 명령을 사용하여 스택을 배포할 수 있습니다. 스택에 이름을 지정합니다. 예를 들어, mywebstack입니다.

docker stack deploy -c ~/project/docker-compose.yml mywebstack

이 명령을 자세히 살펴보겠습니다.

  • docker stack deploy는 Swarm 에 스택을 배포하는 데 사용되는 명령입니다.
  • -c ~/project/docker-compose.yml은 배포에 사용할 Compose 파일을 지정합니다. 이전 단계에서 생성한 파일을 사용하고 있습니다.
  • mywebstack은 스택에 지정하는 이름입니다. 이 이름은 Swarm 내에서 이 스택에 속하는 서비스 및 컨테이너를 식별하는 데 사용됩니다.

이 명령을 실행하면 Docker Swarm 이 docker-compose.yml 파일에 정의된 서비스를 생성합니다. 서비스가 생성되거나 업데이트되고 있음을 나타내는 출력을 볼 수 있습니다.

스택이 배포되었는지 확인하기 위해 실행 중인 스택을 나열할 수 있습니다.

docker stack ls

이 명령은 Swarm 에 배포된 모든 스택의 목록을 표시합니다. mywebstack이 나열되어야 합니다.

또한 스택 내에서 실행 중인 서비스를 나열할 수도 있습니다.

docker stack services mywebstack

이 명령은 mywebstack 스택과 관련된 서비스를 표시합니다. mywebstack_web 서비스가 복제본 및 이미지 정보와 함께 나열되어야 합니다.

마지막으로, 서비스 작업의 상태를 확인해 보겠습니다.

docker service ps mywebstack_web

이 명령은 mywebstack_web 서비스에 대한 작업 (실행 중인 컨테이너) 을 표시합니다. 상태가 Running인 작업이 하나 이상 표시되어야 합니다.

이제 Docker Swarm 을 성공적으로 초기화하고 docker-compose.yml 파일을 사용하여 스택을 배포했습니다.

배포된 서비스 확인

이 단계에서는 이전 단계에서 배포된 서비스가 올바르게 실행되고 있는지, 그리고 접근 가능한지 확인합니다. Nginx 웹 서버를 배포했으며, 포트 80 에서 수신 대기해야 합니다.

먼저, docker service ls 명령을 사용하여 Swarm 에서 실행 중인 서비스 목록을 확인해 보겠습니다.

docker service ls

mywebstack_web 서비스가 1/1 복제본과 함께 나열되어야 합니다. 이는 서비스의 인스턴스 하나가 실행 중임을 나타냅니다.

다음으로, curl을 사용하여 컨테이너 내에서 실행 중인 Nginx 웹 서버에 접근할 수 있습니다. 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑했으므로, 포트 80 에서 localhost를 통해 접근할 수 있습니다.

curl localhost:80

이 명령은 포트 80 에서 localhost로 HTTP 요청을 보냅니다. Nginx 서버가 올바르게 실행 중이면 기본 Nginx 환영 페이지 HTML 을 출력으로 받게 됩니다. 이는 서비스가 실행 중이며 호스트 머신에서 접근 가능하다는 것을 확인합니다.

web 서비스에 대한 실행 중인 컨테이너를 추가로 검사하기 위해 docker ps 명령을 사용할 수 있습니다.

docker ps

이 명령은 실행 중인 모든 컨테이너를 나열합니다. nginx 이미지를 실행하는 컨테이너가 mywebstack_web.1.<task_id>와 유사한 이름으로 표시되어야 합니다. PORTS 열에는 0.0.0.0:80->80/tcp가 표시되어 포트 매핑을 확인합니다.

docker service inspect 명령을 사용하여 서비스의 세부 정보를 검사할 수도 있습니다.

docker service inspect mywebstack_web

이 명령은 구성, 작업 및 네트워크 설정을 포함하여 mywebstack_web 서비스에 대한 자세한 정보를 제공합니다. 출력을 스크롤하여 서비스에 대한 다양한 세부 정보를 확인할 수 있습니다.

이러한 검사를 수행하여 배포된 Nginx 서비스가 예상대로 실행되고 있으며 접근 가능하다는 것을 확인했습니다.

수정된 compose 파일로 스택 업데이트

이 단계에서는 docker-compose.yml 파일을 수정하여 배포된 스택을 업데이트합니다. Nginx 이미지 버전을 변경하고 두 번째 서비스를 추가합니다.

먼저, docker-compose.yml 파일을 편집해 보겠습니다.

nano ~/project/docker-compose.yml

두 번째 서비스 (예: alpine 서비스) 를 포함하도록 파일을 수정하고 Nginx 이미지 버전을 1.21.6으로 변경합니다. 업데이트된 파일은 다음과 같아야 합니다.

version: "3.8"
services:
  web:
    image: nginx:1.21.6
    ports:
      - "80:80"
  alpine:
    image: alpine:latest
    command: ["sleep", "infinity"]

변경 사항을 살펴보겠습니다.

  • web 서비스의 imagenginx:latest에서 nginx:1.21.6으로 변경했습니다.
  • alpine이라는 새 서비스를 추가했습니다.
  • alpine 서비스는 alpine:latest 이미지를 사용합니다.
  • command: ["sleep", "infinity"]alpine 컨테이너를 무기한으로 실행 상태로 유지합니다.

Ctrl + X, Y, Enter를 차례로 눌러 수정된 파일을 저장합니다.

업데이트된 스택을 배포하기 전에 새 nginx:1.21.6alpine:latest 이미지를 가져와야 합니다.

docker pull nginx:1.21.6
docker pull alpine:latest

이제 동일한 docker stack deploy 명령과 동일한 스택 이름을 사용하여 업데이트된 스택을 배포할 수 있습니다. Docker Swarm 은 docker-compose.yml 파일의 변경 사항을 감지하고 기존 스택을 업데이트합니다.

docker stack deploy -c ~/project/docker-compose.yml mywebstack

Docker Swarm 은 web 서비스에 대해 롤링 업데이트를 수행하여 이전 nginx:latest 컨테이너를 nginx:1.21.6을 사용하는 새 컨테이너로 대체합니다. 또한 새 alpine 서비스와 해당 컨테이너를 생성합니다. 서비스가 업데이트되거나 생성되고 있음을 나타내는 출력을 볼 수 있습니다.

업데이트를 확인하기 위해 스택의 서비스를 다시 나열해 보겠습니다.

docker stack services mywebstack

이제 mywebstack_webmywebstack_alpine 서비스가 모두 나열되어야 합니다. mywebstack_web 서비스는 업데이트된 이미지 nginx:1.21.6을 표시해야 합니다.

docker-compose.yml 파일을 수정하고 다시 배포하여 배포된 스택을 성공적으로 업데이트했습니다.

compose 파일에서 더 이상 참조되지 않는 서비스 정리

이 단계에서는 docker-compose.yml 파일을 다시 수정하여 서비스를 제거합니다. 스택을 다시 배포하면 Docker Swarm 은 Compose 파일에 더 이상 정의되지 않은 서비스가 있음을 감지하고 해당 서비스를 제거합니다. 이 프로세스를 때때로 서비스 "정리 (pruning)"라고 합니다.

먼저, docker-compose.yml 파일을 편집하여 alpine 서비스를 제거해 보겠습니다.

nano ~/project/docker-compose.yml

파일에서 전체 alpine: 섹션을 제거합니다. 파일은 원래 상태로 되돌아가 web 서비스만 정의해야 합니다.

version: "3.8"
services:
  web:
    image: nginx:1.21.6
    ports:
      - "80:80"

Ctrl + X, Y, Enter를 차례로 눌러 수정된 파일을 저장합니다.

이제 수정된 docker-compose.yml 파일을 사용하여 스택을 다시 배포합니다.

docker stack deploy -c ~/project/docker-compose.yml mywebstack

Docker Swarm 은 mywebstack 스택의 현재 상태를 업데이트된 docker-compose.yml 파일의 정의와 비교합니다. 파일에 alpine 서비스가 더 이상 없음을 확인하고 해당 서비스와 해당 작업을 Swarm 에서 제거합니다. alpine 서비스가 제거되고 있음을 나타내는 출력을 볼 수 있습니다.

alpine 서비스가 제거되었는지 확인하기 위해 스택의 서비스를 다시 나열합니다.

docker stack services mywebstack

이제 mywebstack_web 서비스만 나열되어야 합니다. mywebstack_alpine 서비스는 사라져야 합니다.

마지막으로, Swarm 환경을 정리하기 위해 전체 스택을 제거할 수 있습니다.

docker stack rm mywebstack

이 명령은 모든 서비스와 작업을 포함하여 mywebstack 스택을 제거합니다. 제거를 확인하는 출력을 볼 수 있습니다.

스택이 제거되었는지 확인하기 위해 스택을 다시 나열합니다.

docker stack ls

mywebstack은 더 이상 나열되지 않아야 합니다.

docker-compose.yml 파일에서 서비스를 제거하고 다시 배포하여 스택에서 서비스를 성공적으로 정리 (prune) 했으며, 전체 스택을 제거하여 환경을 정리했습니다.

요약

이 랩에서는 docker stack deploy 명령을 사용하여 Docker Swarm 서비스를 관리하는 방법을 배웠습니다. 먼저 Docker 용 다중 서비스 애플리케이션을 정의하는 표준 방법인 간단한 docker-compose.yml 파일을 준비하는 것으로 시작했습니다. 여기에는 docker-compose를 설치하고 포트 매핑이 있는 단일 Nginx 서비스를 정의하는 기본 YAML 파일을 만드는 작업이 포함되었습니다.

준비 후, docker stack deploy를 사용하여 이 스택을 Docker Swarm 에 배포하고 서비스의 성공적인 배포를 확인한 다음, docker-compose.yml 파일을 수정하고 다시 배포하여 스택을 업데이트하는 연습을 했습니다. 마지막으로, 업데이트된 compose 파일에 더 이상 정의되지 않은 서비스를 정리 (prune) 하는 방법을 배워 Swarm 환경이 깨끗하게 유지되고 현재 애플리케이션 정의를 반영하도록 했습니다.