본문 바로가기
서버구축 (WEB,DB)

Docker 환경 DNS 캐시(dnsmasq) 구현으로 성능 최적화 및 모니터링

by 날으는물고기 2025. 1. 22.

Docker 환경 DNS 캐시(dnsmasq) 구현으로 성능 최적화 및 모니터링

Docker 환경에서 컨테이너들이 사용하는 DNS 서버를 별도의 컨테이너로 구성하고, 캐시 기능을 포함하여 네트워크 성능을 최적화할 수 있습니다. dnsmasq를 Docker 컨테이너로 실행하여 DNS 캐시 서버를 구현하는 방법입니다.


1. 목표

  • 별도의 DNS 서버 구성: Docker 컨테이너가 공통적으로 사용할 수 있는 DNS 서버 구축.
  • 성능 향상: DNS 쿼리 결과를 캐싱하여 반복적인 요청 처리 속도 향상.
  • 관리 용이성: 모든 컨테이너가 동일한 DNS 캐시 서버를 사용하도록 설정.

2. dnsmasq Docker 컨테이너 생성

DNS 캐시 서버로 사용할 dnsmasq를 Docker 컨테이너에서 실행합니다.

2.1 Dockerfile 작성

Docker 이미지를 생성하기 위해 아래와 같이 Dockerfile을 작성합니다.

FROM alpine:latest

# dnsmasq 설치
RUN apk add --no-cache dnsmasq

# 설정 파일 복사
COPY dnsmasq.conf /etc/dnsmasq.conf

# 포트 53 열기
EXPOSE 53/udp

# dnsmasq 실행
CMD ["dnsmasq", "-k"]

2.2 dnsmasq.conf 설정 파일 작성

DNS 캐시 서버 설정을 위한 dnsmasq.conf 파일을 작성합니다.

# 캐시 크기 설정
cache-size=1000

# DNS 서버 설정
server=8.8.8.8
server=8.8.4.4

# 로그 활성화
log-queries
log-facility=/var/log/dnsmasq.log

2.3 Docker 이미지 빌드

위 파일들을 준비한 후 Docker 이미지를 빌드합니다.

docker build -t custom-dnsmasq .

3. Docker 네트워크 구성

모든 컨테이너가 DNS 캐시 서버를 참조할 수 있도록 네트워크를 설정합니다.

3.1 Docker 네트워크 생성

DNS 캐시 서버와 애플리케이션 컨테이너 간 통신을 위한 네트워크를 생성합니다.

docker network create dns_network

3.2 dnsmasq 컨테이너 실행

생성한 네트워크를 사용하여 dnsmasq 컨테이너를 실행합니다.

docker run -d \
  --name dnsmasq-server \
  --net dns_network \
  --restart unless-stopped \
  custom-dnsmasq

4. 컨테이너에서 DNS 서버 사용

DNS 캐시 서버를 활용하도록 다른 컨테이너를 설정합니다.

4.1 Docker Compose 파일 작성

Docker Compose를 사용하여 설정을 자동화합니다.

version: '3.7'

services:
  app:
    image: nginx
    container_name: app_container
    networks:
      - dns_network
    dns:
      - dnsmasq-server

  dnsmasq:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: dnsmasq-server
    networks:
      - dns_network
    ports:
      - "53:53/udp"
    restart: unless-stopped

networks:
  dns_network:
    driver: bridge

4.2 Docker Compose 실행

Compose 파일을 실행하여 서비스를 시작합니다.

docker-compose up -d

5. 테스트

구성한 DNS 캐시 서버가 제대로 작동하는지 확인합니다.

5.1 DNS 쿼리 테스트

애플리케이션 컨테이너에서 dig 명령어를 사용하여 DNS 서버의 동작을 테스트합니다.

# Google.com에 대한 DNS 쿼리 수행
# 첫 번째 쿼리
$ docker exec -it app_container dig google.com

# 두 번째 쿼리로 캐시 테스트
$ docker exec -it app_container dig google.com
  • 첫 번째 쿼리에서 Query time이 길고, 두 번째 쿼리에서 Query time이 줄어들면 캐시가 성공적으로 작동하는 것입니다.

5.2 DNS 요청/응답 확인

컨테이너의 DNS 요청/응답을 확인하려면 다음과 같이 tcpdump를 사용합니다.

# dnsmasq 서버에서 DNS 패킷 캡처
$ docker exec -it dnsmasq-server apk add tcpdump
$ docker exec -it dnsmasq-server tcpdump -i eth0 udp port 53

5.3 로그 확인

dnsmasq 컨테이너의 로그에서 쿼리 요청 및 캐시 히트를 확인합니다.

$ docker logs dnsmasq-server

로그에는 DNS 쿼리와 캐시 사용 여부가 표시됩니다.

query[A] google.com from 192.168.1.100
cached google.com is 172.217.169.14

5.4 로그 수집 및 모니터링

DNS 요청 및 응답 로그를 체계적으로 수집하고 모니터링하기 위해 FluentdFilebeat를 활용할 수 있습니다. 예를 들어, Filebeat를 사용하여 dnsmasq 로그를 Elasticsearch로 전송한 뒤 Kibana에서 시각화할 수 있습니다.

 

Filebeat 설정 예시

filebeat.inputs:
  - type: log
    paths:
      - /var/log/dnsmasq.log

output.elasticsearch:
  hosts: ["http://elasticsearch:9200"]

Filebeat 컨테이너 실행

docker run -d \
  --name filebeat \
  -v /path/to/filebeat.yml:/usr/share/filebeat/filebeat.yml \
  -v dnsmasq-logs:/var/log/dnsmasq.log \
  docker.elastic.co/beats/filebeat:7.15.0

Kibana에서 모니터링

Kibana 대시보드를 생성하여 다음과 같은 정보를 시각화할 수 있습니다.

  • 요청 빈도
  • 캐시 히트율
  • 가장 많이 요청된 도메인

6. 최적화 및 유지 관리

6.1 캐시 크기 조정

dnsmasq.conf 파일에서 cache-size 값을 증가 또는 감소시켜 성능을 조정합니다.

6.2 추가 DNS 서버 설정

내부 네트워크의 DNS 서버나 외부 DNS 서버를 추가하려면 server 옵션을 수정합니다.

server=1.1.1.1
server=9.9.9.9

6.3 모니터링

dnsmasq 로그를 외부 로그 분석 도구와 연동하여 DNS 캐시 통계를 지속적으로 모니터링합니다.


이 구성을 통해 Docker 컨테이너들이 중앙 집중화된 DNS 캐시 서버를 사용함으로써 다음과 같은 이점을 얻을 수 있습니다.

  • DNS 쿼리 실패 감소
  • 네트워크 성능 최적화
  • 외부 DNS 서버의 부하 감소

 

구성 후에는 성능 향상 및 안정성을 통해 효율적인 Docker 환경을 운영할 수 있습니다.

728x90

댓글