docker快速部署DNS,实现快速上线

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: docker快速部署DNS,实现快速上线

概念


Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。这里我将使用docker容器快速部署DNS域名解析服务器,并实现快速上线


环境介绍


1. DNS服务器主机:172.18.0.2 域名:dns.jkyst.xyz

2. 客户端机器:172.18.0.3 域名:client1.jkyst.xyz

3. 客户端机器:172.18.0.4 域名:client2.jkyst.xyz


部署DNS


这里说一下DNS服务是由bind软件包提供的,如果不想使用docker进行部署,也可以进行安装bind相关软件包进行部署


下载相关镜像


下载镜像可以使用下面命令进行下载:

docker search 镜像名    //查找相关镜像
docker    pull    镜像名    //下载相关镜像
经过查找之后选择适合自己的版本
root@ubuntu:~# docker search dns
  NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  andyshinn/dnsmasq My dnsmasq brings all the boys to the yard, … 190 [OK]
  jpillora/dnsmasq dnsmasq with a web UI 89 [OK]
  gists/dnscrypt-proxy A flexible DNS proxy, with support for encry… 18 [OK]
  tutum/dnsutils Provides DNS utilities like dig and nslookup 13 [OK]
  defreitas/dns-proxy-server Solve your DNS hosts from docker containers,… 13 [OK]
  jedisct1/dnscrypt-server A non-censoring, non-logging, DNSSEC-capable… 11 [OK]
  certbot/dns-route53 Official build of EFF's Certbot with its plu… 10 [OK]
root@ubuntu:~# 
下载相关镜像
root@ubuntu:~# docker pull andyshinn/dnsmasq
  Using default tag: latest
  latest: Pulling from andyshinn/dnsmasq
  1eae7a7426b0: Pull complete 
  4e20cc818d2e: Pull complete 
  Digest: sha256:dbd1c08714ee9d7a3edb2729eac7e4bea3b88553f14c4d7821526d612437e0b4
  Status: Downloaded newer image for andyshinn/dnsmasq:latest
  docker.io/andyshinn/dnsmasq:latest
  root@ubuntu:~# docker images
  REPOSITORY TAG IMAGE ID CREATED SIZE
  andyshinn/dnsmasq latest 831c17422076 20 months ago 4.88MB
root@ubuntu:~#

上面镜像是官方提供的相关镜像,因为hub在国外所以有些镜像下载起来比较慢,所以我这里提供了一些国内的镜像


杭州地区:registry.cn-hangzhou.aliyuncs.com/stqc/


北京地区:registry.cn-beijing.aliyuncs.com/stqc/


官网(docker hub):由于是官网地址可以直接使用:`docker search blxt`进行搜索即可**


注意:由于镜像无法提供相关列表名称,大家可以使用`docker search blxt`进行搜索后,镜像名加上面国内地址就可以进行国内地址下载了,下面我给大家列了一个例子

root@ubuntu:~# docker search blxt    //查看都有哪些镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
blxt/nginx 基于centos8制作的镜像 0 
blxt/tomcat 基于centos8的tomcat9 0 
blxt/mariadb 基于centos8制作的镜像 0 
blxt/mysql-proxy 基于centos8制作的镜像 0 
blxt/dns 基于ubuntu的DNS版本bind9 0 
blxt/ubuntu ubuntu19 0 
root@ubuntu:~# docker pull registry.cn-beijing.aliyuncs.com/stqc/dns    //下载DNS镜像
Using default tag: latest
latest: Pulling from stqc/dns
da6fc00e4d0b: Already exists 
c3c0be9d84b3: Already exists 
9c1dda927878: Already exists 
4b8880231fa0: Already exists 
a7d3d4ea8ca6: Already exists 
6193a51f16ce: Pull complete 
Digest: sha256:25309761b9b046549b3488960d518fd234367748c899e2e3a58265f2c9cbc8f3
Status: Downloaded newer image for registry.cn-beijing.aliyuncs.com/stqc/dns:latest
registry.cn-beijing.aliyuncs.com/stqc/dns:latest
root@ubuntu:~# docker images    //查看所有本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-beijing.aliyuncs.com/stqc/dns latest c24136df62ae 2 hours ago 376MB
blxt/ubuntu latest 182d872a6abe 5 weeks ago 327MB
root@ubuntu:~#

到这里镜像就下载成功了


创建并启动DNS容器


简单介绍三种创建方式


创建容器一般有三种创建方式,下面我简单介绍下这三种启动方式:交互式、命令短暂模式以及daemon方式

1. 交互式

这种方式可以让我们直接打印一些数据出来,比如:容器的ip地址

root@test:~# docker run registry.cn-beijing.aliyuncs.com/stqc/dns ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@test:~# 
也可以让我们来一个bash的交互终端
root@test:~# 
root@test:~# docker run -it registry.cn-beijing.aliyuncs.com/stqc/dns /bin/bash
root@b9bc496a5028:/# //这是提供的交互式终端,类似于ssh连接

2. 命令短暂模式

先让我们使用容器进行打印一些东西

