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 명령어를 사용해서 node1, node2, node3에 접속하자. 나는 iTerm2을 사용하여 한 창을 분할해서 사용하였다.

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 내에 있는 node2, node3과 연동해야하니 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
'backend > docker' 카테고리의 다른 글
| 도커로 장고 배포하기 - docker-compose (0) | 2018.01.29 | 
|---|---|
| Making django dev server with docker (0) | 2018.01.08 | 
| docker-machine 소개, 설치 및 기본 사용법 (0) | 2017.12.23 | 
| docker - swarm 기초 사용법 및 개념 (0) | 2017.12.22 | 
| docker compose 기초 사용법 (0) | 2017.12.21 |