2022이전/Docker&Kubernetes

[실습+명령어] Docker Swarm

바로퇴장 2020. 6. 15. 17:37

실제 서버를 운용하는 데 있어서 많은 컨테이너를 관리를 해야한다. 특히, 트래픽 처리할 수 있는 실용적인 시스템을 구축하려면 보다 많은 컨테이너가 각기 다른 호스트에 배치되어 이를 처리 하도록 해야 할 것이다. 이를 위한 첫 번째 대안으로 바로 도커 수웜(Docker Swarm)이다.

도커스웜은 여러 도커 호스트를 클러스터로 묶어주는 컨테이너 오케스트레이션 도구의 한 종류이다.

### 실습 준비하기
  • 1대의 manager 노드
  • 3대의 worker 노드(worker01~03)
  •  
manager : 211.183.3.100
woker1 : 211.183.3.101
woker2 : 211.183.3.102
woker3 : 211.183.3.103
  1. manager 노드에서 토큰 발행

    docker swarm init --advertise-addr 211.183.3.100

  1. manager에서 노드에 참여한 호스트들의 상태를 점검한다.

    docker node ls
    • docker swarm leave : worker가 빠져나올 수 있다.
    • docker node inspect [ID or HOSTNAME] 각 노드의 상세 정보를 출력시킨다.
    • docker node rm [ID or HOSTNAME] : 지정된 노드를 스웜에서 제외시킨다
    • docker node demote/promote [ID or HOSTNAME] : 특정 노드를 manger => worker or worker => manager 변경
  2. manager 에서 서비스 동작시키기

    docker service create --replicas 2 -p 8080:80 --name web nginx
    docker service ls
    docker service ps web

    211.183.3.100~103:8080 포트를 확인해 보면 nginx가 돌아가는 것을 확인 할 수 있다.

  1. 도커로 scale out 및 컨트롤 하기

    docker service scale web=4                ## 4개의 컨테이너를 활성화하여 scale out을 한다.
    docker service scale web=1                ## 1개의 컨테이너만 활성화하여 scale in을 한다.
    docker service rm web                    ## web 활성화를 다운시킨다.

도커 스웜을 통한 웹서비스 환경 구축

*스택은 하나 이상의 서비스를 그룹으로 묶은 단위로, 애플리케이션 전체 구성을 정의한다.*

service는 애플리케이션 이미지를 하나밖에 다루지 못하지만, 여러 서비스가 협조해 동작하는 형태로는 다양한 애플리케이션을 구성할 수 있는데 이를 스택이라고 한다.

stack 기능을 사용하기 위해서는 overlay 네트워크 환경을 구축을 해야한다.

  1. haproxy 와 컨테이너를 연결하기 위한 overlay 네트워크 생성

    docker network create --driver=overlay --attachable web
    docker network ls

  1. manager 노드에서 다음과 같은 web.yml 파일을 작성

    version: '3'
    
    services:
        nginx:
            image: nginx
            deploy:                    ##배포 환경 설정
                replicase: 3        ##3개를 swarm
                placement:
                    constarints: [node.role != manager]     ## 노드역할이 manager가 아닌 node만 연결
                    restart_policy:
                        condition: on-failure        
                        max_attempts: 3                ##실패시 리스타트 최대 3번 시도
                    environment;
                        SERVICE_PORT: 80            ##서비스 포트는 80
                    networks:
                        - web            ##네트워크 환경은 web(overlay 설정해둠)
        proxy:
            image: dockercloud/haproxy
            depends_on:
                - nginx
            volumes:
                - /var/run/docker.sock:/var/run/docker.sock ##기본값으로 반드시 설정해줘야 한다.
            ports:
                - 8001:80
            network:
                - web
            deploy:
                mode: gloabl        ##각 노드에 1개씩 배포
                placement:            ##제한조건
                    constraints: [node.role == manager]
    
    networks:                        ##네트워크 설정
        web:
            external: true            ##외부와의 노출을 허용할 것인가?(default:true)
  1. 작성된 파일을 이용하여 스택 배포하기

    docker stack deploy --compose-file=web.yml web
  1. stack 작동확인하기

    docker stack ps web