# 도커 스택
## 목차
1. 도커 스택이란?
2. Visualizer 추가
3. Redis 추가
## 도커 스택이란?
도커 스택이란, 분산 어플리케이션의 최상위 계층이다.
한 도커 스택으로 어플리케이션을 구성할 수 있다. 뿐만 아니라, 다수의 스택을 통해 고도의 어플리케이션 구성도 가능하다.
앞서, 단일 스택으로 서비스를 운영하는 연습을 했다. 사실 이러한 구성은 프로덕션에 어울리지 않는다. 이에 어울리는 스택 구성을 연습해보자.
## Visualizer 추가
### docker-compose.yml 재설정
docker-compose.yml에 visualizer를 추가하자.
```
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
```
위 설정의 `volumes`은 도커 머신이 호스트의 파일(or 공유 폴더)에 접근할 수 있게 한다. `placement`는 비쥬얼라이저가 스웜 매니저 위에서만(never worker) 동작하는데 사용됐다.
### 도커 머신 준비
`docker-machine ls` 명령으로 머신 상태 확인.
호스트에서 스웜 매니로 연결
```
eval $(docker-machine env myvm1)
```
### 재배포
```
docker stack deploy -c docker-compose.yml getstartedlab
```
### 동작 확인
프로세스 확인
```
docker stack ps getstartedlab
Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
```
비쥬얼라이저 접속

## Redis 추가
Visualizer를 추가했던 것처럼, Redis를 추가하며 다시한번 이를 연습해보자.
### docker-compose.yml 작성
`docker-compose.yml`에 redis를 추가한다.
```
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
redis:
image: redis
ports:
- "6379:6379"
volumes:
- "/home/docker/data:/data"
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
```
### 볼륨 설정
매니저 노드에 `/data` 디렉토리를 만든다.
```
docker-machine ssh myvm1 "mkdir ./data"
```
### 매니저 노드 접속
```
docker-machine ls
docker-machine env myvm1
eval $(docker-machine env myvm1)
```
### 스택 배포
접속한 매니저 노드상에서 스택을 배포한다.
```
docker stack deploy -c docker-compose.yml getstartedlab
```
### 정상 작동 확인
서비스가 잘 동작하는지 확인한다.
```
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
x7uij6xb4foj getstartedlab_redis replicated 1/1 redis:latest *:6379->6379/tcp
n5rvhm52ykq7 getstartedlab_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
mifd433bti1d getstartedlab_web replicated 5/5 gordon/getstarted:latest *:80->80/tcp
```
### 웹 브라우저를 통한 확인
웹 서비스 접속

비쥬얼라이저 접속

## 레퍼런스
+ Get Started, Part 5: Stacks (https://docs.docker.com/get-started/part5/)