Docker Swarm

  • What is Docker Swarm?
    • 여러 컨테이너를 클러스터로 만들어 관리
    • Docker를 사용한 orchestration infra를 구축할 때 가장 호환성이 좋음

Docker Swarm

  • Node
    • 클러스터에 속한 도커 서버 단위 입니다. 보통 한 서버에 하나의 도커 데몬을 실행하기 때문에 노드는 곧 서버라고 이해 할 수 있습니다.
  • Manager
    • 매니저는 클러스터의 상태를 관리합니다. 명령어는 매니저 노드에서만 실행 할 수 있습니다.
      아키텍쳐상에서 매니저는 High Avalilability를 위하여 여러대 실행 되어야 합니다.
      일반적으로 노드마다 매니저가 배포 됩니다.
  • Worker
    • 매니저의 명령을 받아 컨테이너를 생성하고 상태를 체크합니다.
      서비스 규모에 맞게 많이 실행하고 요청이 많아지면 Worker를 스케일아웃 합니다.
  • Service Discovery
    • 서비스 디스커버리는 컨테이너가 실행 위치와 상태를 제공 해 줍니다.
      이를 위하여 자체 DNS 서버를 가지고 있습니다.
      컨테이너를 생성하면 서비스명과 동일한 도메인을 등록하고 반대로 멈추면 도메인을 제거 합니다.
      Consul, etcd, zookeeper와 같은 외부 서비스를 사용하지 않아도 되고 Swarm이 내부에서 자체적으로 처리해 줍니다.
      OpenStack의 Keystone과 AWS의 IAM과 비교할 수 있습니다.
  • Service
    • 기본적으로 배포 단위 입니다.
      하나의 서비스는 하나의 이미지를 기반으로 생성하고 동일한 컨테이너를 한개 이상 실핼 할 수 있습니다.
      최종적으로 배포 되는 서비스는 여러 개의 Task로 구성 됩니다.
  • Task
    • 컨테이너 배포 단위 입니다. 각각의 Task가 컨테이너를 관리합니다.
      보통 개별 도커 컨테이너를 의미하지만 컨테이너를 실행할 때 명령어도 포함 합니다.
  • manager와 worker간 join을 위한 token 생성
    • manager에서 아래와 같이 명령어 실행

      여기서 docker01은 manager, docker02는 worker

[root@docker01 swarm]# docker swarm init
Swarm initialized: current node (eudk8re3rg8h8gja99tj1c9ll) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-3lbhc8lt1h52jcmkvdr464fnn05zf3t8urecjqy32rn3r7y2ky-ek7abd9537zsx9wfje1acswif \
    192.168.137.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[root@docker01 swarm]#
  • manager와 join을 위해 위에 생성 된 join 명령문을 실행
[root@docker02 ~]# docker swarm join \
>     --token SWMTKN-1-1kvu8z8t5dxx6bile1qvbi1qxm0htp8we89yuiocna077t2d8u-72014ptnje3267comxjrg24cg \
>     192.168.137.2:2377
This node joined a swarm as a worker.
[root@docker02 ~]#
  • Test를 위한 yml파일 생성
version: "3"

networks:
  service-network

#Container 생성
services:
  web:
    image: mousai86/hostname:latest
    ports:
      - "80:80"
      networks:
        - service-network
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: "0.1"
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 2s
        max_attempts: 3

# services.web.deploy.replicas = 생성 할 container 개수 지정
# services.web.deploy.resources.limits.cpus = container의 cpu 사용량 지정
# services.web.deploy.resources.limits.memory = container의 memory 사용량 지정
# services.web.deploy.restart_policy.condition = 종류[none(설정하지 않음), on-failure(실패 시), any(항상)기본값]
# services.web.deploy.restart_policy.delay = 체크할 시간 지정
# services.web.deploy.restart_policy.max_attempts = 시도 할 횟수
  • docker-compose를 이용하여 service 및 node 생성
