본문 바로가기
AWS Cloud School 8기/도커(docker)

Docker Swarm

by YUNZEE 2025. 4. 1.
728x90

✅ docker - 단일 호스트, 단일 컨테이너

✅ docker compose - 단일 호스트, 여러 종류의 컨테이너를 한꺼번에 관리하는 도구

✅ docker swarm - 다수의 호스트(manger, worker) 여러 대의 서버에서 도커를 묶어서, 진짜 클러스터처럼 컨테이너를 관리하는 기능

 

- 컨테이너 오케스트레이션 툴(k8s도 컨테이너오케스트레이션 툴)

* 오케스트레이션? - 지휘자 + 다수의 연주자를 떠올리면 좋다.

- 여러 개의 컨테이너를 관리하는 기술(스케일링, 헬스체크, 트래픽제어=배포

다른  host에 있으면 통신이 불가능함, 그럼 당연히 같은 host에 있는 컨테이너끼리 통신이 가능함

overlay network(= switch)를 활용하면 다른 대역에 있는 host끼리 통신이 가능함

 

실습

더보기

ubun-tem을 3개 복제해서 각각 호스트네임, IP를 아래와 같이 구성

manager - 211.183.3.210/24

worker1 - 211.183.3.220/24

worker2 - 211.183.3.230/24

 

curl -fsSL https://get.docker.com -o get-docker.sh

 

manager 구성

- control plane

- init: 클러스터 초기화

- 얘는 포트를 211.183.3.210:2377을 사용하고 있음

 

worker node 구성

- data plane

- 각 워커 노드들을 클러스터에 편입(빨간 상자 안에 있는 내용을)

 

- 위에 내용을 복붙해서  worker에 넣어줌

- 다른 호스트들도 잘 연결된 걸 확인할 수 있음

docker service

- 한가지 종류의 컨테이너를 여러 개 생성, docker run으로 컨테이너를 생성하는 것과 비슷함

더보기

root@manager:~# docker service create --replicas 2 -p 7979:80 --name myweb oolralra/ipnginx

 --replicas 2: 컨테이너 개수

- REPLICAS가 2/2인 이유는?

root@manager:~# docker network inspect ingress

- 다른 호스트에 있는 애들이 잘 연결된 걸 확인할 수 있음

- 각 노드의 포트들은 오버레이네트워크로 들어가기 위한 문 역할을 수행함

- ex) 4,5,6 강의실의 내부 칸막이를 없애서 하나의 공간으로 만들면, 3개의 문 어디로 들어가도 동일한 공간이 나온다고 생각하면 좋음

- 컨테이너 수를 증가시켰을 때

- 도커 분산해서 나눠줌

docker stack deploy

- docker compose up과 비슷, 컴포즈 파일이 필요함

- 기존의 컴포즈파일에 추가된 내용이 존재(노드배치, 컨테이너 수)

더보기

root@manager:~# vi docker-compose.yml

services:

  ip-nginx:

    image: oolralra/ipnginx

    deploy:

      replicas: 2

      placement:

        constraints: [node.role != manager]

# stack 생성

- 네트워크를 따로 명시해주지 않았기 때문에 얘네가 따로 만들어줌

- 매니저는 안 뜬 걸 볼 수 있음

- 정말 매니저는 안 생길까? 수정해서 시험해 보자

root@manager:~# docker stack deploy -c docker-compsoe.yml ip-stack

root@manager:~# docker stack ps ip-stack

- worker만 여러 개 생긴 걸 확인할 수 있음

 - 하나의 집에 문이 여러 개 생겼다는 의미임

 

root@manager:~# docker stack rm ip-stack

# stack 삭제

 

root@manager:~# vi visual.yml

# 호스트에 띄워진 컨테이너를 시각화하는 앱.

services:

  visual:

    image: dockersamples/visualizer

    ports:

    - '5656:8080'

    volumes:

    - /var/run/docker.sock:/var/run/docker.sock

    deploy:

      placement: 

        constraints: [node.role == manager]

root@manager:~# docker stack deploy -c visual.yml visual

# visual이라는 이름으로 배포

