DNS 서버를 사용하여 내부 IP(도커 내부 네트워크 IP)와 도메인을 연결하겠습니다.
hosts plugin
내부 IP와 도메인 매핑 정보를 읽어옵니다. hosts을 활성화합니다.
내부 IP와 도메인 매핑 정보를 직접 관리하고 내부 테스트용 도메인을 임시로 설정할 때도 유용합니다.
hosts [FILE [ZONES...]] {
[INLINE]
ttl SECONDS
no_reverse
reload DURATION
fallthrough [ZONES...]
fallthrough_unsupported
}
아무런 옵션을 설정하지 않으면 서버에 있는 /etc/hosts 파일에서 내부 IP와 도메인 매핑 정보를 읽어옵니다.
서버에 있는 /etc/hosts 파일 내용입니다.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.0.6 d34593763ed8 <-- 도커 컨텐이너
CoreDNS가 도커 컨테이너로 실행되고 있기 때문에 도커 컨테이너가 가상 네트워크에서 사용 중인 IP 주소와 컨테이너 ID입니다.
다양한 hosts plugin 추가 방법
1. hosts
home.com 도메인과 그 하위 도메인에 대한 DNS 요청이 들어오면 서버에 있는 /etc/hosts 파일을 읽어와서 응답합니다.
(5초마다 hosts 파일의 내용을 읽어 업데이트합니다.)
home.com {
hosts
}
2. hosts [FILE]
home.com 도메인과 그 하위 도메인에 대한 DNS 요청이 들어오면 지정된 hosts 파일(my.hosts)을 읽어와서 응답합니다.
hosts 파일에 경로가 없으면 현재 디렉터리에서 읽어 옵니다.
home.com {
hosts my.hosts
}
3. hosts [FILE [ZONES...]]
hosts 파일(my.hosts)을 읽어와서 지정된 ZONES(home.com과 home.net)에만 응답합니다.
. {
hosts my.hosts home.com home.net {
fallthrough
}
}
hosts 파일(my.hosts) 내에 많은 도메인이 적혀 있어도 *.home.com이나 *.home.net 형태의 도메인 요청이 들어왔을 때만 hosts 파일(my.hosts)에서 가져와 응답합니다.
요청된 도메인이 home.com이나 home.net 범위에 속해 있어도 hosts 파일(my.hosts) 내에서 일치하는 내부 IP와 도메인 매핑 정보를 찾지 못했을 경우 빈 응답을 보내며 종료합니다. 그래서 빈 응답을 보내지 않고 다음 Plugin Chain으로 요청을 전달하기 위해서 fallthrough를 추가해야 합니다.
4. hosts { [INLINE] }
home.com 도메인과 그 하위 도메인에 대한 DNS 요청이 들어오면 인라인으로 등록된 내부 IP와 도메인 매핑 정보를 사용하여 응답합니다.
home.com {
hosts {
172.20.0.6 *.home.com
fallthrough
}
}
내부 IP와 도메인 매핑 정보를 기반으로 매칭에 대해 간단하게 설명하겠습니다.
172.20.0.6 *.home.com
172.20.0.7 www.home.com
172.20.0.8 api.home.com
- www.home.com과 api.home.com은 각각 명시된 172.20.0.7, 172.20.0.8로 확인됩니다.
- apps.home.com은 172.20.0.6으로 확인됩니다. *(와일드카드) 적용
- home.com은 *.home.com으로 매칭되지 않습니다. (호스트 이름의 전체 길이가 일치해야 합니다.)
- deep.apps.home.com은 *.home.com으로 매칭되지 않습니다. (호스트 이름의 전체 길이가 일치해야 합니다.)
정확한 도메인을 위해 *(와일드카드)를 사용하지 않는 게 좋습니다.
일치하는 내부 IP와 도메인 매핑 정보가 없을 경우 요청을 다음 Plugin Chain으로 전달하기 위해서 fallthrough를 추가해야 합니다.
plugin 실행 순서는 블록 내부에 있는 plugin 순서로 실행되지 않고 CoreDNS가 내부적으로 정한 plugin 순서에 따라 차례대로 실행됩니다.
내부 IP과 도메인 연결
제가 가지고 있는 www.redwavesoft.com을 사용하겠습니다.
브라우저가 DNS를 캐시하기 때문에 테스트를 위해서 크롬 시크릿을 사용해야 합니다.

