이전강의에서는 만든 앱을 가져와서 어떻게 컴포즈로 정의해야 하는지 docker-compose.yml파일로 정의했었다.
이번에는 애플리케이션을 클러스터에 배포한다. 멀티 컨테이너, 멀티 머신, 멀티 어플리케이션을 스웜이라 불리는 도커나이저 클러스터인 스웜에 배포할것이다.
스웜?
스웜은 도커로 실행하는 머신들의 그룹이고 클러스터로 조인되어있다. 도커 커맨드를 그대로 사용할 수 있고 클러스터에 있는 스웜매니저에 도커 커맨드를 쓰는것이다. 스웜에 있는 머신들을 물리적, 가상적이어도 되고 스웜에 들어가있는 머신들을 노드라고 한다.
스웜매니저
: 여러개의 컨테이너를 어떻게 실행할지에 대한 전략이 있다. empiiest node 전략을 사용하면 컨테이너를 띄우가 위해 최소한의 머신을 쓴다.golbal전략은 컨테이너가 하나의 인스턴스를 갖도록 해준다. 즉 모든서버가 컨테이너 하나는 갖도록 해준다. 이는 컴포즈 파일을 통해 스웜매니저에게 알려줘야 한다.
스웜에 들어간것은 노드라 하는데 이들에게 명령을 내릴수 있는건 스웜매니저라 하고 이러한 매니저들은 다른 스웜에 워커로 조인할 수 있도록 해준다. 워커는 컨테이너를 돌릴 수 있는 리소스를 제공해주고 다른머신에 작업을 명령할 권한은 없다.
도커는 스웜모드로 변경될 수 있다. 스웜모드로 바꾸면 현재의 머신이 스웜매니저가 되고 명령어는 현재머신에 시키는것이 아니라 스웜매니저에 시킨다.
스웜은 여러개의 물리 혹은 가상의 머신으로 이뤄진다.
docker swarm init으로 스웜모드를 실행시키면 현재 머신이 스웜 매니저가 된다.
docker swarm join을 다른 머신에서 사용하면 다른 머신에서 내가 만든 스웜매니저에 조인하게 된다.
docker-machine create –driver virtualbox myvm1
docker-machine create –driver virtualbox myvm2
을 입력해 도커 머신을 생성하자.
docker-machin ls 를 입력하면 생성된 머신을 확인할 수 있다.
이후
docker-machine start myvm1 을 입력하여 머신을 띄우자.
이제 myvm1을 스웜매니저로 만들고 myvm2을 워커로 만들것이다.
첫번째 머신을 매니저로 먼들기위해 도커에 명령을 보내야한다.
docker-machine ssh myvm1 “docker swarm init –advertise-addr <myvm1의 ip>”
을 입력하면 docker swarm join –token …..이라고 출력되는데 이는 스웜에 워커를 추가하고 싶으면 이렇게 입력하라는 것이다,
두번째 머신에 아래와 같이 입력하여 워커를 추가하자
docker-machine ssh myvm2 “위에서 출력된값 복붙”
docker-machine ssh myvm1 “docker”
앱을 스웜클러스터에 배포
스웜매니저(myvm1)만 도커 커맨드를 실행할 수 있다는점을 잊지말자
지금까지는 ssh를 활용하여 가상머신에다 가상명령어를 실행했는데 다른방법으로는 docker-machine env
이는 로컬에 있는 docker-compose.yml을 쓸 수 있으므로 유용하게 쓸 수 있다.
다시설명하자면 이전에는 docker-compose.yml파일을 주고 디플로이를 해야했다. vm에는 해당 파일이 없으므로 vm에 떠있는 스웜매니저와 쉘을 연결하여 쉽게 사용할 수 있다.
docker-machine env myvm1
을 입력하여 쉘이랑 머신을 붙이고 맨아래 나오는 커맨드를 입력하자.
그럼 myvm1에 들어온것과 같다.
docker node ls
를 입력하여 사용할 수 있는데 마치 myvm1이라는 스웜매니저에 들어온것같이 도커 커맨드를 사용할 수 있다.
즉 도커 디플로이를 하면서도 로컬에 있는 파일을 사용할 수 있게되었다! vm으로 파일을 옮기거나 하는 작업들이 필요없어졌다.
docker stack deploy -c docker-compose.yml getstartedlab
을 입력하여 배포 가능하다.
그러면 vm들에 컨테이너가 들어가게 된다.
docker stack ps getstartedlab을 입력하여 여러 노드에 깔린것을 확인할 수 있다.
쉘이 다른 머신에 붙도록 하고싶으면 docker-machine env 명령을 활용하면 된다. 하지만 myvm2는 도커 매니저가 아니라 워커이기 때문에 도커 명령어를 실행할 수 없다.
접속해보자. docker-machine ls를 입력하여 ip를 확인하고 들어가보자.
네트웍은 두 노드끼리 공유되고 로드밸런싱된다.
yml 파일의 replicas를 4로 바꾸고
docker stack deploy -c docker-compose.yml getstartedlab
을 입력하여 업데이트 하고
docker stack ps getstartedlab
을 입력하여 확인해보자
2개,2개씩 골고루 배치된것을 확인할 수 있다.
cleanup and reboot
docker stack rm getstartedlab
을 입력하여 도커를 내려보자,
docker-machine ssh myvm2 “docker swarm leave”
를 통해 도커 스웜에서 제거하자(워커는 이렇게 제거하면 된다.)
docker-machine ssh myvm1 “docker swarm leave –force”
를 통해 도커 스웜에서 제거하자(매니저는 이렇게 force를 넣어 제거하면 된다.)
eval $(docker-machine env -u)
env에 붙은 도커 머신 떼어내자.
쉘이 도커 머신에서 떨어져 나간다.
이제 로컬에 있는 도커 커맨드가 실행된다..
docker-machine stop
를 입력하여 도커 머신을 멈추자.
https://www.youtube.com/watch?v=p58k2_HMWRM&list=PLfI752FpVCS84hxOeCyI4SBPUwt4Itd0T&index=2
의 53분부터 보면 요약 잘해주신다.