#!/bin/bash
echo "=== 开始配置 CoreDNS ==="
# 内部固定端口
DNS_PORT=53
# 生成随机端口的函数
generate_random_port() {
local port
while true; do
port=$(shuf -i 10000-65535 -n 1)
if ! netstat -tuln 2>/dev/null | grep -q ":$port "; then
echo "$port"
return 0
fi
done
}
# 检查本地配置
if [ -d "coredns-data" ]; then
echo "警告:检测到本地已存在 CoreDNS 配置"
read -p "是否清除现有配置并重新初始化?(y/N) " answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
echo "清理现有配置..."
rm -rf coredns-data Corefile docker-compose.yml
echo "现有配置已清理"
else
echo "保留现有配置,退出脚本"
exit 0
fi
fi
echo "1. 生成随机端口..."
EXTERNAL_DNS_PORT=$(generate_random_port)
echo "外部 DNS 端口: $EXTERNAL_DNS_PORT"
echo "2. 创建本地配置目录..."
mkdir -p coredns-data
echo "目录创建完成"
echo "3. 创建 CoreDNS 配置文件..."
cat > Corefile << EOL
. {
bind 0.0.0.0
forward . 8.8.8.8 8.8.4.4 {
prefer_udp
health_check 5s
}
cache 30
reload
log
errors
loadbalance
}
EOL
echo "CoreDNS 配置文件创建完成"
echo "4. 创建 docker-compose.yml..."
cat > docker-compose.yml << EOL
services:
coredns:
image: coredns/coredns:latest
container_name: coredns
restart: unless-stopped
ports:
- "\${EXTERNAL_DNS_PORT}:${DNS_PORT}/udp"
- "\${EXTERNAL_DNS_PORT}:${DNS_PORT}/tcp"
volumes:
- ./Corefile:/Corefile
- ./coredns-data:/data
command: -conf /Corefile
networks:
- dns-network
networks:
dns-network:
driver: bridge
external: false
EOL
cat > .env << EOL
EXTERNAL_DNS_PORT=$EXTERNAL_DNS_PORT
EOL
echo "配置文件创建完成"
echo "5. 创建管理脚本..."
cat > manage-dns.sh << EOL
#!/bin/bash
source .env
test_dns() {
echo "测试 DNS 解析..."
if dig @localhost -p \$EXTERNAL_DNS_PORT example.com +short; then
echo "DNS 解析测试成功"
return 0
else
echo "DNS 解析测试失败"
return 1
fi
}
case \$1 in
start)
echo "启动 CoreDNS..."
docker compose down --remove-orphans 2>/dev/null
docker compose up -d
echo "CoreDNS 已启动"
echo "外部 DNS 端口: \$EXTERNAL_DNS_PORT"
sleep 2
test_dns
;;
stop)
echo "停止 CoreDNS..."
docker compose down
;;
restart)
echo "重启 CoreDNS..."
docker compose restart
sleep 2
test_dns
;;
status)
docker compose ps
;;
logs)
docker compose logs -f
;;
test)
test_dns
;;
*)
echo "用法: \$0 {start|stop|restart|status|logs|test}"
;;
esac
EOL
chmod +x manage-dns.sh
echo "管理脚本创建完成"
echo "=== CoreDNS 配置完成! ==="
echo "外部 DNS 端口: $EXTERNAL_DNS_PORT"
echo "你可以:"
echo "1. 编辑 Corefile 修改 DNS 配置"
echo "2. 编辑 docker-compose.yml 修改容器配置"
echo "3. 使用 './manage-dns.sh start' 启动服务"
echo "管理命令:"
echo "- ./manage-dns.sh start # 启动服务"
echo "- ./manage-dns.sh stop # 停止服务"
echo "- ./manage-dns.sh restart # 重启服务"
echo "- ./manage-dns.sh status # 查看状态"
echo "- ./manage-dns.sh logs # 查看日志"
echo "- ./manage-dns.sh test # 测试 DNS 解析"
# 询问是否立即启动服务
read -p "是否立即启动 CoreDNS?(y/N) " answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
echo "启动 CoreDNS..."
docker compose up -d
echo "CoreDNS 已启动!"
echo "外部 DNS 端口: $EXTERNAL_DNS_PORT"
sleep 2
./manage-dns.sh test
fi 上一篇
【教程】安装Harbor【教程】安装Harbor
2025-10-18
下一篇
【脚本】设置 Ubuntu IP 静态地址【脚本】设置 Ubuntu IP 静态地址
2025-09-22