Swarm Mode
Introduction
๋์ปค ์์คํ ์ ๋ณด ํ์ธ
docker system info
Swarm ํ์ฑํ
docker swarm init
๋์ปค ์์คํ ์ ๋ณด ํ์ธ
docker system info
Node ๋ชฉ๋ก ํ์ธ
docker node ls
ํธ์คํธ์ ํธ์คํธ ์ด๋ฆ ํ์ธ
hostname
Service ์์ฑ
docker service create --name nginx nginx
์์ฑ๋ Service ํ์ธ
docker service ls
์์ฑ๋ Service์ ์ํ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker service ps nginx
Swarm Node์ ์์ฑ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker node ps
ํธ์คํธ์ ์์ฑ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker container ls
Service์ ๋ณต์ ๋ณธ ๊ฐฏ์๋ฅผ 3๊ฐ๋ก ์์
docker service update nginx --replicas=3
Service์ ์ํ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
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 nginx
Service์ ์ํ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker service ps nginx
ํธ์คํธ์ ์์ฑ๋ ๋ชจ๋ ์ปจํ ์ด๋ ํ์ธ
docker container ls -a
์ด์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ
docker service update nginx --rollback
Service์ ์ํ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker service ps nginx
ํธ์คํธ์ ์์ฑ๋ ๋ชจ๋ ์ปจํ ์ด๋ ํ์ธ
docker container ls -a
Service์ ์ํ๋ ์ปจํ ์ด๋ ์ค์ ํ๊ฐ๋ฅผ ์ญ์
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:80
Service์ ์ ๋ณด ํ์ธ
docker service ls
Service์ ์ํ๋ ๊ฐ ์ปจํ ์ด๋๋ณ ํฌํธ ๋งตํ ํ์ธ
docker container ls --filter name=^nginx
Service์ ์์ธ ๋ด์ฉ ํ์ธ
docker service inspect nginx
Service์ ์ํ๋ ๊ฐ ์ปจํ ์ด๋์ 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:8080
DOCKER-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.5gb
Service ์ญ์
docker service rm nginx
Swarm ๋นํ์ฑํ ์๋
docker swarm leave
Swarm ๋นํ์ฑํ
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 ls
Service ์์ฑ
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 nginx
Overlay ํ์์ Network ์์ฑ
sudo docker network create --driver overlay my-app
Network๊ฐ ์์ฑ ๋์๋์ง ํ์ธ
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; done
Service ๋ก๊ทธ ํ์ธ
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_IP
bash ํ๋ก์ธ์ค ์ข ๋ฃ
exit
๋งค๋์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ํฐ๋ฏธ๋๋ก ์ด๋
busybox ์๋น์ค์ NGINX ์๋น์ค๊ฐ ์ฌ์ฉํ๋ overlay ๋คํธ์ํฌ ์ฐ๋
sudo docker service update --network-add my-app busybox
์ปจํ ์ด๋๊ฐ ์ด๋ค ๋ ธ๋์ ๋ฐฐํฌ ๋์๋์ง ํ์ธ
sudo docker service ps busybox
busybox ์ปจํ ์ด๋๊ฐ ๋ฐฐํฌ๋ ๋ ธ๋๋ก ์ฐ๊ฒฐ๋ ํฐ๋ฏธ๋๋ก ์ด๋
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 nginx
bash ํ๋ก์ธ์ค ์ข ๋ฃ
exit
Cloud9์ ์ฐ๊ฒฐ๋ ํฐ๋ฏธ๋๋ก ์ด๋ํด์ ๋ฆฌ์์ค ์ญ์
terraform destroy --target=module.swarm_cluster --auto-approve
Last updated