도커 컴포즈를 이용한 서비스하기 : Link

Docker Swarm에 App배포하기

들어가기 전

내가 이해하기 위해 작성했지만 스웜에 대해서 전혀 감이 안잡힌다. 밑에 있는 세팅이나 클러스터에 배포하는 부분까지는 그러려니 하더라도 좀 더 swarm에 대해 자세하게 알아본 후 나의 글은 재미삼아 읽으면 좋을 것 같다.

Swarm clusters 이해하기

`swarm`은 도커를 실행하고 클러스터에 조인되어 있는 컴퓨터 그룹입니다. 이전에 각 컨테이너에서 Docker 명령어를 각각 실행했다면 이제는 swarm manager에 의해 실행될 수 있습니다 . swarm안에 있는 머신들은 물리적 또는 가상일 수 있습니다. swarm에 조인되는 순간 그들은 노드(=Worker or Manager)로서 취급됩니다.

swarm managers는 “emptiest”,”global” 과같은 몇가지 전략을 사용하여 컨테이너를 실행시킬 수 있습니다. Compose파일에 전략을 명시하면 swarm manager는 이것을 사용하게 됩니다.

swarm manager는 swarm안에 있는 유일한 머신이며 우리가 주는 명령어를 실행시키거나 다른 머신들이 worker로서 swarm안에 조인될 수 있게 권한을 주는 역할을 합니다. Worker는 매니저노드가 시키는데로 컨테이너를 생성하고 관리하는 노드입니다.

가장 처음 도커를 배울 때 우리는 로컬에서 single-host 모드로 도커를 사용했었습니다. 하지만 도커는 swarm 모드(swarm을 사용할 수 있게 하는 모드)가 있으며 이러한 모드로 변경할 수 있습니다.(지난 포스트에서는 swarm 사용했었습니다.) 모드를 활성화하게 되면 현재 시스템이 swarm manager가 되며 이후부터 도커는 우리가 관리할 swarm에 실행시킬 명령어들을 대신 실행합니다.

Swarm 세팅하기

스웜은 다수개의 노드로 이루어져 있으며, 이는 물리적 또는 가상 머신이 될수 있습니다. ` docker swarm init명령어로 스웜 모드가 가능해지고 실행시킨 머신이 스웜 매니저가 될 것입니다. 이후에 다른 머신에서docker swarm join`을 실행하면 worker로서 스웜에 조인되게 됩니다. 지금부터는 VM을 이용하여 두 개의 머신을 생성하겠습니다.

차례대로 일단 docker machine을 설치해보도록 하겠습니다. docker machine은 가상 호스트에 docker engine을 설치하고 docker-machine 명령을 사용하여 호스트를 관리할 수 있게 해주는 도구입니다.

도커 머신

docker machine 다운로드추출

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo install /tmp/docker-machine /usr/local/bin/docker-machine

설치 확인

docker-machine version

docker-machine으로 가상 호스트를 만들기 위해서는 `VM`이 필요합니다. VM을 설치합니다.

sudo apt-get virtual-box

이제 docker-machine을 이용하여 VM 두쌍을 생성하겠습니다.

docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
docker-machine ls

docker-machine ls를 통해 나온 IP주소 를 뒤에나오는 명령어에 잘 삽입해주세요.

스웜 초기화하기 그리고 노드 추가하기

우리는 각각 VM에 docker-machine ssh를 이용하여 명령어를 보낼 수 있습니다. 다음의 명령어를 통해 `myvm1`이 스웜 매니저가 될 수 있도록 합니다.

docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"

기본적으로 스웜을 시작하게 되면 2377 포트를 가지게 됩니다.

이번에는 `myvm2`를 스웜에 포함시켜 보도록 하겠습니다.

docker-machine ssh myvm2 "docker swarm join --token <token> <ip>:2377"

성공적으로 조인이 되었다면 myvm1에서 노드 리스트를 출력했을 때 잘 나와야합니다.

docker-machine ssh myvm1 "docker node ls"

App을 Swarm cluster에 배포하기

지금부터는 지난 포스팅때와 같이 swarm에 배포하기만 하면 됩니다. 단 스웜매니저는 도커 명령어를 실행하는 것과 worker는 단지 capacity를 위한 것이라는 것만 기억하고 있어야합니다.

여기서 잠깐, 우리는 이전에 vm에게 명령어를 전달하기 위해 docker-machine ssh를 이용하였습니다. 하지만 이외에도 다른 옵션이 있습니다. docker-machine env <machine> 인데 이는 현재 쉘에서 VM의 쉘과 통신하도록하는 명령어입니다.

myvm1 쉘과 통신하도록 구성시키기

docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)

현재 쉘에 myvm1과 통신하도록 지정

eval $(docker-machine env myvm1)

이제 아래 명령어를 실행시키면 myvm1머신에 ACTIVE상태에 *표시가 되어있음이 보인다.

docker-machine ls

이제 Swarm manager를 이용하여 이전 포스팅에서 사용했었던 docker stack deploy와 같은 명령어를 이용해서 배포할 수 있게 되었습니다.

도커 머신 쉘 구성을 통해 myvm1에 연결되었으며, 여전히 로컬의 파일에 접근할 수 있습니다. 전의 포스팅에서 만들었던 docker-compose.yml있는지 확인합니다. 다음 명령어를 통해서 myvm1에 app을 배포시켜봅시다.

docker stack deploy -c docker-compose.yml getstartedlab

이제 app은 스웜 클러스터에 배포되었습니다!

라고 끝내고 싶지만 사실 하드웨어에 가상화 기능이 없어서 저는 위의 부분들을 실행시켜보지 못했습니다.

분명히 놓치거나 다른 부분이 있을텐데 여기서 그 부분들을 다시 채우시길…

마치며

  • 이전 포스트에서 실행했었던 Swarm에 대해서 알아보았다.
  • docker machine을 알수 있게되었다.