====== CoreDNS server inside a Docker container ====== This howto describes how to run CoreDNS in a Docker container. It assumes a running docker setup. ===== Fetch the container ===== CoreDNS maintains a docker container at https://hub.docker.com/r/coredns/coredns/. # docker pull coredns/coredns Using default tag: latest latest: Pulling from coredns/coredns Digest: sha256:1eeb4c7316bacb1d4c8ead65571cd92dd21e27359f0d4917f1a5822a73b75db1 Status: Image is up to date for coredns/coredns:latest docker.io/coredns/coredns:latest ===== Create local configurations ===== Configurations need to live outside the container and be mounted as a volume. We create a folder in /root/containers/coredns on the host to store these configuration. The first configuration file declares a zone with the location of a database file. The second configuration file declares DNS records in a zone file. # mkdir /root/containers/coredns # cat /root/containers/coredns/Corefile necto.org:53 { file /root/necto.org.db # the location of the database file inside the container log errors } The database file uses the standard Bind syntax. See [[https://datatracker.ietf.org/doc/html/rfc1035#section-3.3.13|RFC 1035]] for more info on how to structure zone files. Note that the serial *must* store in a 32 bits integer so keep it at 10 digits for simplicity. # cat /root/containers/coredns/necto.org.db necto.org. IN SOA ns1.necto.org. administrator.necto.org. 2024071901 7200 3600 1209600 3600 legolas.necto.org. IN A 75.67.215.94 ns1.necto.org. IN CNAME legolas.necto.org. ===== Start the container ===== The docker run command mounts the folder from the host into the container and sets the configuration flag to point to the Corefile file inside the container. We also forward UDP 53 to answer queries. # docker run -d --name coredns --restart=always --volume=/root/containers/coredns/:/root/ -p 53:53/udp coredns/coredns -conf /root/Corefile **docker ps**, **docker logs** and **docker inspect** can be used to evaluate the state of the container. # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 330c19f5b978 coredns/coredns "/coredns -conf /roo…" 3 hours ago Up 3 hours 53/tcp, 0.0.0.0:53->53/udp, :::53->53/udp coredns # docker logs 330c19f5b978 necto.org.:53 CoreDNS-1.11.1 linux/arm64, go1.20.7, ae2bbc2 [INFO] 172.17.0.1:36321 - 6587 "A IN legolas.necto.org. udp 58 false 1232" NOERROR qr,aa,rd 68 0.000162407s [INFO] 199.47.252.56:36063 - 45182 "A IN legolas.necto.org. udp 58 false 4096" NOERROR qr,aa,rd 68 0.000134611s # docker inspect 330c19f5b978 [ { "Id": "330c19f5b978e1101a7f500596b2f26227f49794dccf8f7d48dd8016e1fddc62", "Created": "2024-07-19T12:00:22.78761211Z", "Path": "/coredns", ... ===== Run the container as a systemd service ===== To run the container as a systemd service, create the following service file under **/etc/systemd/system/docker.coredns.service** # cat /etc/systemd/system/docker.coredns.service [Unit] Description=CoreDNS Container After=docker.service Requires=docker.service [Service] TimeoutStartSec=0 Restart=always ExecStartPre=-/usr/bin/docker stop %n ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=/usr/bin/docker pull coredns/coredns ExecStart=/usr/bin/docker run --name %n --volume=/root/containers/coredns/:/root/ -p 53:53/udp coredns/coredns -conf /root/Corefile [Install] WantedBy=multi-user.target And run it with the following command: # systemctl start docker.coredns # systemctl|grep coredns docker.coredns.service loaded active running CoreDNS Container Use **systemctl enable docker.coredns** to run it at startup.