0부터 시작하는 Docker Swarm 공부 - Docker Stack

Jaehong Lee·2022년 8월 25일
0
post-thumbnail

1. Docker Stack 이란

  • Swarm Mode 를 사용하면, 명령어를 사용하여 클러스터 환경에 컨테이너, 볼륨, 네트워크를 배포할 수 있다. 단, 위의 방법을 사용할 경우, 서비스 환경을 조정해야 하는 경우에는 명령을 다시 처음부터 작성해야 하는 등의 불편함이 있다

  • docker-compose 는 명령어 사용의 불편함을 해결하기 위하여 yml 형태로 환경을 구성하고, 이를 Docker 가 명령으로 변환하여 서비스를 제공해준다

Swarm mode + Docker-compose = Docker Stack

2. Docker Stack 작성하기

p. 361

manager Node 에 HAproxy 를 배치하고, worker Node 들에 nginx 를 배치하여, manager Node 로 접근하면 worker Node 들의 nginx 에 접근할 수 있게 하자

yml 파일 생성 및 Network 생성

  • Docker Stack 을 작성할 yml 파일과 overlay Network 인 web Network 를 생성해주자

Docker Stack 작성하기

version: '3.7'

services:
  nginx:
    image: nginx
    deploy:  
      replicas: 3
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
        max_attempts: 2
    environment:
      SERVICE_PORTS: 80
    networks:
      - web

  proxy:
    image: dockercloud/haproxy
    depends_on:
      - nginx
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports: # attach on ingress network 1
      - "80:80"
    networks: # attach on web network 2 - nginx connect
      - web
    deploy:
      mode: global
      placement:
        constraints: [node.role == manager]

networks: 
  web: 
    external: true
  • deploy 는 Node 에 대한 설정이다

    • placements 는 컨테이너 배치할 Node 들을 지정한다
  • restart-policy 를 on-failure 로 설정하여, 실패시 재시작하게 정책을 설정한다. max_attempts 를 2 로 설정했기에 restart 는 최대 2 번 시도한다

  • proxy 는 nginx 의 정보를 확인해야 한다. 이를 위해 manager Node 의 docker.sock 를 mount 해서 proxy 에서 nginx 컨테이너의 정보를 확인할 수 있게 하자

Stack 에서 여러 Service 를 배포할 때, 클러스터는 하나의 네트워크 이므로, 서로 다른 Service 는 같은 Port 를 사용할 수 없다

3. Docker Stack 배포

docker stack deploy -c web.yml web

  • Docker Stack 을 배포해보자. -c 는 compose 파일 지정 옵션으로 web.yml 을 사용하게 했다. 뒤에 web 은 Service 이름이다

4. Docker Stack Service 삭제

docker stack rm web

  • Docker Stack 으로 배포한 Service 는 docker stack rm 으로 삭제한다

5. 확인하기

  • haproxy 이미지를 직접 pull 하고, Service 를 배포하자
docker stack ps web
  • Docker stack 으로 배포한 Service Container 를 확인하려면, 위와 같이 작성해야 한다
  • Container 를 확인하면 잘 배포되었다
  • manager Node 에 접속하면, nginx 에 잘 접속된다
  • Node 들은 전부 Ingress Network 에 연결되어 있다. 외부 사용자가 접속하면, manager 의 etcd 에서 어디로 트래픽을 넘길지 판단하고, vip 를 통해 컨테이너로 접근하는데, 이때 80 번 Port 로 접근하므로 HAproxy 에 접근한다. HAproxy 에서는 해당 트래픽을 overlay Network 를 통해 nginx 컨테이너들에게 보낸다
    • 따라서, 100 ~ 103 모두 nginx 페이지에 접속할 수 있다

Docker stack 명령어는 앞에 docker stack 을 써줘야 한다

6. Portainer 로 모니터링 & 관리하기

docker container run -d --restart always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer
  • portainer 컨테이너를 배포하자
  • 배포 후 9000 번 Port 를 통해 portainer 에 접속하여 해당 Stack 페이지에 들어가자
  • Stack 페이지에 들어가면, 우리가 Stack 을 통해 배포한 Service 가 보인다
  • Service 의 컨테이너들을 확인하자
  • Container Status 도 확인 가능하다

cluster visualizer

  • 위의 버튼을 클릭하자
  • 현재 Cluster 상태를 확인할 수 있다
profile
멋진 엔지니어가 될 때까지

0개의 댓글