BBahmni 한국어 매뉴얼검색
한국어 번역 완료
한국어English

Docker Swarm에서 Bahmni 실행

Docker Swarm은 Docker 컨테이너를 위한 기본 클러스터링 및 오케스트레이션 솔루션입니다. 여러 Docker 노드를 하나의 가상 시스템처럼 동작하는 Swarm으로 만들고 관리합니다. 고가용성, 확장성, 부하 분산을 제공하므로 대규모 컨테이너 배포에 적합합니다.

Bahmni는 Docker Compose에서 스택의 각 서비스를 별도 컨테이너로 정의해 개별적으로 시작·중지할 수 있습니다. 단일 노드에서는 명령 하나로 전체 스택을 쉽게 구성하고 실행합니다. Docker Swarm에서는 Bahmni 서비스를 Swarm 서비스로 정의해 여러 노드에 분산할 수 있으며 고가용성과 부하 분산을 얻습니다. 롤링 업데이트와 스케일링도 지원하므로 운영 배포에 유용합니다.관련 문서: Docker에서 Bahmni 실행

Bahmni는 또 다른 대표적인 컨테이너 오케스트레이션 도구인 Kubernetes 솔루션도 제공합니다(개발용 AWS Kubernetes 및 Kubernetes minikube의 Bahmni 문서 참고). Docker Swarm은 단순하고 Docker와 긴밀하게 통합되어 소·중규모 배포에 쉽고 직접적입니다. Kubernetes는 고급 기능의 폭이 넓어 크고 복잡한 배포에 더 적합합니다. 선택은 배포 환경의 요구와 자원에 따라 결정하십시오.관련 문서: AWS Kubernetes에 Bahmni 설치개발 환경에서 Kubernetes Minikube에 Bahmni 설치

전체 절차

Swarm 전체에 다중 컨테이너 애플리케이션을 배포하려면 먼저 Docker Swarm 클러스터를 설정합니다.

Untitled-2022-09-05-1530.png

Docker Swarm을 설정한 뒤 기존 Docker Compose 구성을 재사용해 Swarm 전체에서 Bahmni 컨테이너를 배포하고 관리할 수 있습니다.

Bahmni를 배포하려면 Swarm 관리자 노드에서 Docker Compose 파일 이름을 매개변수로 전달해 docker stack deploy 명령을 실행합니다. Docker Swarm은 필요한 컨테이너, 네트워크, 볼륨을 Swarm 전체에 생성합니다.

Bahmni의 Docker Compose 설정 방식 때문에 Swarm 클러스터 배포가 단순하지는 않습니다. 이 안내서는 단계별로 발생할 수 있는 문제와 해결 방법을 설명합니다.

Swarm 클러스터 설정

Docker Swarm에 Bahmni를 배포하는 첫 단계는 클러스터 설정입니다. 노드는 Swarm에 참여하는 Docker Engine 인스턴스입니다. 운영 환경의 Swarm 배포는 보통 여러 물리 및 클라우드 컴퓨터에 분산된 Docker 노드로 구성합니다.

Docker Swarm에는 관리자 노드와 작업자 노드가 있습니다. 관리자 노드는 Swarm과 작업자 노드를 관리하고, 작업을 조율하며, 상태·일정·구성을 유지합니다. 작업자 노드는 컨테이너 실행 등 관리자가 할당한 작업을 수행하고 상태를 보고합니다.

관리자 노드는 클러스터 전역 상태를 관리하기 위해 Raft 합의 알고리즘을 사용하여 모든 노드가 동일하고 일관된 상태를 저장하도록 합니다. Raft가 정상 동작하려면 (N/2)+1 구성원의 과반수 또는 정족수가 제안값에 동의해야 합니다. 관리자가 5개인 클러스터에서 3개가 중단되면 추가 작업 예약 요청을 처리할 수 없습니다. 기존 시스템은 계속 실행되지만 장애 대응을 위해 작업을 재분배할 수 없습니다.

관리자 노드는 고정 IP 주소를 사용하고 이를 Swarm의 다른 노드에 알려야 합니다. 새 IP를 받으면 기존 노드가 이전 IP로 관리자 노드에 연락할 수 없습니다.

작업자 노드는 관리자와 달리 동적 IP 주소를 사용할 수 있습니다. 중단된 작업자 노드는 참여 토큰이 포함된 join 명령을 다시 받아 Swarm에 재참여할 수 있습니다.

Swarm 만들기

사전 요구 사항: https://docs.docker.com/engine/swarm/swarm-tutorial/

  1. 관리자에서 Swarm을 초기화합니다. 호스트에 네트워크 인터페이스가 하나뿐이면 --advertise-addr 플래그는 선택 사항입니다. ]]>
    docker swarm init --advertise-addr=<IP-ADDRESS-OF-MANAGER>
  2. 출력된 텍스트에는 작업자 노드를 Swarm에 참여시킬 토큰이 있으므로 기록하고 암호 관리자에 보관하는 것이 좋습니다.
    docker swarm join --token <TOKEN> \
      --advertise-addr <IP-ADDRESS-OF-WORKER-1> \
      <IP-ADDRESS-OF-MANAGER>:2377
  3. 작업자 노드에서 Swarm에 참여합니다. 호스트에 네트워크 인터페이스가 하나뿐이면 --advertise-addr 플래그는 선택 사항입니다. \
  4. --advertise-addr \
  5. :2377]]>

