docker compose 를 이용한 서비스 디스커버리 및 scale out - in

2025. 10. 15. 17:15·devops

목표

docker compose 를 이용한 서비스 디스커버리 및 scale out - in 을 진행한다.

과정

웹 서버 설정

  1. 웹 서버를 위한 Dockerfile 작성
# https://docs.docker.com/engine/reference/builder/
FROM httpd:2.4.57 # 아파치 기본 웹 서버

RUN ["apt-get", "update"] 
# 참고로, RUN 과 CMD 의 차이는 RUN 는 도커 빌드 과정에서 실행되는 명령, CMD는 도커 이미지 실행 시 실행되는 명령

# code
RUN ["apt-get", "install", "-y",  "git"]
RUN ["git", "clone", "https://github.com/dMario24/dMario24.github.io.git", "/usr/local/apache2/app/blog"]
# git 설치 후 테스트 할 서비스를 이룰 파일들 다운


# change apache2 conf
COPY ["httpd.conf", "/usr/local/apache2/conf/"]


# cron
RUN ["apt-get", "install", "-y", "cron"] 
# 크론(Cron) 은 유닉스/리눅스 계열 운영체제에서 특정한 시간, 날짜, 또는 주기에 자동으로 명령어나 스크립트를 실행해주는 데몬(백그라운드 서비스) 입니다.
COPY ["pull.sh", "/usr/local/apache2/app/blog/"]
COPY ["blog-pull-cronjob", "/etc/cron.d/blog-pull-cronjob"]
RUN ["crontab", "/etc/cron.d/blog-pull-cronjob"]

# Just once at the end
CMD service cron start;httpd-foreground # 크론 시스템 서비스 실행, 웹 서버 실행
  1. 복사할 파일들
  • pull.sh
  • #!/bin/bash echo "start pull-->" date "+%Y-%m-%d %H:%M:%S" cd /usr/local/apache2/app/blog git pull echo "<--end pull"
  • blog-pull-cronjobpull.sh 를 주기적으로 실행
  • * * * * * sh /usr/local/apache2/app/blog/pull.sh >> /var/log/pull.log 2>&1 # >> : 이어서 작성, 2: 표준 에러, $1: 표준 출력 # new crontab file is missing newline before EOF, can't install. 크론 명령에 대한 쉘 스크립트는 \n으로 끝나냐 한다.
  • http.conf
    기본 파일에서 serverRoot 만 수정
  • ServerRoot "/usr/local/apache2"

docker compose 파일 작성

version: '3.8'
name: awsgoo
services:
  nginx-proxy:
    image: nginxproxy/nginx-proxy # https://github.com/nginx-proxy/nginx-proxy
    ports:
      - "9889:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro 
    depends_on:
      - blog
    deploy:
      resources:
        limits:
          cpus: '0.20'
          memory: 50M
        reservations:
          cpus: '0.05'
          memory: 20M

  blog:
    build: ../../docker_file/httpd
    deploy:
      mode: replicated
      replicas: 1 # https://docs.docker.com/compose/compose-file/deploy/#replicas
      resources: # https://docs.docker.com/compose/compose-file/compose-file-v3/#resources
        limits:
          cpus: '0.05'
          memory: 50M
        reservations:
          cpus: '0.01'
          memory: 20M
    expose:
      - "80"
    environment:
      - VIRTUAL_HOST=aws.google.com,172.31.86.218,ec2-54-236-8-204.compute-1.amazonaws.com
      - VIRTUAL_PORT=80

이 부분이 scale-out 의 핵심인데, 도커 데몬과 통신하는 소켓 파일을 컨테이너 안으로 bind mount 하여 로컬 데몬 서버의 변경을 컨테이너 안에서 감지할 수 있게 된다.

nginx-proxy 내부의 docker-gen 프로세스가
/tmp/docker.sock을 통해 Docker 이벤트(container start, die, scale)를 감시한다.

services:
    name: nginx-proxy
        volumes:
            - /var/run/docker.sock:/tmp/docker.sock:ro # 로컬 pc 의 소켓 파일(도커 데몬과 통신하는 소켓 파일이다.) 을 컨테이너의 파일로 연결(bind/mount) 

VIRTUAL_HOST, VIRTUAL_PORT 환경변수를 등록한다면 nginx_proxy에서 해당 VIRTUAL 값을 통해서 해당 컨테이너에 접근할 수 있다.

