본문 바로가기
Docker

Docker Swarm & Monitoring & Podman

by 손영진 2023. 8. 6.
728x90

#1 Docker Swarm

  • Docker가 공식적으로 만든 Orchestration Tools
    • 여러 호스트 서버의 컨테이너들을 배포 및 관리하기 위한 툴
  • 쿠버네티스를 대신할 도커에서 만든 컨테이너 관리 툴
  • 1000개 노드에 약 5만개 컨테이너도 문제없이 테스트하여 안정성 검증
  • Orchestartion 기능
    • 컨테이너 자동 배치 및 복제
    • 컨테이너 그룹에 대한 로드밸런싱
    • 장애 복구, 클러스터 외부에 서비스 노출
    • 컨테이너 추가 또는 제거 이용한 확장 및 축소
  • Docker Swarm 의 장점
    • 여러 Docker 호스트와 함께 클러스터링하여 단일 가상 Docker
  • Swarm의 Manager Node 구성
    • 3개의 Manager Swarm은 최대 1개 Manager Node 손실에 대해서 허용 가능
      • 5개는 최대 2개 손실에 대해서 허용 가능
      • n개는 최대 (n-1)/2
    • Docker는 최대 7개의 Node 구성 권장

   1. Docker swarm 생성 ( Manager )

<servera>

docker swarm init –-advertise-addr=[servera의 사설IP]
<위 명령어에 대한 결과 값>
>To add a worker to this swarm, run the following command:

>docker swarm join --token 
>SWMTKN-1-04zlprqzkv5rmljfaeg07p7b743uzeponr133s425rdzfo5ou7-bruutge3touud4l0w9l9a4vxo 
>[servera의 사설IP]:2377

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

 

   2. Docker Swarm 생성( Worker )

  • docker의 명령어를 각 노드에서 실행 시 swarm 상태로 설정된다.
    • 차후 swarm 상태를 종료하고 싶을 시 정지시키는 명령어 작성
      • docker swarm leave
<serverb> & <serverc>

docker swarm join --token 
SWMTKN-1-04zlprqzkv5rmljfaeg07p7b743uzeponr133s425rdzfo5ou7-bruutge3touud4l0w9l9a4vxo 
[servera의 사설IP]:2377		// servera에서 swarm 생성 시 생기는 결과값의 docker 명령문

<servera>

docker node ls		// 생성한 노드 확인

 

   3. Swarm 서비스 사용

<servera>

vim Dockerfile
<더보기 참조>
docker build -t web_server:latest		// Image 생성
docker service create --name web_swarm \
> --replicas=3 -p 80:80 web_server:latest
			// replicas를 통해 같은 container를 3개 만든다.
            // 이를 통해 Swarm의 로드밸런서 역할을 확인할 수 있다.
docker service ps web_swarm
<그림>

curl serverb.example.com
curl serverc.example.com
			//생성한 container들 확인
  • vim Dockerfile
더보기

FROM centos:7

MAINTAINER servera <admin@example.com>

RUN yum -y install httpd

RUN echo "Docker node: servera.example.com" > /var/www/html/index.html

EXPOSE 80

CMD ["-D", "FOREGROUND"]

ENTRYPOINT ["/usr/sbin/httpd"]

그림

 

   4. 서비스 복제(Scale)

<servera>

docker service scale web_swarm=3
			// scale은 복제라는 뜻으로 web_swarm을 3개로 늘린다
docker service ps web_swarm

 

   5. Rolling Update & Rollback

<servera>

docker service create -p 80:80 --name nginx:latest		// Image 생성
docker service inspect nginx --pretty | grep Image
			// 생성한 Image( nginx )의 버전 확인
docker service update --image nginx:1.14.2 nginx
			// nginx Image의 버전을 1.14.2로 변경
docker service inspect nginx --pretty | grep Image
			// Image의 변경된 버전 확인

docker service ps nginx
			// 생성된 nginx의 container를 확인하는 명령어로 state를 확인하면 
            // 전에 만든 버전이 shutdown 현재 버전이 running인 것을 확인 할 수 있다.
            
docker service rollback nginx
			// nginx를 update 전의 버전으로 되돌린다.

 

   6. 네트워크 및 서비스 생성 ( Overlay )

<servera>

docker network ls		// 현 네트워크를 확인
docker network create --driver=overlay overnet
			// driver를 overlay로 하는 overnet 이름을 가진 network 생성
            
docker network inspect overnet		//생성한 network의 IP들을 확인

docker service create --name webserver --replicas=3 -p 80:80 --network=overnet web_sebserver:latest
			// container 생성

docker service ps webserver		// 같은 이름을 가진 3개의 container를 만들었을 시 각 node로 할당 된 것 확인

 

   7. Swarm container 간 통신확인

<servera>

docker ps		// servera에 생성된 container의 ID 확인

docker exec -it [container ID] /bin/bash		// container에 접속
> yum install net-tools iproute -y		// 해당 container의 ip 확인을 위한 tool 설치
> ip a		// container의 ip 확인

<serverb>

docker exec -it [container ID] /bin/bash
> yum install net-tools iproute -y
> ip a
> ping -c [servera의 container IP]

 

#2 Docker Applications - Wordpress

  • MariaDB container 를 먼저 생성 한 후, Wordpress를 생성
<servera>

openssl rand -base64 20 | docker secret create root_db_password -
openssl rand -base64 20 | docker secret create wp_db_password -
			// db 사용자의 암호 생성
docker network create -d overlay wp

