在我的网络中,我有一个小型 docker swarm 运行着几个应用程序。最近我尝试设置两个新服务,使用 ispcpd 提供 DHCP,使用不绑定到网络的 DNS。
集群的主人是一台新的 QNAP NAS,它控制着几台 Pi3(为了保证可用性,SDCard 有时会在 24/7 使用过程中崩溃)。DHCP 已启动并运行,但无法在端口 53 上启动 DNS,因为此端口已被 QNAP 上的 dnsmasq 阻止。QNAPs Container station 中的 docker/lxc 实现与 dnsmasq 配合使用,为容器网络中的 dhcp/dns 服务。因此,此端口被阻止。我可以在其他端口上运行它,比如说 54。但据我从文档中看到,在 DHCP 选项中,我只能列出 dns 服务器,但没有端口规范。
有没有办法将 DNS 服务器与端口信息一起公布?
答案1
正如迈克尔·汉普顿所说,我无法为 DNS 公布特定端口。
因为我不想更改 QNAPs dnsmasq-config(每次包更新时都会丢失),所以我在 docker swarm 中的其他节点(而不是 QNAP 本身)上安装了 systemd 服务,并将 dns 作为本地容器启动。
这样,qnap 就不会尝试绑定主机端口 53,因为容器不在 Swarm 范围内运行。
有点话题,但这是我用于该服务的脚本:
#
# Docker + unbound DNS systemd service
#
# This service aims to make the update and invocation of the docker-dns
# container seemless. It automatically downloads the latest docker-dns
# image and instantiates a Docker container with that image. At shutdown it
# cleans-up the old container.
#
# In the event the service dies (crashes, or is killed) systemd will attempt
# to restart the service every 10 seconds until the service is stopped with
# `systemctl stop docker-dns@NAME`.
#
# To use:
# 1. Create a Docker volume source folder named `NAME` in DATA_SRC path where NAME is the
# user's choice to describe the use of the container.
# 2. Download this service file to /etc/systemd/system/[email protected]
# 3. Enable and start the service template with:
# `systemctl enable --now [email protected]`
# 4. Verify service start-up with:
# `systemctl status [email protected]`
# `journalctl --unit [email protected]`
#
# For more information, see the systemd manual pages.
#
[Unit]
Description=unbound DNS Docker Container
Documentation=
After=network.target docker.socket
Requires=docker.socket
[Service]
RestartSec=10
Restart=always
Environment="NAME=dns-%i"
Environment="DATA_VOL=/mnt/nas/dns/%i"
Environment="IMG=192.168.0.65:6088/unbound:latest"
# To override environment variables, use local configuration directory:
# /etc/systemd/system/[email protected]/local.conf
# http://www.freedesktop.org/software/systemd/man/systemd.unit.html
# Clean-up bad state if still hanging around
ExecStartPre=-/usr/bin/docker rm -f $NAME
# Attempt to pull new image for security updates
ExecStartPre=-/usr/bin/docker pull $IMG
# Main process
ExecStart=/usr/bin/docker run --rm -v ${DATA_VOL}:/usr/local/etc/unbound.zones.d.src --name ${NAME} -p 53 -p 53/udp --net=host ${IMG} $
[Install]
WantedBy=multi-user.target