Step 1 Build Image With Alpine Linux

Using Minimal Alpine Linux And Install Bind, Openrc(Use For Process Run) And Setting Openrc With Bind.

Create Folder

mkdir -p /container/build/named && cd /container/build/named

Create dockerfile

vim dockerfile

FROM alpine:latest
MAINTAINER GordonWei wei@kmp.tw
RUN apk add bind openrc
RUN mkdir -p /run/openrc && touch /run/openrc/softlevel
RUN rc-update -u named

Volume ["/sys/fs/cgroup"]

Step 2 Add File named.conf, zone_files To Some Folder.

In This Case For Example, We Use test.com.

Create Foleder

mkdir -p /docker/ns/conf/zone && cd /docker/ns/conf

name.conf

vim named.conf

options {
  directory "/var/bind";
  pid-file "/var/run/named/named.pid";
  recursion yes;
  forwarders { 8.8.8.8; };
  allow-transfer { any; };
  allow-query { any; };
  listen-on { any; };
  listen-on-v6 { none; };
};

zone "test.com" IN {
  type master;
  file "/etc/bind/zone/test.com";
};

test.com

vim zone/test.com

$TTL 38400
@ IN SOA ns.test.com. admin.test.com. (
2       ;Serial
600     ;Refresh
300     ;Retry
60480   ;Expire
600 )   ;Negative Cache TTL

@       IN      NS      ns.test.com.
@       IN      NS      ns2.test.com.
@       IN      MX  1   127.0.0.1
ns      IN      A       127.0.0.1
ns2     IN      A       127.0.0.2
www     IN      A       8.8.8.8

Step 3 Build Image

Using docker build command.

cd /container/build/named
docker build -t gordon/ns .

Step 4 Create docker-compose File

In My Case, I’ll Create Service Foleder For Each

Create Folder

mkdir /container/ns && cd /container/ns

Create docker-compose File

vim docker-compose.yml

version: '3'
services:
  dns:
    image: gordon/ns
    hostname: ns
    restart: always
    ports:
    - 53:53
    - 53:53/udp
    volumes:
    - /container/dns/conf/named.conf:/etc/bind/named.conf:z
    - /container/dns/conf/zone/:/etc/bind/zone/:z
    command: named -c /etc/bind/named.conf -g -u named

Step 5 Run Service With docker-compose

Make Sure Where Are You.

pwd && ls
/container/ns
conf  docker-compose.yml

Run docker-compose Command

docker-compose -up -d

Step 6 Verify Service

Verify Local Domain

dig @127.0.0.1 ns.test.com

; <<>> DiG 9.16.1-Ubuntu <<>> @127.0.0.1 ns.test.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9242
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 00000000001230210302103210302103 (good)
;; QUESTION SECTION:
;ns.test.com.			IN	A

;; ANSWER SECTION:
ns.test.com.		38400	IN	A	127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Jan 11 06:57:19 UTC 2021
;; MSG SIZE  rcvd: 82

Verify Google (Optional)

dig @127.0.0.1 google.com

; <<>> DiG 9.16.1-Ubuntu <<>> @127.0.0.1 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18637
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 12345678901234567890 (good)
;; QUESTION SECTION:
;google.com.			IN	A

;; ANSWER SECTION:
google.com.		159	IN	A	172.217.27.142

;; Query time: 16 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Jan 11 06:59:37 UTC 2021
;; MSG SIZE  rcvd: 83