Swarm Mode

Introduction

  1. 도커 시스템 정보 확인

    docker system info
  2. Swarm 활성화

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

    docker system info
  4. Node 목록 확인

    docker node ls
  5. 호스트의 호스트 이름 확인

    hostname
  6. Service 생성

    docker service create --name nginx nginx 
  7. 생성된 Service 확인

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

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

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

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

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

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

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

    docker service update --help
  15. 생성된 Service의 상세 내용 확인

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

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

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

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

    docker service inspect nginx
  20. Service에 속하는 컨테이너 목록 확인

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

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

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

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

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

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

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

    docker service update nginx --publish-add 8080:80
  28. Service에 정보 확인

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

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

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

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

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

    curl localhost:8080
  34. DOCKER-INGRESS 규칙 확인

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

    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 수정

    docker service update nginx --reserve-memory 1.5gb 
  39. Service 삭제

    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 접속해서 클러스터 조인 명령어 실행

  6. 매니저 노드에 연결된 터미널로 이동해서 Swarm 노드 목록 확인

    sudo docker node ls
  7. Service 생성

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

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

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

    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 생성

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

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

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

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

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

    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 목록 확인

    sudo docker network ls
  22. 매니저 노드에 연결된 터미널로 이동

  23. 호스트의 8080 포트를 Service에 속하는 컨테이너의 80 포트와 연동

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

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

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

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

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

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

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

    sudo docker service ps busybox
  31. 해당 컨테이너가 배포된 노드로 연결된 터미널로 이동

  32. 해당 노드에 배포된 NGINX 컨테이너의 IP 주소 확인

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

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

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

    curl NGINX_CONTAINER_IP
  36. bash 프로세스 종료

    exit
  37. 매니저 노드에 연결된 터미널로 이동

  38. busybox 서비스에 NGINX 서비스가 사용하는 overlay 네트워크 연동

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

    sudo docker service ps busybox
  40. busybox 컨테이너가 배포된 노드로 연결된 터미널로 이동

  41. busybox 컨테이너로 bash 프로세스 실행

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

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

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

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

    dig nginx
  46. bash 프로세스 종료

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

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

Last updated