# 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
    ```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://container.youngwjung.com/swarm-mode.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