[root@docker01 swarm]# docker stack deploy -c docker-compose.yml hostname
Creating network hostname_service-network
Creating service hostname_web
[root@docker01 swarm]#
  • docker service가 생성 되었는지 확인
# service 생성 확인
[root@docker01 swarm]# docker stack ls
NAME      SERVICES
hostname  1

# service 정보 확인
[root@docker01 swarm]# docker service ls
ID            NAME          MODE        REPLICAS  IMAGE
a4pk7xq9xetr  hostname_web  replicated  3/3       mousai86/hostname:latest
[root@docker01 swarm]#
  • docker service Name으로 process 확인
[root@docker01 swarm]# docker service ps hostname_web
ID            NAME            IMAGE                     NODE      DESIRED STATE  CURRENT STATE          ERROR  PORTS
w7348rsr1r99  hostname_web.1  mousai86/hostname:latest  kube-m    Running        Running 2 minutes ago
zu686sh6tdeh  hostname_web.2  mousai86/hostname:latest  docker02  Running        Running 2 minutes ago
n427wjv5dgzr  hostname_web.3  mousai86/hostname:latest  kube-m    Running        Running 2 minutes ago
  • docker container 확인
# manager node의 docker container 확인
[root@docker01 swarm]# docker ps
CONTAINER ID        IMAGE                                                                                       COMMAND             CREATED             STATUS              PORTS               NAMES
bfae3ea981e0        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     4 minutes ago       Up 4 minutes        80/tcp              hostname_web.3.n427wjv5dgzryt8sjej888fpr
e7e1216a8689        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     4 minutes ago       Up 4 minutes        80/tcp              hostname_web.1.w7348rsr1r99wyvor0shp0sf3

# worker node의 docker container 확인
[root@docker02 ~]# docker ps
CONTAINER ID        IMAGE                                                                                       COMMAND             CREATED             STATUS              PORTS               NAMES
1c00365ee445        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     5 minutes ago       Up 5 minutes        80/tcp              hostname_web.2.zu686sh6tdehh739tj1f61sfl
  • yml에 설정 한 services.web.deploy.restart_policy 설정이 작동 되는지 확인
# worker container 확인 
[root@docker02 ~]# docker ps
CONTAINER ID        IMAGE                                                                                       COMMAND             CREATED             STATUS              PORTS               NAMES
fb26cd490f29        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              hostname_web.3.jm3sb64rf8nvxu5blkkdwha3y
9f7ce97bba5b        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              hostname_web.2.exynhrbcn7ak65syeq403hyjn
92ca2502741d        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              hostname_web.1.xal4qnkcerenqxxrdj99u63fi

# worker hostname_web.3.jm3sb64rf8nvxu5blkkdwha3y container 종료
[root@docker02 ~]# docker stop hostname_web.3.jm3sb64rf8nvxu5blkkdwha3y
hostname_web.3.jm3sb64rf8nvxu5blkkdwha3y

# worker container 확인 
[root@docker02 ~]# docker ps
CONTAINER ID        IMAGE                                                                                       COMMAND             CREATED             STATUS              PORTS               NAMES
9f7ce97bba5b        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     4 minutes ago       Up 3 minutes        80/tcp              hostname_web.2.exynhrbcn7ak65syeq403hyjn
92ca2502741d        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     4 minutes ago       Up 4 minutes        80/tcp              hostname_web.1.xal4qnkcerenqxxrdj99u63fi

# manager container 확인 - container가 manager에 생성 된 걸 확인 할 수 있다/
[root@docker01 swarm]# docker ps
CONTAINER ID        IMAGE                                                                                       COMMAND             CREATED             STATUS              PORTS               NAMES
2e63329f9dad        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     31 seconds ago      Up 28 seconds       80/tcp              hostname_web.3.mxp0i1tujwehq7fh4p5xku84v