오류 /해결방안

 - 웹페이지에 잘 띄워지지 않음 그래서 확인해 보니까 이미지가 없다고 함

root@manager:~# docker stack ps visual

 

실습-1) ECR 퍼블릭 갤러리의 이미지로 wordpress - mysql8을 docker stack deploy 해보세요. 단, DB는 manager에 한 개 만만, workdrepss는 worker노드에 2개 띄워보세요. 12345 포트로 접속 가능하게 만드세요!

https://gallery.ecr.aws/

# ecr 퍼블릭 갤러리

더보기

1. 이미지선택

# 사용법(환경변수 구성) 동일.

 

public.ecr.aws/docker/library/wordpress:php8.1-apache

# 우리가 사용할 이미지

 

root@manager:~# vi wordpress.yml

services:
  mywp:
    image: public.ecr.aws/docker/library/wordpress:php8.1-apache
    ports: 
    - '12345:80'
    deploy:
      replicas: 2
      placement:
        constraints: [node.role == worker]
    environment:
      WORDPRESS_DB_HOST: dbdb
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: '1234'
      WORDPRESS_DB_NAME: wpdb
    depends_on:
    - dbdb

  dbdb:
    image: public.ecr.aws/docker/library/mysql:8
    deploy:
      placement:
        constraints: [node.role == manager]
    environment:
    - MYSQL_ROOT_PASSWORD=1234
    - MYSQL_USER=wpuser
    - MYSQL_PASSWORD=1234
    - MYSQL_DATABASE=wpdb

 

 

public.ecr.aws/docker/library/mysql:8

# 사용할 mysql 이미지

 

root@manager:~# docker stack deploy -c wordpress.yml wp

# 배포

실습-2) 저 사설 저장소에서 visualizer를 가져와서 아래 visual.yml을 배포해 보세요!

 

더보기

저 사설 저장소에서 visualizer를 가져와서 아래 visual.yml을 배포해 보세요!

 

root@manager:~# vi visual.yml

# 호스트에 띄워진 컨테이너를 시각화하는 

root@manager:~# docker stack deploy -c visual.yml visual

# visual이라는 이름으로 배포

 

root@manager:~# vi /etc/docker/daemon.json

# docker의 설정에서 http로 사설저장소를 사용할 수 있도록 변경

 

root@manager:~# systemctl restart docker

root@manager:~# docker stack deploy -c visual.yml visual

📌Docker-in-Docker (DIND)

 

 

- Docker를 컨테이너 내에서 실행하는 방법임. 즉, Docker  컨테이너 내부에 Docker데몬을 실행하고, 그 내부에서 Docker 명령어를 사용할 수 있게 하는 방식임

 

Docker데몬: Docker의 핵심 프로세스로, 컨테이너 실행, 이미지 관리, 네트워크 설정 등 Docker의 모든 작업을 관리하고 처리하는 역할을 말함. Docker데몬은 백 그라운드에서 실행되며, Docker클라이언트와 서버 간의 중재자 역할을 함.

 

✅사용 사례

- CI/CD 파이프라인: Docker 이미지 빌드 및 배포를 할 때, 빌드 컨테이너 내에서  Docker를 사용할 수 있음

- 테스트 및 격리: 테스트 환경을 격리하고, 다양한 Docker 명령어를 컨테이너 내부에서 실행할 수 있음

- 컨테이너 기반의 개발 환경: Docker를 활용한 개발 환경에서 다른 Docker 컨테이너를 관리하고 실행하는 경우에 유용

 

실습-3)

https://github.com/pcmin929/mon

이라는 레포지토리에 간단한 텔레그래프 설정파일과 그라파나 대시보드 파일이 있습니다.

 

그라파나이미지 grafana/grafana를

제 사설저장소 61.254.18.30:5000/grafana로 올리겠습니다.

 

텔레그래프이미지 telegraf:1.3을

제 사설저장소 61.254.18.30:5000/telegraf:1.3로 올리겠습니다.

 

텔레그래프이미지 influxdb:1.2를

제 사설저장소 61.254.18.30:5000/influxdb:1.2로 올리겠습니다.

 

텔레그래프 설정파일은 /etc/telegraf/telegraf.conf