관리자 노드에서 다음 명령을 실행하면 Swarm 클러스터에 연결된 모든 노드를 나열할 수 있습니다.

Docker Stack Deploy로 Bahmni 배포

Docker Engine을 Swarm 모드로 실행하면 docker stack deploy로 완전한 애플리케이션 스택을 Swarm에 배포할 수 있습니다. deploy 명령은 Compose 파일 형식의 스택 설명을 받으며 "3.0" 이상 버전의 Compose 파일을 지원합니다.

Bahmni Compose 파일은 docker stack deploy로 배포할 수 있지만 모든 환경 변수를 .env 파일에 저장합니다. .env 파일 읽기는 Docker Compose 기능이므로 docker stack deploy는 이 파일을 직접 받지 않습니다.

기존 .env 파일을 사용하려면 몇 가지 명령이 필요합니다. 다음은 bahmni-lite를 예로 든 Docker Stack Deploy 절차입니다.

  1. bahmni-docker 저장소를 복제합니다.
    git clone https://github.com/Bahmni/bahmni-docker.git
  2. bahmni-lite로 이동합니다.
    cd bahmni-docker/bahmni-lite
  3. .env 파일의 변수를 셸로 내보내는 명령을 실행합니다. docker stack deploy가 .env를 직접 받지 않으므로 이 명령은 주석 처리된 행과 값에 별표가 있는 행을 제거합니다.
    export $(sed '/^#/d; /\*.*\*/d' .env)

MART_CRON_TIME='*/15 * * * *'처럼 값에 별표가 있는 환경 변수는 별표가 와일드카드로 해석되어 export 명령에 문제를 일으키므로 이 명령으로 내보내지지 않습니다.

이 변수는 다음과 같이 수동으로 내보낼 수 있습니다.

Docker Compose로 스택 배포

Docker Compose와 Docker stack deploy를 사용하려면 Docker Compose 파일을 다음과 같이 변경합니다.

  1. "profiles" 속성 주석 처리: Docker stack deploy는 일부 Docker Compose 속성을 무시하며 profiles는 호환되지 않습니다. 이 속성이 있으면 "Additional property profiles is not allowed" 오류가 발생하므로 주석 처리합니다. 대안으로 여러 Compose 파일을 사용할 수 있습니다: https://docs.docker.com/compose/extends/#multiple-compose-files
  2. 서비스 네트워크 정의: docker compose는 docker-compose.yml의 모든 서비스에 기본 네트워크를 만들지만 docker stack deploy에서는 명시해야 합니다. 서비스 정의에 networks 속성과 만들 네트워크 이름을 추가합니다. 예를 들어 proxy 서비스에 bahmni 네트워크를 지정하고 Compose 파일에도 네트워크를 정의합니다. 그러면 Swarm의 모든 노드에 걸친 bahmni 오버레이 네트워크가 생성됩니다. 오버레이 드라이버는 자동 서비스 검색과 노드 간 부하 분산을 제공하며 서비스 간 통신에 사용됩니다: https://docs.docker.com/engine/swarm/networking/
    proxy:
      networks:
        - bahmni
    networks:
      bahmni:
        driver: overlay
  3. deploy 속성 정의: Docker Compose의 deploy 속성으로 복제본 수, 자원 제한, 배치 제약 등 Swarm 배포 방식을 정합니다. 예에서는 bahmni-web의 replicas를 3으로 설정하고 관리자 역할 노드에서만 실행되도록 배치 제약을 지정합니다.
    bahmni-web:
        image: bahmni/bahmni-web:${BAHMNI_WEB_IMAGE_TAG:?}
        networks:
          - bahmni
        deploy:
          placement:
            constraints: [node.role == manager]
          replicas: 3

위 변경을 적용한 docker-compose.yml의 예시는 다음과 같습니다.

필요에 맞게 변경하십시오.

마지막으로 다음 명령으로 스택을 배포합니다.

docker stack deploy --compose-file docker-compose.yml <STACK-NAME>

볼륨

Docker는 기본적으로 "local" 볼륨 드라이버를 사용해 특정 호스트에 작업을 예약할 때 볼륨을 자동 생성합니다. 서비스가 여러 노드에 예약되는 환경에는 적합하지 않을 수 있습니다. 각 노드에 새 빈 볼륨이 생겨 상태가 서로 달라질 수 있기 때문입니다.

이를 피하려면 EFS, EBS, GlusterFS, ISCSI, SSHFS 같은 외부 영속성 솔루션으로 클러스터의 모든 노드가 볼륨을 공유하도록 구성합니다. 그러면 서비스가 어느 노드에 예약되어도 같은 데이터에 접근하여 더 일관되고 안정적으로 동작합니다.

참고 자료:

https://docs.gluster.org/en/latest/Install-Guide/Setup-Bare-metal/#for-arch-linux https://docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html

원문 정보

Bahmni Wiki · CC BY-SA 4.0

원문 보기 ↗