[Docker] Docker swarm

hugingstar·2026년 2월 12일

Docker

목록 보기
17/19
post-thumbnail

컨테이너의 유연성과 확장성을 위해서 Node(Docker host)들에 컨테이너를 유동적으로 나눠서 배포 및 자동화 하는 프로세스

ex) LDAP, Jenkins, Grapana/Prometheus

구조

  • Manager node : Cluster를 관리하고, 스케줄링, API Endpoint 등을 제공

  • Cluster: Node의 집합

  • Worker node : Container에 대한 작업만 실행

  • ssh로 원격 접속하여 작업하기 위해서 각 Node에 설정

# ssh
vi /etc/ssh/sshd_config

# ssh 새로 시작로 시작
systemctl restart sshd

  • 디스크 추가 진행하였다.
  • 아래의 사진은 fstab 설정 과정
fdisk /dev/sdb
mkdir /docker_data
mount /dev/sdb1 /docker_data/
blkid | grep sdb1
vi /etc/fstab
init 6

  • 디스크 생성된 것 확인
df -h

  • 각 노드에 도커 설치 자동화
wget -O install_docker.sh https://raw.githubusercontent.com/Joes-s/docker-daemon/main/install_docker.sh

# 출처
https://github.com/Joes-s/docker-daemon

# 실행 권한 부여
chmod a+x install_docker.sh

# 쉘 파일로 설치
./install_docker.sh
  • daeman 경로 설정
vi /etc/docker/daemon.json

# 추가한 내용
{
        "data-root":"/docker_data"
}

systemctl restart docker

  • toml 파일을 수정해준다.
vi /etc/containerd/config.toml

# 수정한 내용(주석제거후 수정)
root = "/docker_data/containerd"

systemctl restart containerd.service

  • 이 방법은
docker info | grep "Root"

ctr plugins ls

ps aux | grep dockerd

systemctl daemon-reload

  • 경로가 변경이 되었다.

Swarm

  • Swarm 초기화를 한다.
docker swarm init --advertise-addr 10.17.0.150 --default-addr-pool 172.17.0.0/16 --default-addr-pool-mask-length 24

  • 초기화할 때 나온 명령어를 151, 152에서 실행하여 워커를 지정한다.
  • 매니저에서만 docker node ls 명령어를 사용할 수 있다.
docker node ls

  • docker-00 호스트가 Leader 매니저 부분이다.

  • ingress는 노드 밖에서 요청할 때 유연하게 접속할 수 있도록 하는 네트워크이다. 매니저와 워커 모두에서 ingress가 보여야 한다.
# ingress 확인
docker network inspect ingress

# ingress가 안나오는 경우에 다시 네트워크를 만들어본다.
docker swarm leave --force

# 중복이 있는 경우 swarm을 지우고 새로운 대역인 117으로 변경했다.
docker swarm init --advertise-addr 10.17.0.150 --default-addr-pool 172.117.0.0/16 --default-addr-pool-mask-length 24

  • 서비스를 매니저에서 실행해본다. replicas를 2로 설정해서 서비스를 만든다. (시간이 좀 걸린다.)
# nginx 서비스 (컨테이너를 먼저 다운 받아놓고 하면 좀 빠르다.)
docker pull nginx:latest
docker service create --name web-service --replicas 2 -p 80:80 nginx:latest

# 위에 꺼가 안될 때 152, 151번에서 
docker pull nginxdemos/hello

#nginxdemos 서비스 다시 시도()
docker service create --name web-service --replicas 2 -p 80:80 nginxdemos/hello

docker service create --name web-service --replicas 2 -p 80:80 nginx:latest

# 서비스 리스트 조회
docker service ls

# 서비스 inspect
docker swarm inspect web-service

# 컨테이너 돌아가는 것 확인
docker container ps

  • docker-00에서는 drain 해준다. drain을 선언하면, 해당 노드는 새로운 Swarm 서비스 작업이 할당되지 않는다.
docker node update --availability drain docker-00

  • nginxdemos/hello 했을 때 이 화면이 나오면 끝.

  • scale out : 성능이 비슷한 서버를 여러 대 추가하여 부하를 분산하는 방식
  • scale up : 한 대의 서버 성능을 더 좋게 만드는 방식
  • 여기서 scale out으로 4개까지 분산된 것을 받을 수 있도록 만들어준다.
docker service scale web-service=4

  • 모든 것이 셧다운 없이 작동되고 있을 때

  • 152가 셧다운되었을 때 150 매니저에 Down이라고 표기가된다.

  • 151 노드로 자동으로 2개가 할당되어 총 4개가 보인다.

  • scale을 다시 2로 변경하면, 151 노드에서 먼저 할당된 1,2는 그대로 살아있고, 152에서 넘어왔던 3, 4가 소멸된다.
docker service scale web-service=2

  • 151번 노드에 잇는 컨테이너를 강제로 종료해봤다. 그러면 152번에 할당되어서 끊김없이 작동한다.

  • 150번 매니저에서 서비스를 내리면? 151, 152 워커에 있는 컨테이너도 소멸된다.
docker service rm web-service

======================================

  • htttpd 서버를 구축해본다. 버전은 도커허브에서 찾아서 가져오면된다.
docker image pull httpd:2.4
docker service create --name web-server --replicas 3 -p 80:80 httpd:2.4

docker service inspect web-server
  • httpd:2.4로 바뀐 것이 보인다.

  • 최신 버전으로 업데이트 하고 싶을 때는 이름을 확인해서 작업한다.
docker service ls

# 새버전으로 업데이트
docker service update --image httpd:latest web-server

  • 롤백하고 싶을 때, httpd:2.4로 다시 롤백한다.
# 롤백하는 방법
 docker service rollback web-server

docker service inspect web-server

=======================================

Stack

  • Docker Swarm 환경에서 Stack(스택) 은 한마디로 여러 개의 연관된 서비스들을 하나로 묶어서 관리하는 최상위 단위라고 이해하시면 된다.
  • /docker_data/swarm_compose 를 하나 만든다.
# 작업 경로
root@docker-00:/docker_data/swarm_compose#

vi docker-compose.yaml

# 작성한 내용
version: '3.8'

services:
  web-service:
    image: nginx:latest
    ports:
      - "80:80"
    deploy:
      replicas: 3
      
# 151, 152
docker pull nginx:latest

# Stack 선언
docker stack deploy -c docker-compose.yaml stack01

# Stack 조회
docker stack ps stack01

# Stack 삭제
docker stack rm stack01

  • 3개 컨테이너를 모두 봤을 때 1개, 2개로 분산되어있다.

  • 자동으로 재시작 되도록 yml을 적용한다.
# 재시작
vi restart_test.yaml

# 작성한 내용
version: '3.8'

services:
  test:
    image: alpine
    command: sh -c "sleep 5 && exit 1"
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
        delay: 3s
        max_attempts: 5
        window: 120s
 
 # Stack 조회
 docker stack ls
 
 # Stack 생성
docker stack deploy -c restart_test.yaml test

# 151, 152 이미지가 있어야함
docker image pull alpine:3.23.3

# 실시간 상태 조회
watch -n 1 docker stack ps test

0개의 댓글