Programming/Server

[Docker] docker-compose docker stack 차이

bisi 2020. 4. 27. 11:13

Docker를 셋팅하다보면 Docker와 Docker Compose를 고민하게되고, 

docker-compose를 파다보면, docker-compose와 동일한 파일을 사용하는 것 같은 docker stack을 발견하게 된다. 

그래서 오늘은 docker-compose와 docker stack에 관련되어서 알아보려고 한다. 

 

1. docker-compose , docker stack 같은 것인가?

결론은 두가지는 다르다는 것이다. 

docker-compose는 container를 정의하는 것이고, docker stack는 service를 정의하는 것이다. 

service라는 개념은 docker version 1.12 이후 도입된 개념이다. 

docker-compose는 컨테이너(container)를 정의하는 것이기 때문에, docker-compose 명령이 실행되는 순간에만 컨테이너의 상태가 올바른지 확인 후, 컨테이너가 켜져 있지 않으면 컨테이너를 실행시키고 docker-compose의 몫은 끝난다. docker-compose는 상태를 지속적으로 모니터링 하지 않기 때문에 만약 컨테이너가 5분안에 예기치 않게 종료 되면, composer는 컨테이너를 다시 시작하지 못한다.

하지만 docker stack은 docker 엔진의 원하는 서비스 상태를 항상 알수 있으며, 그렇기 때문에 엔진이 원하는 서비스 상태와 지금 서비스 상태가 다르다면 조치도 가능하다

예를 들어 컨테이너가 죽으면 다른 컨테이너를 호출 하거나, 전체노드에서 컨테이너를 몇개 가져가면 엔진을 감지하여 컨테이너를 정상적인 노드로 다시 가져올 수 있다. 즉, docker stack은 docker-compose에서 지원하지 않는 모니터링과 그에 따른 조치 기능을 제공하는 것이 큰 차이점이다. 

 

2. 작동 방식

멀티 컨테이너 도커 어플리케이션을 정의하고 실행하기 위해 만들어진 docker-compose는 단일 도커 엔진에서 실행되고, 옵션값들로 컨테이너, 볼륨, 네크워크등을 만들고 업데이트 가능하다. docker-composer는 tool 자체 이므로 docker에 통합되어 있지 않다. linux는 따로 설치해야하며, 윈도우는 도커와 함께 있다. (이부분은 아마 나중에는 docker와 docker-compose가 합쳐지지 않을까 ...)

반면 docker stack은 오직 swarm에서만 사용 가능하다. swarm에서 사용되는 docker stack은 싱글 도커 엔진에 필요 없는 환경설정 변수(replicas, deploy, roles)가 더해진다. swaarm에서 사용되는 파일형식은 composefile version3 이후부터가능하다. 이전버전은 지원하지 않는다. 

 

3. 실행 명령어 

docker-compose 실행 명령어 (docker-compose.yml 기본 파일 실행 시)

docker-compose up -d

 

docker stack 실행 명령어

docker swarm init;
docker stack deploy --compose-file docker-stack.yml mystack

 

4. 서로 무시하는(?) 옵션

docker-compose와 docker stack 모두 Compose의 yaml 파일 형식을 사용하지만, 명령어 실행시 각자의 명령어에서는 무시되는 옵션들이 있다. 

docker-compose 실행시 무시되는 옵션

deploy, restart-policy

 

docker stack 실행시 무시되는 옵션

build, cap_add, cap_drop, cgroup_parent, container_name, depends_on, devices, external_links, links, network_mode, restart, security_opt, stop_signal, sysctls, tmpfs(version3-3.5), userns_mode

 

5. Compose file 형식

Compose file 형식은 도커 엔진에 대한 환경 설정이나 배포하는 목적으로 제공된다.

version1,2,3까지 나와 있으며, 각 version 별로 차이가 있다. (참고 : 2부터 link 개념이 생겼다, 3부터 swarm 적용 가능하다 등등..) swarm을 사용하기 위해서는 verison3의 형식을 사용해야하며, stack, cloud, compose 에 맞게 이름을 구분하여 사용하는 것을 권장한다. 

예시 
docker-stack.yml : 공식적으로 version 3부터 사용
docker-cloud.yml : docker cloud 서비스도 이용 가능.
docker-compose.yml : 기본 Compose 파일 포맷.

 

 

참고 사이트 

https://blog.nimbleci.com/2016/09/14/docker-stacks-and-why-we-need-them/#what-about-docker-compose

https://stackoverflow.com/questions/43099408/whats-the-difference-between-a-stack-file-and-a-compose-file