[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)

# Docker Swarm 클러스터 기반의 배포검증

> www.hongsnet.net 서비스에 Docker Swarm 환경에서의 배포를 검증하여, 적용한다.


# 시작하기 전에

Docker **Swarm**의 경우 `Auto Scaling` 이 지원되지 않는다. 따라서 이 기능뿐만 아니라 객관적으로 봤을 때 `K8s`(쿠버네티스)가 확실히 인기있는 이유가 있어보인다.


# Docker Swarm system Overview

다음과 같이 4대로 구성검증을 수행한다.

*  TB2-DOCKER-MANAGER01 ( Exclude Node )
*  TB2-DOCKER-MANAGER02 + Node
*  TB3-DOCKER-MANAGER03 + Node
*  TB3-DOCKER-NODE01

Node의 현황은 다음과 같다.

```bash
# docker node ls
ID                            HOSTNAME               STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
2smb95jog1melt4ok0ptpn3n9 *   TB2-DOCKER-MANAGER01   Ready     Active         Reachable        20.10.2
libu6alzhci724h31ji3z6fb7     TB2-DOCKER-MANAGER02   Ready     Active         Leader           20.10.2
2jy4lkwokf20w9gfe9cyqb3w7     TB3-DOCKER-MANAGER03   Ready     Active         Reachable        20.10.2
3h6eeb8p5f1fcwes0a8dpotzr     TB3-DOCKER-NODE01      Ready     Active                          20.10.2
```
> Leader는 현재 TB2-DOCKER-MANAGER02 Host 이다.

네트워크의 구성의 경우 다음과 같이 swarm 네트워크가 overlay Driver로 구성되어 있다.

```bash
# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
279270fdaeca        bridge              bridge              local
3bf40dd45669        docker_gwbridge     bridge              local
40f4fa5b4f4f        host                host                local
ymt3wq5s0ikc        ingress             overlay             swarm
a205a35afbb6        none                null                local
```

네트워크, 서비스, 그리고 모든 컨테이너들을 **스택**(Stack)이라 부른다. 스택을 생성하기 위해서는 **docker stack** 명령어를 사용해야 하지만, 스택을  docker-stack.yml 파일로 수행하기를 원한다. 따라서 다음과 같이 명령어를 실행하면 된다.

```bash
# cat docker-stack.yml
version: '3'

services:
  hongsnet-php74:
   image: registry.hongsnet.net/joohan.hong/docker/php:centos7-httpd-php74
   ports:
     - 9800:80
   volumes:
     - "/DOCKERS/var_www_html:/var/www/html"
   deploy:
     mode: replicated
     replicas: 5
     update_config:
       parallelism: 5
       delay: 10s
     restart_policy:
       condition: on-failure
       max_attempts: 3
       window: 120s
```

```bash
# docker stack deploy --with-registry-auth --compose-file=docker-stack.yml php
Creating network php_default
Creating service php_hongsnet-php74
```

*  파일명은 반드시 docker-compose.yml 일 필요는 없다.
*  --with-registry-auth 옵션은 Private Repository의 인증정보를 Node에 전달한다는 옵션인데, GitLAB의 Registry의 경우는 제대로 동작하지 않는다. 따라서 일단 Public 하게 권한을 열어서 테스트했다.
*  php : 이 것은 스택의 이름으로써 임의대로 지정하면 된다.

그럼, 다음과 같이 **5 개**의(replicas: 5) 컨테이너가 실행된다.

```bash
# ./docker_service_ls.sh
ID             NAME                    MODE         REPLICAS   IMAGE                                                              PORTS
ap48zdixh6wq   php_hongsnet-php74      replicated   5/5        registry.hongsnet.net/joohan.hong/docker/php:centos7-httpd-php74   *:9800->80/tcp
```

이제 **Front-end**(HA-Proxy)에서 서비스에 접속테스트를 해본다.

```bash
# curl -s 172.24.0.238:9800
server_name 변수 값 : <b>172.24.0.238</b><br>remote_addr 변수 값 : <b>10.255.0.3</b><br>server_addr 변수 값 : <b>10.255.245.67</b><br>server_hostname 변수 값 : <b>004975e04c1f</b><br>script_name 변수 값 : <b>/index.php</b><br>s/w version 변수 값 : <b>Apache/2.4.6 (CentOS) PHP/7.4.14</b><br>
```
> DEMO Url : https://swarm.freehongs.net/


# Docker Swarm `확장`

**컨테이너 확장**을 위해 현재 5개에서 **Replicas를 10으로 늘려보자**.

```bash
# docker service update --replicas 10 php_hongsnet-php74
php_hongsnet-php74
overall progress: 10 out of 10 tasks
1/10: running   [==================================================>]
2/10: running   [==================================================>]
3/10: running   [==================================================>]
4/10: running   [==================================================>]
5/10: running   [==================================================>]
6/10: running   [==================================================>]
7/10: running   [==================================================>]
8/10: running   [==================================================>]
9/10: running   [==================================================>]
10/10: running   [==================================================>]
verify: Service converged
```

다음과 같이 5 -> **10개로 확장**되었다.

```bash
# docker service ls
ID             NAME                    MODE         REPLICAS   IMAGE                                                              PORTS
ap48zdixh6wq   php_hongsnet-php74      replicated   10/10      registry.hongsnet.net/joohan.hong/docker/php:centos7-httpd-php74   *:9800->80/tcp
```


# Docker Swarm `축소`

그럼 현재 10개의 컨테이너를 **다시 5개로 축소**해보자.

```bash
# docker service update --replicas 5 php_hongsnet-php74
php_hongsnet-php74
overall progress: 5 out of 5 tasks
1/5: running   [==================================================>]
2/5: running   [==================================================>]
3/5: running   [==================================================>]
4/5: running   [==================================================>]
5/5: running   [==================================================>]
verify: Service converged
```

다음과 같이 10 -> 5개로 축소되었다.

```bash
# docker service ls
ID             NAME                    MODE         REPLICAS   IMAGE                                                              PORTS
ap48zdixh6wq   php_hongsnet-php74      replicated   5/5        registry.hongsnet.net/joohan.hong/docker/php:centos7-httpd-php74   *:9800->80/tcp
```