# service의 Running/Shutdown time 확인
[root@docker01 swarm]# docker service ps hostname_web
ID            NAME                IMAGE                     NODE      DESIRED STATE  CURRENT STATE           ERROR                        PORTS
xal4qnkceren  hostname_web.1      mousai86/hostname:latest  docker02  Running        Running 4 minutes ago
w7348rsr1r99   \_ hostname_web.1  mousai86/hostname:latest  kube-m    Shutdown       Failed 7 minutes ago    "task: non-zero exit (137)"
exynhrbcn7ak  hostname_web.2      mousai86/hostname:latest  docker02  Running        Running 4 minutes ago
zu686sh6tdeh   \_ hostname_web.2  mousai86/hostname:latest  docker02  Shutdown       Shutdown 4 minutes ago
mxp0i1tujweh  hostname_web.3      mousai86/hostname:latest  kube-m    Running        Running 44 seconds ago
jm3sb64rf8nv   \_ hostname_web.3  mousai86/hostname:latest  docker02  Shutdown       Failed 47 seconds ago   "task: non-zero exit (137)"
n427wjv5dgzr   \_ hostname_web.3  mousai86/hostname:latest  kube-m    Shutdown       Shutdown 4 minutes ago
[root@docker01 swarm]#
  • docker command로 scale 조절하기
# service의 scale을 1로 설정
[root@docker01 swarm]# docker service scale hostname_web=1
hostname_web scaled to 1

# service의 replicas 확인
[root@docker01 swarm]# docker service ls
ID            NAME          MODE        REPLICAS  IMAGE
a4pk7xq9xetr  hostname_web  replicated  1/1       mousai86/hostname:latest

# manager container 확인
[root@docker01 swarm]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# worker container 확인
[root@docker02 ~]# docker ps
CONTAINER ID        IMAGE                                                                                       COMMAND             CREATED             STATUS              PORTS               NAMES
9f7ce97bba5b        mousai86/hostname@sha256:49cf580ab47e837e710baa3af661941fdf260960756b163972376a65367776c9   "python app.py"     9 minutes ago       Up 8 minutes        80/tcp              hostname_web.2.exynhrbcn7ak65syeq403hyjn

# service의 scale을 5로 설정
[root@docker01 swarm]# docker service scale hostname_web=5
hostname_web scaled to 5

# service의 replicas 확인
[root@docker01 swarm]# docker service ls
ID            NAME          MODE        REPLICAS  IMAGE
a4pk7xq9xetr  hostname_web  replicated  5/5       mousai86/hostname:latest

# service의 status 확인
[root@docker01 swarm]# docker service ps hostname_web
ID            NAME                IMAGE                     NODE      DESIRED STATE  CURRENT STATE            ERROR  PORTS
xv482i7pc0w7  hostname_web.1      mousai86/hostname:latest  kube-m    Running        Running 8 seconds ago
exynhrbcn7ak  hostname_web.2      mousai86/hostname:latest  docker02  Running        Running 11 minutes ago
zu686sh6tdeh   \_ hostname_web.2  mousai86/hostname:latest  docker02  Shutdown       Shutdown 11 minutes ago
mwlb2siq8fgb  hostname_web.3      mousai86/hostname:latest  kube-m    Running        Running 7 seconds ago
shydp8x3qx1j  hostname_web.4      mousai86/hostname:latest  docker02  Running        Running 9 seconds ago
mm4y3i052sf2  hostname_web.5      mousai86/hostname:latest  kube-m    Running        Running 7 seconds ago
  • ETC
# docker service 를 update 시키기
[root@docker01 swarm]# docker service update hostname_web
hostname_web
# docker service 를 강제로 update 시키기
[root@docker01 swarm]# docker service update hostname_web --force
hostname_web

# docker swarm 삭제하기
[root@docker01 swarm]# docker stack rm hostname
Removing service hostname_web
Removing network hostname_service-network

github : https://github.com/suhojang/DockerSwarm