Swarm Mode
Introduction
도커 시스템 정보 확인
docker system infoSwarm 활성화
docker swarm init도커 시스템 정보 확인
docker system infoNode 목록 확인
docker node ls호스트의 호스트 이름 확인
hostnameService 생성
docker service create --name nginx nginx생성된 Service 확인
docker service ls생성된 Service에 속하는 컨테이너 목록 확인
docker service ps nginxSwarm Node에 생성된 컨테이너 목록 확인
docker node ps호스트에 생성된 컨테이너 목록 확인
docker container lsService의 복제본 갯수를 3개로 수정
docker service update nginx --replicas=3Service에 속하는 컨테이너 목록 확인
docker service ps nginx실행중인 컨테이너에 수정 가능한 설정 확인
docker container update --help생성된 Service에 수정 가능한 설정 확인
docker service update --help생성된 Service의 상세 내용 확인
docker service inspect nginx새로운 터미널을 열고 Docker 이벤트 수신
docker events기존 터미널로 돌아와서 Service의 이미지 태그 변경
docker service update nginx --image=nginx:alpine다른 터미널로 이동해서 발생한 이벤트 확인
docker events기존 터미널로 이동해서 Service의 상세 내용 확인
docker service inspect nginxService에 속하는 컨테이너 목록 확인
docker service ps nginx호스트에 생성된 모든 컨테이너 확인
docker container ls -a이전 버전으로 롤백
docker service update nginx --rollbackService에 속하는 컨테이너 목록 확인
docker service ps nginx호스트에 생성된 모든 컨테이너 확인
docker container ls -aService에 속하는 컨테이너 중에 한개를 삭제
docker container rm --force $(docker container ls --filter name=^nginx -q -l)Service에 속하는 컨테이너 목록 확인
docker service ps nginx호스트의 8080 포트를 Service에 속하는 컨테이너의 80 포트와 연동
docker service update nginx --publish-add 8080:80Service에 정보 확인
docker service lsService에 속하는 각 컨테이너별 포트 맵핑 확인
docker container ls --filter name=^nginxService의 상세 내용 확인
docker service inspect nginxService에 속하는 각 컨테이너의 IP 주소 확인
docker container ls --filter name=^nginx -q | xargs -n 1 docker container inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##';Network 목록 확인
docker network ls로컬호스트에 연동된 포트를 통해서 Service로 접근이 되는지 확인
curl localhost:8080DOCKER-INGRESS 규칙 확인
sudo iptables -t nat -L DOCKER-INGRESS -n | column -t다른 터미널로 이동해서 Service 로그 수신
docker service logs nginx -n 0 -f기존 터미널로 이동해서 로컬호스트에 연동된 포트를 통해서 Service 호출
for i in `seq 1 20`; do curl localhost:8080; done다른 터미널로 이동해서 다수의 컨테이너로 부하 분산되는지 확인하고
Ctrl+C를 입력기존 터미널로 돌아와서 Service 수정
docker service update nginx --reserve-memory 1.5gbService 삭제
docker service rm nginxSwarm 비활성화 시도
docker swarm leaveSwarm 비활성화
docker swarm leave --force도커 시스템 정보 확인
docker system info
Swarm Cluster
실습 환경 생성
{ cd ~/environment/container-labs git pull terraform init terraform apply --target=module.swarm_cluster --auto-approve }인스턴스 정보 확인
terraform show -json \ | jq -r '.values.root_module.child_modules | .[].resources | .[] | select(.address | contains("module.swarm_cluster.aws_instance.this")).values.public_ip'새로운 터미널을 열고 첫번째 인스턴스에 SSH 연결 - 매니저 노드로 사용
ssh ubuntu@위에서 확인한 아이피 주소Swarm 활성화
sudo docker swarm init새로운 터미널을 열고 두번째, 세번째 인스턴스로 SSH 접속해서 클러스터 조인 명령어 실행
매니저 노드에 연결된 터미널로 이동해서 Swarm 노드 목록 확인
sudo docker node lsService 생성
sudo docker service create --name nginx --replicas 3 --reserve-memory 1.5gb nginx생성된 Service에 속하는 컨테이너 목록 확인
sudo docker service ps nginx매니저 노드에 배포된 NGINX 컨테이너의 상세 내용 확인
sudo docker container inspect $(sudo docker container ls -q -f name=nginx)매니저 노드에 생성된 Network 목록 확인
sudo docker network ls두번째 노드에 연결된 터미널로 이동해서 해당 노드에 배포된 NGINX 컨테이너의 상세 내용 확인
sudo docker container inspect $(sudo docker container ls -q -f name=nginx)해당 노드에 생성된 Network 목록 확인
sudo docker network ls매니저 노드에 연결된 터미널로 이동해서 Service 삭제
sudo docker service rm nginxOverlay 형식의 Network 생성
sudo docker network create --driver overlay my-appNetwork가 생성 되었는지 확인
sudo docker network ls다른 노드에 연결된 터미널로 이동해서 Network 목록 확인
sudo docker network ls매니저 노드에 연결된 터미널로 이동해서 Service 생성
sudo docker service create --name nginx --replicas 3 --reserve-memory 1.5gb \ --network my-app nginx생성된 Service에 속하는 컨테이너 목록 확인
sudo docker service ps nginx매니저 노드에 배포된 NGINX 컨테이너의 상세 내용 확인
sudo docker container inspect $(sudo docker container ls -q -f name=nginx)다른 노드에 연결된 터미널로 이동해서 해당 노드에 배포된 NGINX 컨테이너의 상세 내용 확인
sudo docker container inspect $(sudo docker container ls -q -f name=nginx)Network 목록 확인
sudo docker network ls매니저 노드에 연결된 터미널로 이동
호스트의 8080 포트를 Service에 속하는 컨테이너의 80 포트와 연동
sudo docker service update nginx --publish-add 8080:80로컬호스트에 연동된 포트를 통해서 Service로 접근이 되는지 확인
curl localhost:8080로컬호스트에 연동된 포트를 통해서 Service 호출
for i in `seq 1 20`; do curl localhost:8080; doneService 로그 확인
sudo docker service logs nginx --since 1m다른 노드에 연결된 터미널로 이동해서 해당 노드의 8080 포트를 통해서 Service로 접근이 되는지 확인
curl localhost:8080매니저 노드에 연결된 터미널로 이동해서 Service에 부여된 가상 IP 확인
sudo docker service inspect nginx --format '{{json .Endpoint.VirtualIPs}}'새로운 Service 생성
sudo docker service create --name busybox praqma/network-multitool sleep infinity생성된 Service에 속하는 컨테이너가 어떤 노드에 배포 되었는지 확인
sudo docker service ps busybox해당 컨테이너가 배포된 노드로 연결된 터미널로 이동
해당 노드에 배포된 NGINX 컨테이너의 IP 주소 확인
sudo docker container inspect $(sudo docker container ls -q -f name=nginx) \ --format '{{ $network := index .NetworkSettings.Networks "my-app" }}{{ $network.IPAddress}}'busybox 컨테이너로 bash 프로세스 실행
sudo docker container exec -it $(sudo docker container ls -q -f name=busybox) bash서비스에 부여된 가상 IP로 NGINX 컨테이너에 접근이 되는지 확인
curl SERVICE_VIRTUAL_IP해당 노드에 배포된 NGINX 컨테이너의 IP로 접근이 되는지 확인
curl NGINX_CONTAINER_IPbash 프로세스 종료
exit매니저 노드에 연결된 터미널로 이동
busybox 서비스에 NGINX 서비스가 사용하는 overlay 네트워크 연동
sudo docker service update --network-add my-app busybox컨테이너가 어떤 노드에 배포 되었는지 확인
sudo docker service ps busyboxbusybox 컨테이너가 배포된 노드로 연결된 터미널로 이동
busybox 컨테이너로 bash 프로세스 실행
sudo docker container exec -it $(sudo docker container ls -q -f name=busybox) bash서비스에 부여된 가상 IP로 NGINX 컨테이너에 접근이 되는지 확인
curl SERVICE_VIRTUAL_IP위에서 확인한 NGINX 컨테이너의 IP로 접근이 되는지 확인
curl NGINX_CONTAINER_IP서비스 이름으로 NGINX 컨테이너에 접근이 되는지 확인
curl nginx서비스 이름으로 도메인 주소 검색 시도
dig nginxbash 프로세스 종료
exitCloud9에 연결된 터미널로 이동해서 리소스 삭제
terraform destroy --target=module.swarm_cluster --auto-approve
Last updated