backend/docker

docker swarm을 사용하여 3개의 node 만들어보기 (swarm example)

seul chan 2017. 12. 26. 10:06

1. play-with-docker.com

  • 웹 브라우저 상에서 실행 가능.
  • 4시간 간격으로 clear

2. docker-machine + VirtualBox

  • require machine with 8GB memory

3. digital ocean + Docker install

  • cheap, easy server
  • similar to production level

4. Role your own

  • Aws, azure, DO, google 등…
  • get.docker.com

나는 2번 방법으로 docker-machine을 깔아서 해보았다. docker-machine 까는 방법은 여기에서 설명해놓았다.

3개의 다른 machine에 swarm 띄워보기

docker-machine을 사용해서 3개의 swarm을 띄워보자.

$docker-machine create node1
$docker-machine create node2
$docker-machine create node3

$eval $(docker-machine env node1)
# check node1 is activating
$docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
node1     *        virtualbox   Running   tcp://192.168.99.100:2376           v17.09.1-ce
node2     -        virtualbox   Running   tcp://192.168.99.101:2376           v17.09.1-ce
node3     -        virtualbox   Running   tcp://192.168.99.102:2376           v17.09.1-ce

ssh 명령어를 사용해서 node1에 접속할 수 있다.

$docker-machine ssh node1
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.09.1-ce, build HEAD : e7de9ae - Fri Dec  8 19:41:36 UTC 2017
Docker version 17.09.1-ce, build 19e2cf6
docker@node1:~$ ls
log.log
docker@node1:~$ exit

이제 각각의 터미널에서 docker-machine ssh 명령어를 사용해서 node1node2node3에 접속하자. 나는 iTerm2을 사용하여 한 창을 분할해서 사용하였다.

iterm-screenshot

node1에서 docker swarm init

docker swarm init 명령어를 입력하면 에러가 발생한다. --advertise-addr 옵션을 통해서 여러 address중에 사용할 ip를 골라주라는 메세지가 뜬다.

docker@node1:~$ docker swarm init
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (10.0.2.15 on eth0 and 192.168.99.100 on eth1) - specify one with --advertise-addr

같은 ip 내에 있는 node2node3과 연동해야하니 192.168로 시작하는 서브넷 ip를 선택하여 다시 init해준다.

docker@node1:~$ docker swarm init --advertise-addr 192.168.99.100

Swarm initialized: current node (kcwx4yh1mtnusvptwxo6of5mr) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4pxse964fb9rqpnv89rkq1v3h627t9bo7jjjz9k20vnzhwjog2-95ypb56h9028hfkp00ow94d11 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

정상적으로 잘 동작했으면 아래 나오는 command를 복사해서 node2에서 실행하면 join된다.

node2에swarm join 명령어 입력

위에서 복사한 명령어를 node2에 입력하면, 정상적으로 swarm에 worker로 접속되었다는 메세지가 출력된다.

docker@node2: ~$ docker swarm join --token SWMTKN-1-4pxse964fb9rqpnv89rkq1v3h627t9bo7jjjz9k20vnzhwjog2-95ypb56h9028hfkp00ow94d11 192.168.99.100:2377

This node joined a swarm as a worker.

node1에서 join된 node 상태를 확인 가능

docker node ls로 node를 보면 어떤 노드가 매니져이고, worker인지를 확인 가능

docker@node1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
kcwx4yh1mtnusvptwxo6of5mr *   node1               Ready               Active              Leader
2i2wupxgrhzrgzz5j7safw53c     node2               Ready               Active

하지만 node2에서는 swarm command 사용이 불가능하다. 처음 join되었을 때 manager가 아닌 worker 신분(?)이기 때문이다. worker는 swarm command를 사용할 수 없다.

docker@node2:~$ docker node ls
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.

node1에서 다른 노드(node2) role 수정

다른 노드(node2)에서 swarm 명령어를 입력하는 등의 작업을 위해서 node2를 매니저로 승격시켜야한다. docker node update 명령어를 이용.

docker@node1:~$ docker node update --role manager node2
node2

docker@node1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
kcwx4yh1mtnusvptwxo6of5mr *   node1               Ready               Active              Leader
2i2wupxgrhzrgzz5j7safw53c     node2               Ready               Active              Reachable

node2의 상태가 Reachable인것을 확인 가능하다. 최초 생성 노드는 Leader로 유지된다.

node1에서 다른 노드(node3)을 바로 manager 권한으로 join

join-token 명령어로 manager 권한의 토큰을 발행할 수 있다.

docker@node1:~$ docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4pxse964fb9rqpnv89rkq1v3h627t9bo7jjjz9k20vnzhwjog2-99dwpsub85f2wjybp3gxdjd78 192.168.99.100:2377

해당 토큰을 node3에서 입력하면 node3가 worker가 아닌 manager 권한으로 발행할 수 있따.

docker@node3:~$     docker swarm join --token SWMTKN-1-4pxse964fb9rqpnv89rkq1v3h627t9bo7
jjjz9k20vnzhwjog2-99dwpsub85f2wjybp3gxdjd78 192.168.99.100:2377
This node joined a swarm as a manager.

docker service 실행하기

docker service 명령어로 3개의 replicas를 만들면 이제 자동으로 node1, 2, 3에 분산되어 만들어진다.

docker@node1:~$ docker service create --replicas 3 -d alpine ping 8.8.8.8
zmgikz924trws37s7hurhubb9

docker@node1:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
zmgikz924trw        thirsty_morse       replicated          3/3                 alpine:latest

docker@node1:~$ docker node ps
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
vrm3qvc3keed        thirsty_morse.3     alpine:latest       node1               Running             Running 29 seconds ago

docker@node1:~$ docker service ps thirsty_morse
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
b0zl9r4j329d        thirsty_morse.1     alpine:latest       node2               Running             Running about a minute ago
6lv0qpm1g43u        thirsty_morse.2     alpine:latest       node3               Running             Running about a minute ago
vrm3qvc3keed        thirsty_morse.3     alpine:latest       node1               Running             Running about a minute ago

docker@node1:~$ docker node ps node1
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
vrm3qvc3keed        thirsty_morse.3     alpine:latest       node1               Running             Running 2 minutes ago