
Round-Robin, RRLeast ConnectionsIP hashgeneral hashLeast TimeRandom| 연결 알고리즘 | 설명 |
|---|---|
| weight | 가중치 설정을 통해 서버 간 요청 분배(기본값=1) |
| max_conns, queue | 최대 클라이언트 연결 수 지정과 대기열 생성 |
| max_fails | 최대 실패 횟수 지정을 통해 임계치 도달 시 해당 서버를 분배 대상에서 제외 |
| fail_timeout | 응답 최소 시간 지정으로 실패 횟수를 카운트함. 보통 max_fails 와 함께 사용함 |
| backup | backup 키워드가 있는 서버는 평소에 동작하지 않고, 모든 서버가 동작하지 않을 떄 사용 |
| down | down 키워드가 있는 서버는 사용하지 않음. ip_hash인 경우만 사용 |
nginx 컨테이너가 로드밸런서 역할
MYSQL_ROOT__PASSWORD 변수값이 반드시 필요한데 이럴 땐 배포용 Compose 파일에서 services.<서비스명>.environment 부분에 해당 내용을 변수명: 값 또는 - 변수명=값 형태로 넣어주면 됨# MySQL 8 이미지에 MYSQL_ROOT_PASSWORD 환경 변수값을 password로 지정하여 둔
Compose 파일
services:
mysql:
image: mysql:8
restart: unless-stopped
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: password
# 쉘 환경 변수 설정
export MYSQL_ROOT_PASSWORD=password
# MySQL 8 이미지에 MYSQL_ROOT_PASSWORD 환경 변수값을 password로 지정하여 둔 Compose 파일
services:
mysql:
image: mysql:8
restart: unless-stopped
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
# 실제 내용 확인
docker-compose convert
배포용 Compose 파일에 환경 변수를 하나하나 다 적어넣거나 매번 쉘에서 변수로 직접 선언하는 방법은 다소 비효율적
필요한 환경 변수 항목들만 골라내어 별도의 파일로 구성해 둔다면 환경 변ㅅ우 관리를 보다 효율적으로 할 수 있음
Docker Compose에서 환경 변수 정보들을 떼어 별도의 파일을 구성할 때 가장 간편한 방법은 Compose 파일이 위치한 동일 경로에 .env 파일을 따로 구성하는 것
.env 파일을 이용하는 방식은 간편하기는 하지만 Docker Compose 에서 docker compose up 명령을 수행할 때만 활용 가능
env 파일 문법
변수명=값 의 형태로 입력#“, “” 는 불팔요한데 입력된 따옴표는 위치에 따라 변수명이나 값의 일부분으로 간주# 이전에 만든 환경 변수 삭제
unset MYSQL_ROOT_PASSWORD
# docker-compsoe 파일과 동일한 위치에 .env 파일을 생성하고 작성
MYSQL_ROOT_PASSWORD=password
# 실행 시 파일 지정하기
docker compose --env-file ./config/.env.dev config
실행 시 파일 지정하기
서비스 별로 환경 변수 파일 설정
각 서비스(컨테이너)에 대한 환경 변수 파일을 별도로 관리해야 할 수도 있는데 이런 경우에는 Compose 파일에 명시된 각 서비스 안에 env_file 항목을 함께 포함시키게 되는데 이 항목을 따로 명시하지 않았다면 기본적으로는 env_file: .env이 적용된 상태
# Dockerfile
FORM mysql:8
ENV MYSQL_ROOT_PASSWORD password
# 이미지 빌드
docker build -t my-health-app .
# 컨테이너 실행
docker run -d --name health-test-my-health-app
# 상태 확인
docker ps
starting : 컨테이너가 막 실행되어 헬스체크를 기다리는 중healthy : curl 명령이 성공하여 정상 작동 중unhealthy : 설정된 횟수만큼 헬스체크가 실패함자동 복구무중단 배포# 기본 형식
services:
web:
image: my-health-app
ports:
- "8080:8080"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 10s
timeout: 5s
retries: 3
start_period: 5s
testintervaltimeoutretriesstart_perioddepends_on 은 컨테이너가 시작만 되면 바로 다음 컨테이너를 실행하지만 condition: service_healthy 를 사용하면, DB가 내부 설정을 마치고 실제 쿼리를 받을 준비가 끝날 때까지 웹 서버 실행을 우직하게 기다려주는데 덕분에 “DB 연결 실패” 로 웹 서버가 동작하지 않는 현상을 방지할 수 있음대규모 관리장애 복구(Self-healing)확장성(Scaling)로드 밸런싱프로비저닝 및 배포리소스 할당상태 모니터링서비스 디스커버리보안Kubernetes : 사실상 표준인데 기능이 매우 강력하고 생태게가 넓지만 배우기가 다소 어려움Docker Swarm : 도커에서 직접 만든 도구로 설치가 쉽고 간단한 환경에 적합Amazon ECS : AWS 전용 컨테이너 관리 서비스로 AWS 환경을 쓰고 있다면 연동성이 매우 뛰어난데 현재는 다양한 CSP에서 제공여러 호스트를 클러스터로 묶어주는 컨테이너 오케스트레이션 도구의 한 종류
컨테이너 오케스트레이션 도구 없이는 도커 호스트 여러 대를 사용하는 확장성 있는 애플리케이션을 만들기 매우 어려움
어느 도커 호스트에 어떤 컨테이너를 배치해야 하는지 서로 다른 호스트에 위치한 컨테이너 간의 통신은 어떻게 제어하는지 등의 조율을 오케스트레이션 도구 없이 하기는 무리
오케스트레이션 도구를 도입하면 이러한 조율에 수고를 절감할 뿐만 아니라 호스트가 여러 대로 나뉘어 있다는 점을 신경 쓰지 않고 클러스터를 투명ㅎ게 다룰 수 있다는 이점도 있읍
docker-compose
docker swarm
docker service
docker stack
도커 엔진과 통합된 다중 서버 클러스터 환경
서비스 확장과 원하는 상태 조정
Replicas Option(중복) 인 서비스 배포를 할 수 있고, 초기 구성 후 스웜 관리자를 통해 애플리케이션 가용성에 영향을 주지 않고도 서비스 확장 및 축소를 수행할 수 있음desire state management)서비스 스케줄링
swarm manage --strategy (option) 방식을 통해 선택HA spread algorithm)을 사용하는데 이 방식은 생성되는 서비스의 복제본을 분산 배포하기 위해 현재 복제본이 가장 적은 작업자 노드 중에서 이미 스케줄링된 다른 서비스 컨테이너 수가 가장 적은 작업자 노드를 우선 선택로드 밸런싱
docker swarm init) 하면 자동으로 생성되는 네트워크 드라이버 중 하나가 Ingress network서비스 검색
service discovery 라고 함Rolling Update
swarm-manager: 192.168.56.100
swarm-worker1: 192.168.56.101
swarm-worker2: 192.168.56.102
# 인터페이스 확인
ip link show
# netplan 설정 파일 편집
sudo nano /etc/netplan/00-installer-config.yaml
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: no
addresses: [192.168.56.101/24]
gateway4: 192.168.56.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
# netplan 변경 내용 적용
sudo netplan apply
# 확인
ip addr show
sudo hostnamectl set-hostname swarm-manager
cat /etc/hostname
# >>> swarm-manager
# 호스트 이름과 IP 연결
sudo vi /etc/hosts
127.0.0.1 localhost
127.0.1.1 swarm-manager
192.168.56.100 swarm-manager
192.168.56.101 swarm-worker1
192.168.56.102 swarm-worker2
docker swarm init [옵션]# 네트워크 확인
sudo netstat -nlp | grep dockerd
# 조인 토큰을 복사하여 작업자 노드에서 사용
docker swarm join --token SWMTKN-1-
1fg7u28amdxbhrcyikttyxb3zt3vkmohfie0bkf2no366tqk39-
ceyhpl97r6ddamirdfxkp8p9k 192.168.56.100:2377
# 조인 토큰 조화(manager node에서 수행)
docker swarm join-token worker
# 매니저 노드를 추가하는 경우 새로운 토큰 생성 (manager node에서 수행)
docker swarm join-token manager
# 연결 확인 (manager node에서 수행)
docker node ls
# 도커 스웜 모드에 대한 세부 정보 확인 (manager ndoe에서 수행)
docker info
# 새로운 네트워크 확인 (manager node에서 실행)
docker network ls
# 운영 중 노드의 확장을 위해 토큰이 필요한 경우 (manager node에서 수행)
docker swarm join-token --rotate worker
# join 토큰만 필요한 경우 (manager node에서 수행)
docker swarm join-token -q worker
# 작업자 노드 제거 (manager node에서 수행)
docker swarm leave swarm-worker2
# 작업자 노드 제거 (!!!{workder}!!! node에서 수행)
docker swarm leave
--publish 옵션으로 구성할 수 있고 서비스 컨테이너가 포트를 오픈하면 동시에 모든 노드에서 동일한 포트가 오픈되기 때문에 클러스터에 합류된 어떤 노드에 요청을 전달해도 실행 중인 서비스 컨테이너에 자동 전달되는데 이것은 모든 노드가 스웜 모드의 라우팅 메시에 참여하기 때문--replicas) 기능을 제공하고, 배포된 서비스 장애 및 노드의 장애가 발생하면 자동으로 복제 수만큼의 서비스를 맞추어 장애에 대한 자동 복구를 수행