docker service create --name mariadb \		// maraidb의 container 생성
> --replicas 1 --network wp --constraint=node.role==manager \
> --secret source=root_db_password,target=root_db_password \
> --secret source=wp_db_password,target=wp_db_password \
> -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/root_db_password \
> -e MYSQL_PASSWORD_FILE=/run/secrets/wp_db_password \
> -e MYSQL_USER=wp -e MYSQL_DATABASE=wp mariadb:10.1

 docker service create --name wp \		// wordpress의 container 생성
> --constraint=node.role==worker --replicas 1 \
> --secret source=wp_db_password,target=wp_db_password,mode=0400 \
> --publish 80:80 --network wp \
> -e WORDPRESS_DB_USER=wp \
> -e WORDPRESS_DB_PASSWORD_FILE=/run/secrets/wp_db_password \
> -e WORDPRESS_DB_HOST=mariadb \
> -e WORDPRESS_DB_NAME=wp wordpress:4.7

docker service ps // 생성한 wordpress의 node의 위치 확인 후 웹브라우저 검색하여 wordpress 확인

ex) http://serverb.example.com

 

#3 Docker Monitoring

  • Swarm 해제 후 진행 ( Manager : docker swarm leave --force )
  • Cadvisor -> node-exporter -> Prometheus -> Grafana 순으로 진행
    • servera : Prometheus, Grafana
    • serverb & serverc : Cadvisor, node-exporter

Monitoring 과정

   1. Cadvisor 설정 (serverb, serverc)

  • docker 호스트에 container로서 실행되는 모니터링 툴
  • docker 엔진 및 container, Image 등에 대한 데이터 수집
  • ... / metrics endpoint로 데이터 수집
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw \
> --volume=/sys:/sys:ro --volume=/var/lib/docker:/var/lib/docker:ro \
> --volume=/dev/disk:/dev/disk:ro \
> -p 8080:8080 --detach=true \
> --name=cadvisor gcr.io/cadvisor/cadvisor:v0.27.4

docker ps		// container 생성 확인

serverb or servercIP:8080

   2. node-exporter 설정 (serverb, serverc)

  • node-exporter 설정은 터미널이 종료되지 않으므로 다른 터미널을 활용하여 실행
  • 해당 노드, 즉 호스트 자체 모니터링하기 위한 툴
  • 이 또한 / metrics endpoint로 데이터 수집
docker run --name node-exporter –p 9100:9100 \
> --restart=unless-stopped prom/node-exporter:v0.14.0

 

   3. Prometheus 설정 (servera)

  • 데이터 수집하는 중간 매개체 역할
  • 여러 곳으로부터 데이터 받아 수집 가능, 이를 분석할 수 있는 쿼리 제공
vim prometheus-cadvisor.yml
{
scrape_configs:
	- job_name: 'prometheus'
		static_configs:
		- targets: ['localhost:9090']
	- job_name: cadvisor
		scrape_interval: 5s
		static_configs:
		- targets: ['[serverb사설ip]:8080','[serverc사설ip]:8080']
	- job_name: 'node-exporter'
		scrape_interval: 5s
		static_configs:
		- targets: ['[serverb사설ip]:9100','[serverc사설ip]:9100']
}	// .yml 내에 작성

docker run -d --name prometheus \
> -h prometheus –p 9090:9090 \
> -v $(pwd)/prometheus-cadvisor.yml:/etc/prometheus/prometheus.yml \
> prom/prometheus:v1.7.0
			/ 포트번호 9090을 가지는 container 생성

Prometheus : 213.0.113.3:9090

 

   4. Grafana 설정 (servera)

  • 데이터 시각화해주는 매우 편리한 툴
  • 웹 브라우저 기반

 

docker run -d --name grafana -h grafana \
> -e GF_SECURITY_ADMIN_PASSWORD=admin \
> -p 3000:3000 --link prometheus:prometheus grafana/grafana:4.4.3
			// 중간에 비밀번호 설정에 유의






893은 Prometheus를 나타내는 대시보드 숫자이다.
-> 좌측상단 dashboard에서 import를 클릭하여 진행

 

#4 Podman (VM)

  • Docker와 다르게 커널에 직접 이미지 올라가고 위에 container 동작
  • 컨테이너 독립적 실행 가능, 시스템 데몬 등록 통해 컨테이너별 실행/중단 가능
  • 개별적 container 운영 가능, 엔진에 영향을 받지 않음
  • 패키지 관리자를 통해 바로 설치 가능
  • Dockerfile 작성 통해 직접 실행 가능
<root@master ~>

dnf remove docker-ce -y		// podman 사용을 위해 docker 삭제
dnf install podman -y
podman version

vim /etc/containers/registries.conf
> unqualified-search-registrties = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]
			// 위와 같이 수정하여 허용 및 등록
podman info		// 수정사항 확인

podman pull httpd
podman run -d --name httpd -p 8080:80 docker.io/library/httpd		// 경로에 유의
curl localhost:8080

echo 'Index test' > index.html
podman cp indes.html httpd://usr/local/apache2/htdocs/		// 경로에 유의
curl localhost:8080

podman rm -f httpd
podman rmi -f docker.io/library/httpd		// image 삭제시 경로에 유의

 

   1. nginx 서비스 생성 및 시작, 종료

podman generate systemd nginx > /etc/systemd/system/nginx.service		//경로 유의
systemctl enable --now nginx

systemctl stop nginx
podman container ls -a

podman container start nginx

'Docker' 카테고리의 다른 글

Docker 최종 연습  (1) 2023.08.06
Docker Network  (0) 2023.08.03
Docker Registry  (0) 2023.08.02
다양한 Container 생성  (0) 2023.08.01
Docker의 기본개념  (1) 2023.07.31