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 구성 권장
- 3개의 Manager Swarm은 최대 1개 Manager 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
- 차후 swarm 상태를 종료하고 싶을 시 정지시키는 명령어 작성
<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 확인
#3 Docker Monitoring
- Swarm 해제 후 진행 ( Manager : docker swarm leave --force )
- Cadvisor -> node-exporter -> Prometheus -> Grafana 순으로 진행
- servera : Prometheus, Grafana
- serverb & serverc : Cadvisor, node-exporter
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 생성 확인
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 생성
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 |