Docker

[Docker] 스택(stack) 이용하기

nang. 2020. 4. 3. 00:48
반응형
SMALL

Swarm Stack

  • 스택
    • 서비스들의 묶음 단위가 스택
    • 서비스가 여러개 모이면 스택이라는 공간
    • 이 스택이라는 공간에 데이터베이스 컨테이너, 웹서버 컨테이너 등등을 구축하게되는 것
    • 서비스는 서비스 하나에 여러가지 이미지를 만들 수 없음
      • 스택은 여러 서비스 함께 다룰 수 있음

<순서대로 진행>

14.1 네트워크

  • 스택의 네트워크
    • 스택을 사용하여 배포된 서비스 그룹은 overlay 네트워크!
      • 여러 도커 호스트에 걸쳐 배포된 컨테이너 그룹을(서비스 복제하면 어떤 dind 에 배정될지 랜덤이므로 걸쳤다고 표현) 그 그룹끼리 같은 네트워크에 배치하기 위한 기술
      • overlay 네트워크여야 서로 다른 호스트(우리 공부에서는 dind를 말함)에 위치한 컨테이너 끼리 통신할 수 있음(echo 끼리..등등..)
  • 따라서 스택 이용하려면 제일 중요한 네트워크 먼저 구성!
    • ch03 이라는 이름의 네트워크 만들기
      • docker network create
매니저에서
$ docker network create --driver=overlay --attachable ch03
iy59gk71bobhnvchq54k6m1g3

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
iy59gk71bobh        ch03                overlay             swarm
## ch03 네트워크 생긴거 확인
  • --driver
    • 네트워크 방식 지정
      • overlay 로 지정
  • --attachable
    • 네트워크 이름(?)

14.2 스택 생성

14.2.1 my-webapi.yml 야물파일(컴포즈파일) 만들기

  • 스웜 폴더에서 my-webapi.yml
    • 스택을 생성하기 위한 컴포즈파일에는 스케일 인, 스케일 아웃, 제약 조건 부여 등이 가능
  • 스택에서는 서비스 아래 컨테이너라기보다 서비스 아래 서비스인 것
    • 근데 컨테이너 일 수 있음..
    • 그 서비스 안에서 또 컴포즈 파일 통해 컨테이너 생성 가능
version: "3"
services:
  api:
    image: registry:5000/example/echo:latest
    deploy:
      replicas: 3
      placement:
          constraints: [node.role != manager]
    networks:
        - ch03


  nignx:
    image: gihyodocker/nginx-proxy:latest
    deploy:
      replicas: 3
      placement:
          constraints: [node.role != manager]
    environment:
        BACKEND_HOST: echo_api:8080
    networks:
        - ch03
    depends_on:
        api


networks:
  ch03:
    external: true
  • deploy
    • replicas: 3
      • api 컨테이너 3개 만들어라
    • placement
      • contraints: [node.role != manager]
        • 컨테이너 배치 전략
        • node(컨테이너)의 role이 manager가 아닌 node(컨테이너)에 배포(설치해라)
  • environment
    • 환경변수 설정들
      • BACKEND_HOST:
        • 요청을 전송할 대상을 설정하는 것임
        • depends_on 에 의해 먼저 스택으로 배포된 api의 서비스명인 echo_api의 포트 8000을 설정
  • networks
    • ch03
      • 맨 처음 만들어준 네트워크 사용

14.2.2 스택 배포하기

  • 매니저에서
매니저
$ docker stack deploy -c "file path" <스택이름>
$ docker stack deploy -c /stack/my-webapi.yml echo
Creating service echo_api
Creating service echo_nignx
$
  • "file path"
    • .yml 파일의 경로
    • 지금 my-webapi.yml 파일을 윈도우에서 만들었다! 리눅스에 있어야 리눅스에서 배포를 하는데?
      • 우리 처음 dind 컨테이너 만들 때 docker-compose.yml에서 볼륨마운트 해줬잖아
      • ./stack:/stack
        • 이게 지금 공유 폴더라는 이야기이므로
        • my-webapi.yml 을 호스트(윈도우)의 stack 폴더에 넣어주면 리눅스의 stack 폴더에도 생겨있음
  • <스택이름>
    • 스택 이름은 임의로 써주기

14.2.3 스택 확인하기

매니저
$ docker stack ls
NAME                SERVICES            ORCHESTRATOR
echo                2                   Swarm
  • echo 스택안에 서비스 2개

14.2.4 서비스 확인하기

  • 모든 스택의 서비스 리스트
매니저
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                               PORTS
tftbv99l6xzw        echo_api            replicated          3/3                 registry:5000/example/echo:latest
ozomobuvyf4t        echo_nignx          replicated          3/3                 gihyodocker/nginx-proxy:latest   

14.2.5 특정 스택이 가지고 있는 서비스 리스트 확인하기

스택이 여러 개 일 때

매니저
$ docker stack services <스택명>
$ docker stack services echo
ID                  NAME                MODE                REPLICAS            IMAGE                               PORTS
tftbv99l6xzw        echo_api            replicated          3/3                 registry:5000/example/echo:latest
ozomobuvyf4t        echo_nignx          replicated          3/3                 gihyodocker/nginx-proxy:latest   
  • echo_api
    • echo 스택의 api 서비스

14.2.6 특정 스택이 가지고 있는 특정 서비스에 대한 정보 확인하기

  • 복제된 서비스 리스트까지 다 보여줌
  • 어디에 복제됐는지 dind 컨테이너 ID 확인 가능
매니저
$ docker service ps <스택의특정서비스명>

** 스택의 서비스 명

(1) 스택 deploy 시 지은 스택 이름

(2) 스택 컴포즈 파일(.yml)에서 서비스 만들 때 지은 서비스 이름

(1)_(2)

  • echo_api

$ docker service ps echo_api
ID                  NAME                IMAGE                               NODE                DESIRED STATE       CURRENT STATE                ERROR                              PORTS
x6feo6en22wx        echo_api.1          registry:5000/example/echo:latest     aed40f88b205                   Running             Running About a minutes ago 
ovsmb8uukugc        echo_api.2          registry:5000/example/echo:latest        aed40f88b205                Running             Running About a minutes ago  
uc4hy087crnm        echo_api.3          registry:5000/example/echo:latest        aed40f88b205                Running             Running About a minutes ago  
  • echo_api.1
    • echo 스택의 api 서비스 중 1번 (복제했기 때문)
  • NODE
    • 복제된게 설치된 dind 컨테이너의 ID

14.2.7 복제된 서비스는 어디에?

$ docker service ps <스택의특정서비스명>
  • 하면 NODE에 어디로 복제됐는지 나옴

14.2.8 설치된 dind 컨테이너로 이동

매니저
$ exit
worker01
$ docker ps
## worker01에 설치(배포)된 서비스(컨테이너) 프로세스 목록이 나옴
반응형
LIST