blog:
    environment:
      - VIRTUAL_HOST=aws.google.com,172.31.86.218,ec2-54-236-8-204.compute-1.amazonaws.com
      - VIRTUAL_PORT=80

scale out 시 nginx-proxy

scale out 시 nginx proxy 가 어떻게 변환하는지 관찰한다.

docker compose 명령 실행 시 파일에 작성한 대로 blog 컨테이너가 한 개 띄워진다.

docker compose -f compose/auto_lb/compose.yaml up -d 

nginx-proxy 컨테이너에서 nginx 설정을 확인하면

/etc/nginx/conf.d/default.conf

upstream aws.google.com {
    server 172.26.0.2:80;
    keepalive 2;
}

upstream ec2-54-236-8-204.compute-1.amazonaws.com{
    server 172.26.0.2:80;
    keepalive 2;
}

upstream 172.31.86.218 {
    server 172.26.0.2:80;
    keepalive 2;
}

가 되는 것을 확인할 수 있다.

scale-out 후 nginx 설정을 확인한다면 달라진 것을 확인할 수 있다.

docker compose -f compose/auto_lb/compose.yaml up -d --scale blog=5
upstream aws.google.com {
    server 172.26.0.4:80;
    server 172.26.0.5:80;
    server 172.26.0.6:80;
    server 172.26.0.7:80;

    server 172.26.0.2:80;
    keepalive 10;
}

nginx-proxy 동작 확인

  1. 로컬 pc 의 hosts 파일에 도메인을 등록한다.
127.0.0.1 aws.google.com
  1. http://aws.google.com:9889 접속한다.

부하 분산 확인

영상은 아래 url 로 이동하여 확인할 수 있다.

https://github.com/khw7385/lgcns-msa/pull/2

결론

Docker 를 활용하여 Service Discovery 기능을 구현하였다.
nginx-proxy 컨테이너에 Docker 데몬과 통신할 수 있는 소켓(/var/run/dock.sock)를 마운트하여, 컨테이너 생성과 삭제 같은 Docker 이벤트를 감지할 수 있게 구성한다. nginx-proxy 이미지에 내장된 docker-gen 프로세스가 이러한 이벤트를 감지하면, 템플릿을 기반으로 nginx 설정 파일을 동적으로 재생성하고 자동으로 reload 한다. 이를 통해, 별도의 서비스 등록 없이도, 새로운 컨테이너를 자동으로 리버스 프록시에 반영하는 서비스 디스커버리 구조를 구현할 수 있게 되었다.

궁금즘

로드 밸런서를 통한 부하 부산 + 서비스 디스커버리를 통한 서비스 자동 등록에 대하여 학습하였다. 위 실습에서는 직접 scale-out 을 하였지만, 서버(서비스)의 상태에 따라 자등으로 scale-out/in 을 하는 하는 것을 목표로 한다.

'devops' 카테고리의 다른 글

Spring Cloud Gateway 와 Spring Eureka 를 통해 MSA 환경 구축  (0) 2025.10.20
SPRING GATEWAY 를 이용한 MSA( 멀티 서비스, 멀티 서버 구현하기)  (0) 2025.10.20
GW LB 를 이용한 무중단 배포(업데이트)  (0) 2025.10.20
nginx-proxy 이미지 없이 docker compose 를 활용하여 직접 MSA 구성  (0) 2025.10.20
docker 를 활용하여 직접 msa 구성  (0) 2025.10.20
'devops' 카테고리의 다른 글
  • SPRING GATEWAY 를 이용한 MSA( 멀티 서비스, 멀티 서버 구현하기)
  • GW LB 를 이용한 무중단 배포(업데이트)
  • nginx-proxy 이미지 없이 docker compose 를 활용하여 직접 MSA 구성
  • docker 를 활용하여 직접 msa 구성
khw7385
khw7385
khw7385 님의 블로그 입니다.
  • khw7385
    khw7385 님의 블로그
    khw7385
  • 전체
    오늘
    어제
    • 분류 전체보기 (43) N
      • 코딩테스트 (7)
      • 자바 (3)
      • 스프링 (3)
      • cs (7)
        • 자료구조 (3)
        • 알고리즘 (1)
        • 객체지향 (3)
      • 개발일지 (6)
        • 트러블슈팅 (1)
      • 데이터베이스 (3)
        • Redis (2)
        • MySQL (1)
      • 기타 (2)
      • devops (6)
      • LG CNS AM INSPIRE (6) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
khw7385
docker compose 를 이용한 서비스 디스커버리 및 scale out - in
상단으로

티스토리툴바