root@test:~# docker run registry.cn-beijing.aliyuncs.com/stqc/dns /bin/echo "hello word"
hello word    //可以将我所写的打印出来
root@test:~# 
但是打印完成后,容器并没有消失
root@test:~# docker ps -a    //查看所有容器,可以看到这个容器是存在的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5889013ad2fd registry.cn-beijing.aliyuncs.com/stqc/dns "/bin/echo 'hello wo…" About a minute ago Exited (0) About a minute ago optimistic_gould
root@test:~# 
让我们再将容器重新启动,会发现未出现hello word字样
root@test:~# docker start optimistic_gould //启动容器
optimistic_gould    //发现打印出来的是容器的名称
root@test:~# 
如果我们像让他重新打印hello word,我们就要执行下面命令了
root@test:~# docker logs optimistic_gould //此命令是再次执行容器
hello word
hello word
root@test:~#

这样就可以看到两个hello word了

3. daemon模式

daemon模式也叫守状态模式,也就是说让软件作为长时间服务运行!

我们来举例说明:

root@test:~# docker run -d registry.cn-beijing.aliyuncs.com/stqc/dns /bin/sh -c "while true; do echo hello word; sleep 1;done"    //每一秒执行一次
c334e679b334d64dae25f1f6193550cf029135496e3c4ea9f355ee263a326837
root@test:~# docker ps -a    //查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c334e679b334 registry.cn-beijing.aliyuncs.com/stqc/dns "/bin/sh -c 'while t…" 17 seconds ago Up 14 seconds dazzling_mccarthy
root@test:~# docker logs dazzling_mccarthy //打印容器的输出
hello word
hello word
hello word
root@test:~# docker attach dazzling_mccarthy //实时查看容器输出
hello word
hello word
hello word

容器启动停止


1.启动容器

root@test:~# docker start 容器ID/容器名

2.重启容器

root@test:~# docker restart 容器ID/容器名

3.关闭容器

root@test:~# docker stop 容器ID/容器名

 

创建dns交互式容器

root@test:~# docker run -itd --name dns --privileged registry.cn-    beijing.aliyuncs.com/stqc/dns /sbin/init    //以init的交互式模式进行创建,并自动启动
fbc5c6c1a26920bb94a5963cb7c7867e106f3f67ffb84c055849e332006c9077
root@test:~# docker exec -it dns /bin/bash    //连接到容器并生成bash交互式
root@fbc5c6c1a269:/# //dns容器的命令行


配置DNS容器相关配置


DNS容器已经配置完成,接下来就该配置DNS的一些配置了,比如正向解析的配置文件等

修改/etc/bind/named.conf.default-zones配置文件,配置如下:

//在配置文件中增加下面内容
zone "jkyst.xyz" {
type master;
file "/etc/bind/db.jkyst";
};
//创建正向解析数据文件db.jkyst
root@fbc5c6c1a269:/etc/bind# touch db.jkyst
//在数据文件中添加以下内容,下面为解析内容,建议按照实际情况填写
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA www.jkyst.xyz. root.jkyst.xyz. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
IN NS www.jkyst.xyz.    //www域名
IN MX 10 root.jkyst.xyz.    //邮件域名
dns IN A 172.18.0.2    //DNS域名所对应的IP
client1 IN A 172.18.0.3    //客户端1域名所对应的IP
client2 IN A 172.18.0.4    //客户端2域名所对应的IP
root    IN    A    172.18.0.2    //邮件域名所对应的IP
//配置完成后,重新启动DNS,可以重新启动容器也可以重新启动bind服务,下面我直接启动bind服务了
root@fbc5c6c1a269:/etc/bind# systemctl restart bind9    
//重启后,查看53号端口是否正在运行
root@fbc5c6c1a269:/etc/bind# netstat -anpl | grep named
tcp 0 0 172.18.0.2:53 0.0.0.0:* LISTEN 394/named 
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 394/named 
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 394/named 
tcp6 0 0 :::53 :::* LISTEN 394/named 
udp 0 0 172.18.0.2:53 0.0.0.0:* 394/named 
udp 0 0 127.0.0.1:53 0.0.0.0:* 394/named 
udp6 0 0 :::53 :::* 394/named 
unix 2 [ ] DGRAM 105734 394/named

启动成功,到这里我们的DNS配置就算做完了,下面我们进行测试


测试


我这里测试时使用了两个客户端主机,分别是client1以及client2


修改客户端默认DNS地址


修改DNS默认的地址有下面两个方法:


1.第一种是修改resolv.conf系统配置文件来进行修改,修改内容如下:

nameserver 172.18.0.2    //修改ip地址为你dns的IP地址

2.第二种是修改网络配置文件,在网络配置文件种增加下面项(注意ubuntu无法使用此步骤):

网络配置文件路径:/etc/sysconfig/network-script/ifconf-eth0

网络配置文件如下:

DEVICE=eth0    //网卡名称
ONBOOT=yes    //是否开机加载
BOOTPROTO=static    //设置静态ip
NETMASK=255.255.255.0    //子网掩码
IPADDR=172.18.0.3    //ip地址
GATEWAY=172.18.0.1    //网关
DNS1=172.18.0.2 //DNS

ubuntu修改配置文件设置DNS

