1. 程式人生 > >docker快速部署DNS,實現快速上線

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解析成功
到這裡就已經完成了

 

&n