> For the complete documentation index, see [llms.txt](https://container.youngwjung.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://container.youngwjung.com/swarm-mode.md).

# Swarm Mode

### Introduction

1. 도커 시스템 정보 확인

   ```
   docker system info
   ```
2. Swarm 활성화

   ```
   docker swarm init
   ```
3. 도커 시스템 정보 확인

   ```
   docker system info
   ```
4. Node 목록 확인&#x20;

   ```
   docker node ls
   ```
5. 호스트의 호스트 이름 확인&#x20;

   ```
   hostname
   ```
6. Service 생성&#x20;

   ```
   docker service create --name nginx nginx 
   ```
7. 생성된 Service 확인&#x20;

   ```
   docker service ls
   ```
8. 생성된 Service에 속하는 컨테이너 목록 확인&#x20;

   ```
   docker service ps nginx
   ```
9. Swarm Node에 생성된 컨테이너 목록 확인&#x20;

   ```
   docker node ps
   ```
10. 호스트에 생성된 컨테이너 목록 확인&#x20;

    ```
    docker container ls
    ```
11. Service의 복제본 갯수를 3개로 수정

    ```
    docker service update nginx --replicas=3
    ```
12. Service에 속하는 컨테이너 목록 확인&#x20;

    ```
    docker service ps nginx
    ```
13. 실행중인 컨테이너에 수정 가능한 설정 확인&#x20;

    ```
    docker container update --help
    ```
14. 생성된 Service에 수정 가능한 설정 확인&#x20;

    ```
    docker service update --help
    ```
15. 생성된 Service의 상세 내용 확인&#x20;

    ```
    docker service inspect nginx
    ```
16. 새로운 터미널을 열고 Docker 이벤트 수신&#x20;

    ```
    docker events
    ```
17. 기존 터미널로 돌아와서 Service의 이미지 태그 변경

    ```
    docker service update nginx --image=nginx:alpine
    ```
18. 다른 터미널로 이동해서 발생한 이벤트 확인&#x20;

    ```
    docker events
    ```
19. 기존 터미널로 이동해서 Service의 상세 내용 확인

    ```
    docker service inspect nginx
    ```
20. Service에 속하는 컨테이너 목록 확인&#x20;

    ```
    docker service ps nginx
    ```
21. 호스트에 생성된 모든 컨테이너 확인&#x20;

    ```
    docker container ls -a
    ```
22. 이전 버전으로 롤백

    ```
    docker service update nginx --rollback
    ```
23. Service에 속하는 컨테이너 목록 확인&#x20;

    ```
    docker service ps nginx
    ```
24. 호스트에 생성된 모든 컨테이너 확인&#x20;

    ```
    docker container ls -a
    ```
25. Service에 속하는 컨테이너 중에 한개를 삭제&#x20;

    ```
    docker container rm --force $(docker container ls --filter name=^nginx -q -l)
    ```
26. Service에 속하는 컨테이너 목록 확인&#x20;

    ```
    docker service ps nginx
    ```
27. 호스트의 8080 포트를 Service에 속하는 컨테이너의 80 포트와 연동

    ```
    docker service update nginx --publish-add 8080:80
    ```
28. Service에 정보 확인&#x20;

    ```
    docker service ls
    ```
29. Service에 속하는 각 컨테이너별 포트 맵핑 확인

    ```
    docker container ls --filter name=^nginx
    ```
30. Service의 상세 내용 확인

    ```
    docker service inspect nginx
    ```
31. Service에 속하는 각 컨테이너의 IP 주소 확인&#x20;

    ```
    docker container ls --filter name=^nginx -q | xargs -n 1 docker container inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##';
    ```
32. Network 목록 확인&#x20;

    ```
    docker network ls
    ```
33. 로컬호스트에 연동된 포트를 통해서 Service로 접근이 되는지 확인&#x20;

    ```
    curl localhost:8080
    ```
34. DOCKER-INGRESS 규칙 확인&#x20;

    ```
    sudo iptables -t nat -L DOCKER-INGRESS -n  | column -t
    ```
35. 다른 터미널로 이동해서 Service 로그 수신&#x20;

    ```
    docker service logs nginx -n 0 -f
    ```
36. 기존 터미널로 이동해서 로컬호스트에 연동된 포트를 통해서 Service 호출

    ```
    for i in `seq 1 20`; do curl localhost:8080; done
    ```
37. 다른 터미널로 이동해서 다수의 컨테이너로 부하 분산되는지 확인하고 `Ctrl+C`를 입력
38. 기존 터미널로 돌아와서 Service 수정&#x20;

    ```
    docker service update nginx --reserve-memory 1.5gb 
    ```
39. Service 삭제&#x20;

    ```
    docker service rm nginx
    ```
40. Swarm 비활성화 시도

    ```
    docker swarm leave
    ```
41. Swarm 비활성화

    ```
    docker swarm leave --force
    ```
42. 도커 시스템 정보 확인

    ```
    docker system info
    ```

### Swarm Cluster

1. 실습 환경 생성

   ```
   {
       cd ~/environment/container-labs
       git pull
       terraform init
       terraform apply --target=module.swarm_cluster --auto-approve
   }
   ```
2. 인스턴스 정보 확인

   ```
   terraform show -json \
   | jq -r '.values.root_module.child_modules | .[].resources | .[] | select(.address | contains("module.swarm_cluster.aws_instance.this")).values.public_ip'
   ```
3. 새로운 터미널을 열고 첫번째 인스턴스에 SSH 연결 - 매니저 노드로 사용

   ```
   ssh ubuntu@위에서 확인한 아이피 주소
   ```
4. Swarm 활성화

   ```
   sudo docker swarm init
   ```
5. 새로운 터미널을 열고 두번째, 세번째 인스턴스로 SSH 접속해서 클러스터 조인 명령어 실행&#x20;
6. 매니저 노드에 연결된 터미널로 이동해서 Swarm 노드 목록 확인&#x20;

   ```
   sudo docker node ls
   ```
7. Service 생성&#x20;

   ```
   sudo docker service create --name nginx --replicas 3 --reserve-memory 1.5gb nginx
   ```
8. 생성된 Service에 속하는 컨테이너 목록 확인&#x20;

   ```
   sudo docker service ps nginx
   ```
9. 매니저 노드에 배포된 NGINX 컨테이너의 상세 내용 확인&#x20;

   ```
   sudo docker container inspect $(sudo docker container ls -q -f name=nginx)
   ```
10. 매니저 노드에 생성된 Network 목록 확인&#x20;

    ```
    sudo docker network ls
    ```
11. 두번째 노드에 연결된 터미널로 이동해서 해당 노드에 배포된 NGINX 컨테이너의 상세 내용 확인

    ```
    sudo docker container inspect $(sudo docker container ls -q -f name=nginx)
    ```
12. 해당 노드에 생성된 Network 목록 확인

    ```
    sudo docker network ls
    ```
13. 매니저 노드에 연결된 터미널로 이동해서 Service 삭제

    ```
    sudo docker service rm nginx
    ```
14. Overlay 형식의 Network 생성&#x20;

    ```
    sudo docker network create --driver overlay  my-app 
    ```
15. Network가 생성 되었는지 확인&#x20;

    ```
    sudo docker network ls
    ```
16. 다른 노드에 연결된 터미널로 이동해서 Network 목록 확인&#x20;

    ```
    sudo docker network ls
    ```
17. 매니저 노드에 연결된 터미널로 이동해서 Service 생성&#x20;

    ```
    sudo docker service create --name nginx --replicas 3 --reserve-memory 1.5gb \
    --network my-app nginx
    ```
18. 생성된 Service에 속하는 컨테이너 목록 확인&#x20;

    ```
    sudo docker service ps nginx
    ```
19. 매니저 노드에 배포된 NGINX 컨테이너의 상세 내용 확인&#x20;

    ```
    sudo docker container inspect $(sudo docker container ls -q -f name=nginx)
    ```
20. 다른 노드에 연결된 터미널로 이동해서 해당 노드에 배포된 NGINX 컨테이너의 상세 내용 확인

    ```
    sudo docker container inspect $(sudo docker container ls -q -f name=nginx)
    ```
21. Network 목록 확인&#x20;

    ```
    sudo docker network ls
    ```
22. 매니저 노드에 연결된 터미널로 이동
23. 호스트의 8080 포트를 Service에 속하는 컨테이너의 80 포트와 연동

    ```
    sudo docker service update nginx --publish-add 8080:80
    ```
24. 로컬호스트에 연동된 포트를 통해서 Service로 접근이 되는지 확인&#x20;

    ```
    curl localhost:8080
    ```
25. 로컬호스트에 연동된 포트를 통해서 Service 호출

    ```
    for i in `seq 1 20`; do curl localhost:8080; done
    ```
26. Service 로그 확인&#x20;

    ```
    sudo docker service logs nginx --since 1m
    ```
27. 다른 노드에 연결된 터미널로 이동해서 해당 노드의 8080 포트를 통해서 Service로 접근이 되는지 확인&#x20;

    ```
    curl localhost:8080
    ```
28. 매니저 노드에 연결된 터미널로 이동해서 Service에 부여된 가상 IP 확인&#x20;

    ```
    sudo docker service inspect nginx --format '{{json .Endpoint.VirtualIPs}}'
    ```
29. 새로운 Service 생성&#x20;

    ```
    sudo docker service create --name busybox praqma/network-multitool sleep infinity
    ```
30. 생성된 Service에 속하는 컨테이너가 어떤 노드에 배포 되었는지 확인&#x20;

    ```
    sudo docker service ps busybox
    ```
31. 해당 컨테이너가 배포된 노드로 연결된 터미널로 이동
32. 해당 노드에 배포된 NGINX 컨테이너의 IP 주소 확인&#x20;

    ```
    sudo docker container inspect $(sudo docker container ls -q -f name=nginx) \
    --format '{{ $network := index .NetworkSettings.Networks "my-app" }}{{ $network.IPAddress}}'
    ```
33. busybox 컨테이너로 bash 프로세스 실행&#x20;

    ```
    sudo docker container exec -it $(sudo docker container ls -q -f name=busybox) bash 
    ```
34. 서비스에 부여된 가상 IP로 NGINX 컨테이너에 접근이 되는지 확인&#x20;

    ```
    curl SERVICE_VIRTUAL_IP
    ```
35. 해당 노드에 배포된 NGINX 컨테이너의 IP로 접근이 되는지 확인&#x20;

    ```
    curl NGINX_CONTAINER_IP
    ```
36. bash 프로세스 종료&#x20;

    ```
    exit
    ```
37. 매니저 노드에 연결된 터미널로 이동
38. busybox 서비스에 NGINX 서비스가 사용하는 overlay 네트워크 연동

    ```
    sudo docker service update --network-add my-app busybox
    ```
39. 컨테이너가 어떤 노드에 배포 되었는지 확인&#x20;

    ```
    sudo docker service ps busybox
    ```
40. busybox 컨테이너가 배포된 노드로 연결된 터미널로 이동
41. busybox 컨테이너로 bash 프로세스 실행&#x20;

    ```
    sudo docker container exec -it $(sudo docker container ls -q -f name=busybox) bash 
    ```
42. 서비스에 부여된 가상 IP로 NGINX 컨테이너에 접근이 되는지 확인&#x20;

    ```
    curl SERVICE_VIRTUAL_IP
    ```
43. 위에서 확인한 NGINX 컨테이너의 IP로 접근이 되는지 확인&#x20;

    ```
    curl NGINX_CONTAINER_IP
    ```
44. 서비스 이름으로 NGINX 컨테이너에 접근이 되는지 확인

    ```
    curl nginx
    ```
45. 서비스 이름으로 도메인 주소 검색 시도

    ```
    dig nginx
    ```
46. &#x20;bash 프로세스 종료&#x20;

    ```
    exit
    ```
47. Cloud9에 연결된 터미널로 이동해서 리소스 삭제&#x20;

    ```
    terraform destroy --target=module.swarm_cluster --auto-approve
    ```