network:
version: 2    
renderer: networkd    
ethernets:
enp0s3:    //网卡名称
dhcp4: false    //是否自动获取
addresses: [192.168.1.142/24]    //ip地址以及掩码
gateway4: 192.168.1.1    //网关
nameservers:    //下面是指定的DNS地址
addresses: [172.18.0.2]

配置完成后就可以让我们进行测试了


使用nslookup进行测试


nslookup是一种网络管理命令行工具,可用于查询DNS域名和IP地址输入指令nslookup默认服务器和Address是当前上网所用的DNS服务器域名和地址A记录A(Address)记录指的是用来指定主机名或域名对应的IP记录。

这次测试我就用nslookup进行测试了,如果大家觉得不太好,大家还可以配置web服务进行测试呦,在这里我就不进行web演示了

客户端1进行测试:

root@client1:~# nslookup dns.jkyst.xyz
Server:    172.18.0.2
Address:    172.18.0.2#53
Name:    dns.jkyst.xyz
Address: 172.18.0.2
root@client1:~# nslookup client1.jkyst.xyz
Server:    172.18.0.2
Address:    172.18.0.2#53
Name:    client2.jkyst.xyz
Address: 172.18.0.4
root@client1:~#

客户端2进行测试:

root@client2:~# nslookup dns.jkyst.xyz
Server:    172.18.0.2
Address:    172.18.0.2#53
Name:    dns.jkyst.xyz
Address: 172.18.0.2
root@client2:~# nslookup client1.jkyst.xyz
Server:    172.18.0.2
Address:    172.18.0.2#53
Name:    client2.jkyst.xyz
Address: 172.18.0.4
root@client2:~#

ok确定没有问题


上线


下面就说说如何将之前的docker配置的dns服务器快速上线


1.将容器生成为镜像

root@test:~# docker commit dns dns:latest    //生成镜像
sha256:660da4ca051f00aa2a459d030766a2c59a3a5338dd2e754a2aa109ebf49e1cf3
root@test:~# 
查看镜像是否生成
root@test:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dns latest 660da4ca051f 40 seconds ago 431MB
registry.cn-beijing.aliyuncs.com/stqc/dns latest c24136df62ae 26 hours ago 376MB
root@test:~#

2.将镜像另存为

root@test:~# docker save -o dns.tar dns:latest    //将容器报存为文件
root@test:~# ls    //查看是否有相关文件
dns.tar
root@test:~#

3.将镜像文件放到正式服务器,并启动容器

将镜像文件进行导入到docker

root@dns:~# docker load -i dns.tar //将镜像文件导入docker
dfc7a90ce923: Loading layer [==================================================>] 74.23MB/74.23MB
020f1d32db77: Loading layer [==================================================>] 989.2kB/989.2kB
de2a5db5a95c: Loading layer [==================================================>] 15.36kB/15.36kB
f6bc8c0eecde: Loading layer [==================================================>] 3.072kB/3.072kB
e7591d8092df: Loading layer [==================================================>] 260.4MB/260.4MB
0c6c54fbd833: Loading layer [==================================================>] 49.53MB/49.53MB fa7d6002eff3: Loading layer [==================================================>] 57.27MB/57.27MB Loaded image: dns:latest root@dns:~# docker images //查看是否导入成功 REPOSITORY TAG IMAGE ID CREATED SIZE dns latest 6cff411803cd 8 minutes ago 431MB root@dns:~# 
创建容器并进行启动
root@dns:~# docker run --name dns -p 53:53 -v /opt/bind:/etc/bind -d dns:latest    
655b2a7de6501cb9edd9667a38ca09e9c36d614efcfbcfbe115f5a60aba3fd1b
root@dns:~# docker ps -a    //查看是否启动成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
944b9f9f4e5e dns:latest "/sbin/init" 13 seconds ago Up 10 seconds dns
root@dns:~#

启动成功后进行测试:

root@dns:~# nslookup dns.jkyst.xyz
Server:    172.18.0.2
Address:    172.18.0.2#53
Name:    dns.jkyst.xyz
Address: 172.18.0.2
root@dns:~# nslookup client1.jkyst.xy
Server:    172.18.0.2
Address:    172.18.0.2#53
Name:    client2.jkyst.xyz
Address: 172.18.0.4
root@dns:~#

OK解析成功

到这里就已经完成了

目录
打赏
0
1
1
0
120
分享
相关文章
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
269 91
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
8天前
|
在Docker上部署Ollama+AnythingLLM完成本地LLM Agent部署
通过以上步骤,您可以成功在Docker上部署Ollama和AnythingLLM,实现本地LLM Agent的功能。在部署过程中,确保环境和配置正确,以避免不必要的问题。希望本文能够帮助您顺利完成部署,并在本地环境中高效地使用LLM模型。
279 8
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
Stirling-PDF 是一款基于 Docker 的本地化 PDF 编辑工具,支持 50 多种 PDF 操作,包括合并、拆分、转换、压缩等,同时提供多语言支持和企业级功能,满足个人和企业用户的多样化需求。
106 6
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
220 44
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
61 19
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
81 1
|
3月前
|
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
322 76
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等