こんばんにちは
今回は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を通すのに少し苦労しました。
ではでは