Run The Bridge

docker 5일차 본문

Cloud/docker

docker 5일차

anfrhrl5555 2021. 7. 23. 17:16
728x90
반응형

0. 도커 스웜

  • 하나의 도커 호스트를 사용하다가 CPU나 메모리, 디스크과 같은 자원이 부족하면?
  • 하나의 도커 호스트가 문제가 발생하여 서비스를 할 수 없다면?
  • 이러한 문제를 방지하기 위해 호스트를 병렬로 증설하여 클러스터로 구성
  • 서버 여러 대를 하나의 자원 풀로 만들어 관리
  • 컨테이너가 추가됐을 때 자동으로 발견(Service Discovery)
  • 어떤 서버에 컨테이너를 할당할지
  • 클러스터 내 서버가 다운됐을 때 고가용성(HA: High Availability)

 

스웜 클래식

  • 도커 1.6 이후부터 사용 가능
  • 여러 대의 도커 서버를 하나의 지점에서 사용하도록 단일 접근점 제공하는 것에 초점
  • 분산 코디네이터, 에이전트 등이 별도로 구동

0스웜 모드

  • 도커 1.12 이후부터 사용 가능
  • 마이크로서비스 아키텍처의 컨테이너를 다루기 위한 클러스터링 기능에 초점
  • 분산 코디네이터, 에이전트 등이 도커 엔진에 내장
  • 대규모 클러스터 구성에 유리

 

매니저 노드

  •  - 워커 노드를 관리
  •  - 컨테이너가 생성될 수도 있다.
  •  - 1대 이상 구성
  •  - 다중화 할 경우 홀수 개로 구성 권장 - 매니저 노드의 수로 장애를 판단하는 알고리즘을 가지고 있기 때문에 장애 판단이 수월하게 하는 것

워커 노드

  •  - 컨테이너가 생성되는 노드(매니저 노드에 의해 관리 받음)
  •  - 워커 노드는 없을 수 있다.(매니저 노드만으로 구성 가능하지만 비권장)

 

VM 세 대 준비

 - swarm-manager

 - swarm-worker1

 - swarm-worker2

 

다음 명령어를 3개의 노드에서 모두 실행한다.

# systemctl stop firewalld
# systemctl disable firewalld
# yum install -y net-tools
# yum install -y telnet
# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install -y docker-ce-20.10.5 docker-ce-cli-20.10.5 docker-ce-rootless-extras-20.10.5

# systemctl start docker
# systemctl enable docker

* swarm-manager
docker swarm init --advertise-addr 192.168.100.151

* swarm-worker
docker swarm join –token…

docker swarm join --token SWMTKN-1-5dshj69obly8v0uoz8671cgoh8mxxu4yewluk1atfr9frbitsz-3ljowr08w8nk1mzv9c8hb12mv 192.168.100.150:2377

token 확인방법
# docker swarm join-token manager

 

# docker node ls

클러스터: 따로 구성된 서버, node들을 똑같이 사용한다. 하나의 클러스터로 구성한다. 하나의 동일한 서비스를 해준다

 

(실습) 첫 번째 서비스 생성해보기

# docker service create ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
# docker service ls
# docker service ps <service name>
# docker service rm <service name>

 

스웜 모드 서비스 개념

  • 서비스(Service)
  • 같은 이미지에서 생성된 컨테이너의 집합 (컨테이너 1개 이상)
  • 서비스 내의 컨테이너들은 태스크(Task)라고 한다
  • 도커에서는 컨테이너가 제어 단위이지만, 스웜 모드에서는 서비스가 제어 단위
  • 서비스를 제어하면 서비스 내의 컨테이너에 같은 명령이 수행
  • 롤링 업데이트(Rolling Update) 제공하여 지속적인 서비스가 가능하게 한다

 

레플리카

  • 스웜 클러스터 내에서 항상 존재해야 하는 '정상 상태의 최소 태스크 수'
  • 태스크에 장애가 발생하여 사용할 수 없다고 판단하면 태스크를 새로 생성하여 유지

 

(실습) nginx 웹 서버 서비스 생성하기

# docker service create --name myweb --replicas 2 -p 80:80 nginx
# docker service ps myweb
# docker service scale myweb=4

 

Global 서비스 생성하기

  • replicated 모드 - 기본값으로 레플리카셋의 수만큼 컨테이너를 생성하는 복제 모드
  • global 모드 - 스웜 클러스터를 구성하는 모든 노드에 컨테이너를 하나씩 생성
# docker service create --name global_web --mode global -p 80:80 nginx
# docker service ps global_web

 

각 개별로 컨테이너에 접속하고 싶으면, 특정 컨테이너가 생성된 노드로 이동해야 한다. (쿠버네티스쪽 통합가능)

 

(실습1) 컨테이너를 강제로 삭제하기

docker service create --name myweb --replicas 2 -p 80:80 nginx
docker rm -f myweb.2.whqmrp8on0j8007xonqtaulkh

한 개의 컨테이너를 rm으로 삭제해도 바로 올라온다 ==  'myweb.2'

# watch docker service ps [이름]  # Shutdown과 Running을 눈으로 확인할 수 있다.

 

(실습2) 노드 장애 발생

VM을 power off 시켜도되고, docker를 stop해도 된다.

# systemctl status docker
# systemctl stop docker

worker01에서 shutdown되면 02에서 바로 Running이 된다.

 

(실습3) nginx 이미지 버전 변경 - 실습 전 그전에 사용한 service는 모두 삭제한다.

# docker service create --name myweb2 --replicas 3nginx:1.10
# docker service update --image nginx:1.11 myweb2
# docker service ps myweb2

 