에 위치해야 합니다.

 

또한, 텔레그래프 설정파일을 보면 아시겠지만 vm_metrics와 docker_metrics라는 두 개의 데이터베이스에 수집된 자료를 저장시킨다.

 

위 내용을 토대로 docker stack deploy를 해서 grafana를 통해 각 docker swarm 호스트 및 컨테이너의 정보를 시각화해 보세요.

 

그라파나 대시보드는 dashboard.json의 내용을 복붙 해서 넣으시면 됩니다.

stack 파일을 구성하여 deploy 한번 해보세요.

 

stack 파일을 구성하여 deploy 한번 해보세요

 

# 이런 화면이 뜨면 됩니다

더보기

1. 컨테이너 배치

https://docs.docker.com/compose/compose-file/deploy/

- global 옵션을 통해 각 노드당 telegraf 컨테이너를 한 개씩 띄우면 좋을 것 같음.

 

2. 이미지 pulling

- 만약에 워커노드에 컨테이너가 띄워진다면, 컨테이너를 띄우기 위해 이미지를 가져오는 주체는 각 워커노드들 이므로 워커노드들 전부 사설저장소에 대한 insecure 설정이 되어있어야 한다.

 

3. volume 구성.

- 컨테이너를 호스트에 마운트 하면 해당 컨테이너가 띄워지는 호스트에 마운트가 된다. manager노드에 파일이 존재해도, 워커노드에 컨테이너가 띄워진다면 manager노드에 있는 파일에 접근 불가능하다. 따라서 워커노드에도 파일을 복사하거나 접근가능하게 마운트를 걸거나 다른 옵션이 있다면 그걸 선택해야 한다.

 

https://docs.docker.com/reference/compose-file

# compose 옵션들 공식문서.

 

https://docs.docker.com/reference/compose-file/configs/

# configs 옵션

root@manager:~# docker tag grafana/grafana 61.254.18.30:5000/grafana Error response from daemon: No such image: grafana/grafana:latest

-> grafana deamon이 없기 때문에 docker pull을 해줘야 됨.

 

하기 전에 파일 수정해 주기

root@manager:~/mon# vi telegraf.conf 

root@worker1:~# vi /etc/docker/daemon.json

- 이 아이피 대역을 넣어줘야 됨

root@worker1:~# systemctl restart docker

-manager이랑 worker1,2다 적용해 줌

 

root@manager:~# docker pull grafana/grafana:latest

root@manager:~# docker tag grafana/grafana 61.254.18.30:5000/grafana

root@manager:~# docker push 61.254.18.30:5000/grafana

 

root@manager:~# docker pull telegraf:1.3 root@manager:~# docker tag telegraf:1.3 61.254.18.30:5000/telegraf:1.3
root@manager:~# docker push 61.254.18.30:5000/telegraf:1.3

 

root@manager:~# docker pull influxdb:1.2

root@manager:~# docker tag influxdb:1.2 61.254.18.30:5000/influxdb:1.2
root@manager:~# docker push 61.254.18.30:5000/influxdb:1.2

 

root@manager:~/mon# vi mon.yml

      # global = 각노드에 딱 한개씩띄우겠다.
services:
  influxdb:
  #telegraf.conf에서 명시한 이름에 맞게 서비스이름 구성
    image: 61.254.18.30:5000/influxdb:1.2
    deploy:
      placement:
        constraints: [node.role == manager]

  telegraf:
    image: 61.254.18.30:5000/telegraf:1.3
    volumes:
    - '/var/run/docker.sock:/var/run/docker.sock'
    deploy:
      mode: global
      # global = 각노드에 딱 한개씩띄우겠다.
    depends_on:
    - influxdb

  grafana:
    image: 61.254.18.30:5000/grafana
    ports:
    - '3000:3000'
    deploy:
      placement:
        constraints: [node.role == manager]

# 일단 global을 했으면 telegraf.conf 파일이 모든 노드에 존재
# 혹은 config 설정을 해주어야 한다.
configs:
  telegraf-config:
    file: ./telegraf.conf

root@manager:~/mon# docker stack deploy -c mon.yml mon

 

728x90