CoreDNS
클라우드 네이티브 환경(쿠버네티스)에서 가장 널리 사용되는 오픈소스 DNS 서버입니다.
Go 언어로 작성된 DNS 서버입니다. 유연성이 뛰어나 다양한 환경에서 사용할 수 있습니다.
(Apache License Version 2에 따라 배포되며 오픈 소스입니다.)
가장 큰 특징은 모든 기능이 Plugin(플러그인) 구조로 되어 있다는 점입니다.
설정 파일인 Corefile 파일에 어떤 Plugin을 사용하여 체인처럼 연결하느냐에 따라 단순한 DNS 서버가 될 수도 있고 Kubernetes(쿠버네티스)의 Service Discovery(서비스 디스커버리)가 될 수도 있습니다.

단순한 DNS 서버 만들기
1. C:\workspaces\docker에 coredns 디렉터리를 생성한 후 conf 디렉터리를 생성합니다.
C:\workspaces\docker\coredns
C:\workspaces\docker\coredns\conf
2. C:\workspaces\docker\coredns에 docker-compose.yml 파일을 생성합니다.
CoreDNS 최신 이미지(https://hub.docker.com/r/coredns/coredns/)를 사용하겠습니다. 현재 버전은 1.14.7입니다.

# 컨테이너 내의 서비스들 정의
services:
# 서비스명
coreDNS:
# 가져올 이미지:태그(버전)
image: coredns/coredns:latest
# 컨테이너명
container_name: dev-coredns
# 연결된 포트 (컨테이너 외부:컨테이너 내부)
ports:
# DNS 요청용
- "53:53/tcp"
# DNS 요청용
- "53:53/udp"
# 볼륨 (컨테이너 외부 경로:컨테이너 내부 경로)
volumes:
# 설정 파일
- C:\workspaces\docker\coredns\conf:/usr/coredns/config
# 컨테이너 재시작 - 컨테이너 자동 재시작
restart: unless-stopped
# 사용할 네트워크
networks:
- dev-network
# Corefile 경로 설정
command:
-conf /usr/coredns/config/Corefile
networks:
dev-network:
external: true
운영에서는 restart: unless-stopped 대신 restart: always로 사용하시기 바랍니다.
DNS 서비스를 위해 TCP/UDP 53 포트를 사용합니다. 그래서 53 포트로 연결해야 합니다.
설정 파일들(Corefile 파일 포함)을 위해 conf 디렉터리(/usr/coredns/config)를 생성하고 볼륨으로 마운트하여 관리합니다.
CoreDNS가 실행될 때 /usr/coredns/config 위치에 있는 Corefile 파일을 읽도록 -conf 으로 설정합니다. (기본적으로 CoreDNS가 실행되는 디렉터리에서 Corefile 파일을 읽습니다.)
Corefile 파일은 CoreDNS의 동작 방식을 정의하는 설정 파일입니다.
Corefile 구성 요소
Server Block(서버 블록)
수신된 특정 DNS 요청을 어떻게 처리할지 정의합니다.
zone은 처리할 대상 도메인을 지정합니다. 도메인은 하나 또는 여러 개(공백으로 구분)로 지정할 수 있습니다.
서버 블록 내부에는 DNS 요청을 처리할 여러 개의 Plugin(플러그인)를 체인 형태로 설정합니다.
zone(domain) {
# Plugins
}
다음 예제는 home.com으로 들어오는 요청은 이 블록에서 처리하겠다는 의미입니다.
home.com {
# Plugins
}
zone이 .이면 루트 블록입니다.
루트 블록은 서버 블록 외에 모든 DNS 요청을 처리합니다.
. {
# Plugins
}
Reusable Snippets (재사용 가능한 작은 조각)
snippet(스니펫)은 재사용 가능한 블록을 정의합니다.
"(이름)"로 정의하고 다른 블록에서 import 지시문으로 가져와서 사용합니다.
# snippet(스니펫) 정의
(name) {
# Plugins
}
(snip) {
# Plugins
}
. {
import snip
}
Plugin(플러그인)
DNS 요청을 처리하는 기능입니다.
실제 모든 DNS 작업은 Plugin이 처리합니다.
Plugin은 corddns(https://github.com/coredns/coredns/tree/master/plugin)에서 확인할 수 있습니다.

다음 예제는 매핑되지 않은 모든 DNS 요청에 대해 쿼리와 오류를 로깅하고 외부 DNS 서버로 넘깁니다.
# 루트 블록 (위에 정의한 서버 블록 외에 모든 DNS 처리)
. {
# 쿼리 로깅 활성화
log
# 오류 로깅 활성화
errors
# 모든 DNS 요청을 KT DNS(168.126.63.1)로 전달
forward . 168.126.63.1
}
단순한 DNS를 만들기 위한 Plugin(플러그인)만 간단하게 소개하겠습니다.
log plugin
모든 쿼리(및 응답의 일부)가 표준 출력으로 출력됩니다. 즉, 쿼리 로깅을 활성화합니다.
(단, 서버 부하가 높은 경우 로깅으로 인해 성능 저하가 발생할 수 있습니다.)
log
errors plugin
쿼리 처리 중 발생하는 모든 오류는 표준 출력으로 출력됩니다. 즉, 오류 로깅을 활성화합니다.
특정 유형의 오류는 일정 시간 간격으로 모아서 한 번에 출력할 수 있습니다.
(서버 블록당 한 번만 사용할 수 있습니다.)
errors
forward plugin
상위 리졸버로 DNS 메시지를 프록시합니다. 즉, 특정 도메인 요청(FROM)이 들어오면 이를 다른 외부 DNS 서버(TO)로 넘겨줍니다.
forward FROM TO...
- FROM : 요청을 전달하기 위해 일치시킬 기본 도메인입니다. (.이면 서버 블록에서 처리되지 않는 모든 DNS 요청)
- TO : 포워딩할 목적지 엔드포인트입니다.
다음 예제는 CoreDNS가 처리할 수 없는 도메인들을 외부 DNS 서버로 넘깁니다.
# 모든 DNS 요청을 KT DNS(168.126.63.1)로 전달
forward . 168.126.63.1
Plugin Chain(플러그인 체인)
서버 블록 내부에 선언된 Plugin들은 독립적으로 작동하는 것이 아니라 연결된 체인(Chain) 형태로 동작합니다.
Plugin 실행 순서는 CoreDNS가 내부적으로 정한 플러그인 순서에 따라 차례대로 실행됩니다.
3. C:\workspaces\docker\coredns\conf에 Corefile 파일을 생성합니다.
# snippet(스니펫) 정의
(snip) {
# 쿼리 로깅 활성화
log
# 오류 로깅 활성화
errors
}
# 루트 블록
. {
import snip
# KT DNS(168.126.63.1)로 전달
forward . 168.126.63.1
}
4. docker-compose.yml 파일이 있는 경로에서 명령어를 실행하여 도커 이미지와 도커 컨테이너를 생성하고 실행합니다.
docker compose up -d

DNS 서버 연결
1. 윈도우 검색에서 [네트워크 연결 보기]를 입력해서 네트워크 연결 대화창을 실행시킵니다.
또는 실행창에서 ncpa.cpl을 입력하면 됩니다.
저는 Wi-Fi만 사용하고 있습니다. 그래서 Wi-Fi에서 마우스 오른쪽 버튼을 누른 후 컨텍스트 메뉴에서 [속성]을 클릭합니다.

[네트워킹] 탭에서 [인터넷 프로토콜 버전 4(TCP/IPv4)]를 선택하고 [속성]버튼을 누릅니다.

[일반] 탭에서 [자동으로 DNS 서버 주소 받기] 대신 [다음 DNS 서버 주소 사용]를 선택하고 [기본 설정 DNS 서버]에 "127.0.0.1"를 입력하고 [확인] 버튼을 누릅니다.

2. DNS가 정상적으로 작동되는지 확인하기 위해서 docker compose logs를 실행합니다.
docker compose logs -f coredns

3. 웹 브라우저를 실행하여 사이트에 접속합니다.
DNS 로그를 보면 정상적으로 처리되는 것을 확인할 수 있습니다.

이제 로컬에서 DNS 서버가 작동되었습니다.
주의
로컬 PC에 직접 DNS 서버을 구축하여 구동하려는 개발자나 네트워크 엔지니어가 아니시면 PC 사용에 문제가 발생할 수 있습니다. CoreDNS가 도커 환경에서 실행되기 때문에 DNS 서버가 중지되거나 삭제되면 인터넷 연결되지 않습니다.
또한, 외부로 DNS 요청을 넘기는 과정에서 Delay가 발생하여 응답 속도(웹페이지가 뜨는 속도)가 눈에 띄게 느려질 수 있습니다.
개발이나 테스트가 끝나면 다시 [일반] 탭에서 [다음 DNS 서버 주소 사용] 대신 [자동으로 DNS 서버 주소 받기]를 선택하고 [확인]버튼을 눌러 내부 DNS가 사용되지 않게 하시기 바랍니다.
'Spring & Spring Boot > DNS' 카테고리의 다른 글
| [3] CoreDNS - Chrome/Windows DNS 캐시 제거 (0) | 2026.10.23 |
|---|---|
| [2] CoreDNS - host 설정 (0) | 2026.10.23 |