[![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 변수 값 : 172.24.0.238
remote_addr 변수 값 : 10.255.0.3
server_addr 변수 값 : 10.255.245.67
server_hostname 변수 값 : 004975e04c1f
script_name 변수 값 : /index.php
s/w version 변수 값 : Apache/2.4.6 (CentOS) PHP/7.4.14
``` > 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 ```