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 요청 및 응답 로그를 체계적으로 수집하고 모니터링하기 위해 Fluentd
나 Filebeat
를 활용할 수 있습니다. 예를 들어, 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 환경을 운영할 수 있습니다.
댓글