(실습4) 롤백

# docker service rollback myweb

 

서비스 컨테이너에 설정 정보 전달하기: config, secret

  • 도커 이미지가 생성된 후에는 내부 설정값 변경이 쉽지 않다(확장성↓, 유연성↓)
  • 볼륨이나 환경변수를 통해 내부 설정값을 변경할 수는 있지만 설정 파일은 모든 노드에 두기는 비효율적이고 패스워드 같은 정보를 환경변수로 전달하면 보안이 취약

config

 암호화할 필요 없는 데이터를 전달

secret

 비밀번호나 SSH, 인증서 키와 같이 보안에 민감한 데이터를 전달

 secret은 매니저 노드 간에 암호화된 상태로 저장

 컨테이너에 배포된 뒤에는 파일 시스템이 아니라 메모리에 저장

 

 

(실습4) secret 사용하기

# echo 1q2w3e4r | docker secret create my_mysql_password -
# docker secret inspect my_mysql_password

# docker service create --name mysql --replicas 1 --secret source=my_mysql_password,target=mysql_root_password --secret source=my_mysql_password,target=mysql_password -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" mysql:5.7

※ mysql 같은 DB를 올릴 땐, replicas를 '1'로 꼭 줘야한다.

 

(실습5) - config 사용하기

# docker config create registry-config config.yml  # base64로 data를 암호화한다(?)
# docker config ls
# docker config inspect registry-config

docker service create --name yml_registry -p 5000:5000 --config source=registry-config,target=/etc/docker/registry/config.yml registry:2.6

 

도커 스웜 네트워크

스웜 모드는 여러 개의 도커 엔진에 같은 컨테이너를 분산하기 때문에 각 도커 데몬의 네트워크를 묶어서 관리해야 한다 -> 네트워크 풀(network pool)

서비스를 외부로 노출할 때 어떤 노드로 접근하더라도 해당 서비스의 컨테이너에 접근 가능해야 한다 -> 라우팅

 

ingress 네트워크

어떤 노드를 통해서라도 서비스 내의 컨테이너에 접근 가능하도록 라우팅(RR)

 

(실습6) - ingress 네트워크

docker service create --name hostname -p 80:80 --replicas=4 alicek106/book:hostname

 

image를 찾을 수 없으면 각 node마다 이동해서 다음 명령을 추가한다.

docker pull alicek106/book:hostname

 

 

(실습7) - ingress 대신 host 네트워크 사용

docker service create --publish mode=host,target=80,published=8080,protocol=tcp --name myweb nginx
docker service ps [이름]  # 어느 node에 떠있는지 바로 파악가능
docker network ls  # ingree network가 새로 생긴다.

 

서비스 디스커버리

새로운 컨테이너를 발견… (없어진 컨테이너를 감지)

docker network create -d overlay discovery  # -d 옵션으로 overlay network 임을 명시

docker service create --name server --replicas 2 --network discovery alicek106/book:hostname

docker service create --name client --network discovery alicek106/book:curl ping docker.com

curl -s server        -> client 서비스에서 server 서비스 호출

docker service scale server=3             -> scale out 후 다시 호출

swarm network 확인
server 설치
client 설치
docker exec -it [Container ID] bash
server을 1대 추가 후 호출

 

(실습7) 서비스명에 매핑된 VIP 확인

docker service inspect --format {{.Endpoint.VirtualIPs}} server  # 컨테이너 대표 IP

하지만 대표 IP는 바뀔 수 있다. 그래서 Domain 이름을 사용한다.

 

스웜 모드 볼륨

스웜 모드에서는 서비스를 생성할 때 도커 볼륨을 사용할지 호스트 디렉토리를 사용할지 명시

 

도커 볼륨 사용( --mount type=volume)

# volume 타입의 볼륨 생성(source 명시), Container Up 유지를 위해 ping을 쏜다
docker service create --name ubuntu --mount type=volume,source=myvol,target=/root ubuntu:14.04 ping docker.com

# volume 타입의 볼륨 생성
docker service create --name ubuntu --mount type=volume,target=/root ubuntu:14.04 ping docker.com


# 컨테이너 내부 마운트 포인트에 파일이 존재할 때, docker run과는 달리 컨테이너 내부 파일이 호스트로 복사 된다. 이를 방지하기 위해 volume-nocopy 옵션 사용
docker service create --name ubuntu --mount type=volume,source=test,target=/root,volume-nocopy ubuntu:14.04 ping docker.com

 

manager에서 volume 생성
worker에서 myvol 확인
source가 없는 볼륨 생성

/var/lib/docker/volumes/myvol/_data  # 볼륨 위치 directory

 

호스트 디렉토리 사용(--mount type=bind)

# bind 타입의 볼륨 생성
docker service create --name ubuntu --mount type=bind,source=/root/host,target=/root/container ubuntu:14.04 ping docker.com

 

스웜 모드 볼륨의 한계점

  •  모든 노드가 볼륨 데이터를 가지고 있어야 하는데 도커 볼륨이나 호스트 디렉토리는 부적합
  •  퍼시스턴트 스토리지를 별도로 구성해야 한다(nfs, dfs 등)

728x90
반응형

'Cloud > docker' 카테고리의 다른 글

docker 6일차  (0) 2021.07.27
config을 사용해서 mysql port 변경하기  (0) 2021.07.26
dockerfile을 이용하여 DB와 python 연동하기  (0) 2021.07.23
docker 4일차  (0) 2021.07.22
docker 3일차  (0) 2021.07.21
Comments