2021.02.05 - [프로그래밍 노트/도커] - 스웜(swarm)을 이용한 도커 컨테이너 배포_1
2021.03.29 - [프로그래밍 노트/도커] - 스웜(swarm)을 이용한 도커 컨테이너 배포_3 (스웜 클러스터 외부에서 서비스 사용하기)
스택
스택은 하나 이상의 서비스를 그룹으로 묶은 단위로, 애플리케이션 저체 구성을 정의한다.
서비스는 애플리케이션 이미지를 하나밖에 다루지 못하지만, 여러 서비스가 협조해 동작하는 형태로 다양한 애플리케이션을 구성할 수 있다.
이를 구현하기 위한 상위 개념이 바로 스택이다. (여러 서비스를 함께 다를 수 있음)
스택은 말하자면 스웜에서 동작하는 스케일 인, 스케일 아웃, 제약 조건 부여가 가능한 컴포즈
다. 스택은 docker stack 하위 명령으로 조작한다.
스택을 사용해 배포된 서비스 그룹은 overlay 네트워크에 속한다.
- overlay 네트워크 : 여러 도커 호스트에 걸쳐 배포된 컨테이너 그룹을 같은 네트워크에 배치하기 위하 기술. overlay네트워크를 사용해야 서로 다른 호스트에 위치한 컨테이너끼리 통신할 수 있다.
스택에서 overlay 네트워크를 설정하지 않으며 스택마다 다른 overlay 네트워크를 생성하고 그 안에 서비스 그룹이 속하게 된다. 다른 네트워크에 속하게되며 서비스들으 서로 통신이 불가능하다.
위의 사진처럼, stack A network 에 존재하는 service-a1 과 service-a2는 서로 통신이 가능하지만
service-a1, servicea-2는 stack B network 에 존재하는 service-b1, service-b2과는 통신이 불가능하다.
클라이언트와 대상 서비스가 같은 overlay 네트워크에 있어야 통신이 가능하다.
도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문 에서 제공하는 이미지를 활용해서 스웜 스택을 구현해 볼텐데 프론트엔드(nginx)/백엔드 API(go, 전에 활용한 echo 컨테이너) 서버를 설정하는 예제이다.
즉 간단한 리버스 프록시 설정을 하는 구조 라고 보면된다.
같은 네트워크의 통신을 위하여 corn 네트워크를 구성한다.
$ docker container exec -it manager docker network create --driver=overlay --attachable corn wwwqq46lzgz2ab1artycxhchx
stack 디렉토리를 생성하여 스택을 생성한다.
corn-webapi.ymlversion: "3" services: nginx: image: gihyodocker/nginx-proxy:latest deploy: replicas: 3 placement: constraints: [node.role != manager] environment: SERVICE_PORTS: 80 BACKEND_HOST: echo_api:8080 depends_on: - api networks: - corn api: image: registry:5000/example/echo:latest deploy: replicas: 3 placement: constraints: [node.role != manager] networks: - corn networks: corn: external: true
- gihyodocker/nginx-proxy 이미지는 서적에서 제공하는 샘플 이미지
- 1번에서 생성한 corn 네트워크에 포함된 설정을 한 것을 볼 수 있다.
- replicas : 레플리카 수를 조정할 수 있음
- placement : 컨테이너의 배치 전략을 설정할 수 있음(manager 이외의 노드에 컨테이너를 배치하도록 제약을 부여함)
- 스택 배포하기
스웜 클러스터에 스택을 배포하려면 docker stack deploy 명령을 사용한다. 이 때 옵션 -c 값으로 스택 정의 파일 경로를 지정해야 한다. (-c: 스택_정의파일_경로)stack 디렉토리는 manager 컨테이너의 /stack 디렉토리에 마운트되므로 이 파일의 경로는 /stack/corn-webapi.yml이 된다.$ docker container exec -it manager docker stack deploy -c /stack/corn-webapi.yml echo Creating service echo_nginx Creating service echo_api
docker stack deploy [options] 스택명
- 배포된 스택 확인하기
$ docker container exec -it manager docker stack services echo ID NAME MODE REPLICAS IMAGE PORTS ctmd3cnz5oxd echo_api replicated 3/3 registry:5000/example/echo:latest qbwv54oqst5x echo_nginx replicated 2/3 gihyodocker/nginx-proxy:latest
- 스택에 배포된 컨테이너 확인하기
스택이 컨테이너 그룹을 어떻게 배포했는지 확인하려면 docker stack ps 명령을 사용한다.docker container exec -it manager docker stack ps echo ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 6r15qr1v5o0h echo_api.1 registry:5000/example/echo:latest ae98e56d70aa Running Running 2 minutes ago qwvprmyezvwf echo_nginx.1 gihyodocker/nginx-proxy:latest ae98e56d70aa Running Running about a minute ago yy97ish65l7y echo_api.2 registry:5000/example/echo:latest 68bcb8fe3ac7 Running Running 2 minutes ago kpzr7n0xfg0u echo_nginx.2 gihyodocker/nginx-proxy:latest 68bcb8fe3ac7 Running Running about a minute ago 0wg3matqliwk echo_api.3 registry:5000/example/echo:latest 29ef9ceb89f8 Running Running 2 minutes ago vm07j46gkt7l echo_nginx.3 gihyodocker/nginx-proxy:latest 29ef9ceb89f8 Running Running about a minute ago
- visualizer를 사용해 컨테이너 배치 시각화하기
스웜 클러스터에 컨테이너 그룹이 어떤 노드에 어떻게 배치됐는지 시각화해주는 visualizer라는 애플리케이션이 있다. 도커 허브에서 dockersamples/visualizer라는 이미지로 배포한다. (/stack/visualizer.yml)version: "3" services: app: image: dockersamples/visualizer ports: - "9000:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock deploy: mode: global placement: constraints: [node.role == manager]
$ docker container exec -it manager docker stack deploy -c /stack/visualizer.yml visualizer Creating network visualizer_default Creating service visualizer_app
docker stack 하위
스택 하위 명령 | 내용 |
deploy | 스택을 새로 배포 혹은 업데이트 함 |
ls | 배포된 스택의 목록을 출력 |
ps | 스택에 의해 배포된 컨테이너의 목록을 출력 |
rm | 배포된 스택을 삭제 |
services | 스택에 포함된 서비스 목록을 출력 |
'프로그래밍 노트 > 도커' 카테고리의 다른 글
[docker] docker-compose 특정 컨테이너만 실행 (0) | 2021.07.12 |
---|---|
스웜(swarm)을 이용한 도커 컨테이너 배포_3 (스웜 클러스터 외부에서 서비스 사용하기) (0) | 2021.03.29 |
스웜(swarm)을 이용한 도커 컨테이너 배포_1 (0) | 2021.02.05 |
실용적인 (도커)컨테이너 구축 및 배포를 위한 지식_1 (0) | 2021.01.30 |
도커 컴포즈(docker-compose) 네트워크 (0) | 2021.01.17 |