bind9.11.3をdockerで動かす

  • LINEで送る

こんばんにちは

今回はDocker上でbindを動かすためのDockerfileとかを作成しましたので、ご紹介したいと思います。

ISCのHPによると記事執筆時点でのCurrent-Stable, ESV(Extended Support Version)が9.11.3で、
そのEOLがDec 2021なので、これを採用します。

イメージのベースにはCentOS7.5のOfficialイメージを用います。
また、opensslをcentos標準のものではなく、最新安定板をソースからビルドしてbindから用いるようビルドします。

続きをどうぞ。

 

前置き

作成にあたり簡単な動作確認はしておりますが、もしご利用の際は自己責任でお願いします。

これをどうするの?とか聞く人は使うべきではないので使わないで聞かないでください。

再配布や改変は特に禁止しませんが、できればこのページへのリンク等をしていただけると嬉しいです。

 

make testに関して

作成時にはopensslもbindもmake testが通ることを確認していますが、docker上では基本的に同じ環境となるし、bindのmake testにとても時間がかかるため省いております。

 

Dockerfile

カレントディレクトリ内のnamed.confとzones/ディレクトリをイメージに追加します。

zones/にはzoneファイルを置くことを想定しています。chrootが有効になっているので、named.confからゾーンファイルをincludeする際のパスは

/var/named/domain.zone

となります。また、イメージをrunするとnamedはフォアグラウンドで起動します。

# baseとしてofficial imageのcentos:7.5.1804を用いる
FROM centos:7.5.1804

# 必要なパッケージを入れる
RUN yum -y update && \
    yum -y install gcc wget make perl-core perl-Net-DNS

# ソースのダウンロードと展開
WORKDIR /usr/local/src

RUN wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz -O openssl.tar.gz && \
    wget https://www.isc.org/downloads/file/bind-9-11-3/?version=tar-gz -O bind.tar.gz && \
    mkdir openssl bind && \
    tar xzf openssl.tar.gz -C openssl --strip-components 1 && \
    tar xzf bind.tar.gz -C bind --strip-components 1 && \
    rm -f openssl.tar.gz bind.tar.gz

# opensslのインストール
WORKDIR /usr/local/src/openssl

## opensslのデフォルトのinstall先は/usr/local
RUN ./config --prefix=/usr --openssldir=/usr shared && \
    make && \
    make install

# bindのインストール
WORKDIR /usr/local/src/bind

RUN echo "/usr/lib" > /etc/ld.so.conf.d/openssl.conf && \
    ldconfig && \
    chown -R root: /usr/local/src/bind && \
    ./configure --prefix=/var/named/chroot --enable-threads --with-openssl=yes --enable-openssl-version-check && \
    make && \
    make install

# その他の作業
RUN groupadd -g 25 bind && \
    useradd -u 25 -g bind -d /var/named -c "DNS BIND Named User" -s /sbin/nologin bind && \
    mkdir /var/named/chroot/dev && \
    mknod -m 666 /var/named/chroot/dev/null c 1 3 && \
    mknod -m 666 /var/named/chroot/dev/random c 1 8 && \
    mkdir /var/named/chroot/var/named && \
    mkdir /var/named/chroot/var/log && \
    touch /var/named/chroot/var/log/named.log && \
    chown -R bind: /var/named/chroot/var

# 必要ファイルのコピー
COPY named.conf /var/named/chroot/etc
COPY zones/ /var/named/chroot/var/named/

CMD ["/var/named/chroot/sbin/named", "-u", "bind", "-t", "/var/named/chroot", "-c", "/etc/named.conf", "-g"]

 

Makefile

いろいろな操作が楽になるMakefileです。

make

とだけ実行すれば各makeコマンドの使い方が表示されるようになっています。

 ~/docker/bind % make build

でイメージをビルドして、

 ~/docker/bind % make run

で起動します。起動に必要なオプションをいちいち指定する必要がないので楽かと。
表示の都合でtabがスペースになってしまっているかもしれません。

.PHONY: help
.DEFAULT_GOAL := help

help:
    @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-10s\033[0m %s\n", $$1, $$2}'
build: ## build the bind image
    sudo docker build -t bind:9.11.3 .
run: ## run the bind image normally
    sudo docker run -it --name bind --cap-add DAC_READ_SEARCH --cap-add SYS_RESOURCE --restart=always -p 53:53/tcp -p 53:53/udp bind:9.11.3
testrun: ## test the image using loopback
    sudo docker run -it --name bind --cap-add DAC_READ_SEARCH --cap-add SYS_RESOURCE --restart=always -p 127.0.0.1:53:53/tcp 127.0.0.1:53:53/udp bind:9.11.3
runbash: ## run bash in the bind image without run named
    sudo docker run -it --name bind --cap-add DAC_READ_SEARCH --cap-add SYS_RESOURCE bind:9.11.3 bash
attach: ## attach stdio of the bind container
    sudo docker attach bind
execbash: ## run bash in running bind container
    sudo docker exec -it bind bash
rm: ## remove the bind container
    sudo docker rm -f bind
rmi: ## remove the bind image
    sudo docker rmi bind:9.11.3
cpconf: ## copy config files to the bind container
    sudo docker cp ./named.conf bind:/var/named/chroot/etc/
    sudo docker cp ./zones bind:/var/named/chroot/var/named/
start: ## start the bind container and attach
    sudo docker start -a bind
stop: ## stop the bind container
    sudo docker stop bind
restart: ## restart the bind container and attach
    sudo docker restart bind
kill: ## kill the bind container
    sudo docker kill bind
logs: ## view stdlogs
    sudo docker logs bind

 

まとめ

dockerを使える環境が必要にはなりますが、内向きDNSを立てたりする場合に使えるのではないかと思います。

実はmake testを通すのに少し苦労しました。

 

ではでは

  • LINEで送る

コメントを残す

*