1. C:\workspaces\docker\coredns\conf에 my.hosts 파일을 생성합니다.
내부 IP(127.0.0.1)과 도메인(http://www.redwavesoft.com)을 연결합니다.
127.0.0.1 www.redwavesoft.com
2. C:\workspaces\docker\coredns\conf\Corefile 파일을 수정합니다.
hosts를 hosts [FILE] 방식으로 추가하겠습니다.
- redwavesoft.com 서버 블록을 만듭니다.
- 공통으로 사용하는 snippet를 import 지시문으로 가져옵니다.
- hosts에 my.hosts 파일을 지정합니다.
- 외부 DNS 연결을 위해 foeward를 설정합니다.
# snippet(스니펫) 정의
(snip) {
# 쿼리 로깅 활성화
log
# 오류 로깅 활성화
errors
}
# 서버 블록
redwavesoft.com {
import snip
# 호스트 설정
hosts /usr/coredns/config/my.hosts {
fallthrough
}
# KT DNS(168.126.63.1)로 전달
forward . 168.126.63.1
}
# 루트 블록
. {
import snip
# KT DNS(168.126.63.1)로 전달
forward . 168.126.63.1
}
4. 설정이 변경되어서 DNS를 다시 시작합니다.
docker compose restart coredns

5. 크롬 시크릿을 종료하고 다시 크롬 시크릿을 실행하여 www.redwavesoft.com에 접속합니다.
저는 Spring Boot 애플리케이션인 transmission이 실행되는 것을 확인할 수 있습니다.
(여러분은 실행 중인 도커 컨테이너이거나 로컬에서 개발 중인 Spring Boot 애플리케이션이 나타납니다.)

주의
# 서버 블록
redwavesoft.com {
import snip
# 호스트 설정
hosts /usr/coredns/config/my.hosts
# KT DNS(168.126.63.1)로 전달
forward . 168.126.63.1
}
hosts plugin은 기본적으로 요청된 도메인이 hosts 파일에 없으면 다른 plugin으로 넘기지 않고 DNS_PROBE_FINISHED_NXDOMAIN (입력한 도메인 주소에 해당하는 IP를 찾지 못할 때 발생하는 DNS 조회 실패 에러) 응답을 반환합니다. 그래서 아래에 있는 forward plugin이 실행되지 않습니다.

반드시 hosts 내부에 fallthrough를 추가해야 합니다.
# 서버 블록
redwavesoft.com {
import snip
# 호스트 설정
hosts /usr/coredns/config/my.hosts {
fallthrough
}
# KT DNS(168.126.63.1)로 전달
forward . 168.126.63.1
}
host를 hosts { [INLINE] } 방식으로 추가하고 싶다면 다음처럼 하시면 됩니다.
# 서버 블록
redwavesoft.com {
import snip
# 호스트 설정
hosts {
127.0.0.1 www.redwavesoft.com
fallthrough
}
# KT DNS(168.126.63.1)로 전달
forward . 168.126.63.1
}
다만, Corefile 파일을 수정하게 되면 DNS를 다시 시작해야는 문제가 있어 권장하지 않습니다. hosts가 거의 변경되지 않을 때만 사용하시기 바랍니다.
이제부터 도메인을 이용하여 테스트를 할 수 있게 되었습니다.
도메인 변경 테스트
1. C:\workspaces\docker\coredns\conf\my.hosts 파일을 수정합니다.
도메인을 www.redwavesoft.com에서 www1.redwavesoft.com로 변경합니다.
127.0.0.1 www1.redwavesoft.com
CoreDNS는 5초마다 hosts 파일의 내용을 다시 읽어 업데이트하기 때문에 DNS를 다시 시작하지 않아도 됩니다.
2. 크롬 시크릿을 종료하고 5초 후에 다시 크롬 시크릿을 실행하여 http://www.redwavesoft.com에 접속합니다.
다시 저의 사이트로 나오면 DNS가 정상적으로 동작되고 있는 겁니다.

외부 DNS 변경
외부 DNS을 구글 DNS으로 사용하고 싶으시면 168.126.63.1 대신 8.8.8.8으로 전달하시면 됩니다.
# 구글 DNS(8.8.8.8)로 전달
forward . 8.8.8.8
'Spring & Spring Boot > DNS' 카테고리의 다른 글
| [3] CoreDNS - Chrome/Windows DNS 캐시 제거 (0) | 2026.10.23 |
|---|---|
| [1] CoreDNS (0) | 2026.10.23 |