在Linux平台Docker容器中运行和使用Dnsmasq的方法

本文介绍在Linux平台Docker容器中运行和使用Dnsmasq的方法。

准备服务器及安装Docker

1、准备服务器

我们将首先在系统上安装所需的软件包:

##在RHEL/CentOS/RockyLinux 8上

sudo yum update

sudo yum install curl vim

##在Debian/Ubuntu上

sudo apt update && sudo apt upgrade

sudo apt install curl vim

##在Fedora上

sudo dnf update

sudo dnf -y install curl vim

其次,停止在端口53上运行的system-resolved服务。此端口将由Dnsmasq使用:

sudo systemctl stop systemd-resolved

sudo systemctl disable systemd-resolved

删除/etc/resolv.conf符号链接:

$ ls -lh /etc/resolv.conf 

-rw-r--r-- 1 root root 49 Feb 23 04:53 /etc/resolv.conf

$ sudo unlink /etc/resolv.conf

更新resolve conf文件:

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

允许端口53通过防火墙:

##用于防火墙

sudo firewall-cmd --permanent --add-port=53/udp

sudo firewall-cmd --reload

##对于UFW

sudo ufw allow 53

2、在Linux上安装Docker和Docker Compose

对于本文,您需要在Linux系统上安装Docker Engine。这可以通过以下指南中提供的帮助来实现:

如何在Ubuntu 22.04系统上安装Docker CE:https://www.hmxthome.com/linux/4941.html

确保Docker已启动并启用:

sudo systemctl start docker && sudo systemctl enable docker

此外,将系统用户添加到docker组:

sudo usermod -aG docker $USER

newgrp docker

同时,在完成后可以使用以下指南安装Docker Compose:

在Ubuntu 22.04/Debian 11上安装Docker Compose:https://www.hmxthome.com/linux/4942.html

为Dnsmasq创建永久卷

先完成在Ubuntu 22.04系统上安装和配置Dnsmasq,详细指南地址在https://www.hmxthome.com/linux/4918.html。

Dnsmasq读取/etc/dnsmasq中的所有.conf文件。对于本文,我们需要在系统上创建一个路径并相应地映射它。

在系统上创建目录并分配所需的权限:

sudo mkdir /etc/dnsmasq

sudo chmod -R 775 /etc/dnsmasq

此卷将用于存储所有配置文件。在基于Rhel-based的系统上,您需要将SELinux设置为许可模式,以便可以访问路径:

sudo setenforce 0

sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

在Docker容器中运行Dnsmasq

在Docker容器中运行Dnsmasq有两种方法,它们是:直接使用Docker引擎、使用Docker Compose。

在运行Dnsmasq容器之前,我们需要在/etc/dnsmasq中创建配置文件:

sudo vim /etc/dnsmasq/0.base.conf

在文件中,根据需要添加以下行替换:

#Define Port

port=53

domain-needed

bogus-priv

#dont use hosts nameservers

no-resolv

strict-order

#Use the default nameservers

server=8.8.8.8

server=8.8.4.4

expand-hosts

#serve all company queries using a specific nameserver

domain=dnsmasq.computingforgeeks.com

#explicitly define host-ip mappings

address=/apps.dnsmasq.computingforgeeks.com/192.168.205.11

address=/db.dnsmasq.computingforgeeks.com/192.168.205.12

address=/test.dnsmasq.computingforgeeks.com/192.168.205.13

在上述文件中,我的域名是dnsmasq.computingorgeeks.com和

192.168.205.11解析所有指向apps.dnsmasq.computingforgeks.com的请求,192.168.205.12解析db.dnsmasq.computingforgeeks.com,192.168.205.13解析test.dnsmasq.computingforgereks.com。

保存文件并按如下所示进行操作:

方法1:直接使用Docker引擎运行Dnsmasq

您可以使用Docker Engine直接运行Dnsmasq,命令如下:

docker run --detach --name dnsmasq \

   -p 53:53/udp \

            --cap-add=NET_ADMIN \

            -v /etc/dnsmasq/0.base.conf:/etc/dnsmasq.conf \

            strm/dnsmasq

在上述命令中:

–cap-add=NET_ADMIN:Dnsmasq需要与网络堆栈交互。

-p 53:53/udp映射DNS的udp端口。

-v /etc/dnsmasq/0.base.conf:/etc/dnsmasq.conf映射容器中的.conf文件文件夹。

容器启动后,可以使用以下命令进行验证:

$ docker ps

0e5bdc9a813d   strm/dnsmasq      "dnsmasq -k"     2 seconds ago   Up 1 second     53/tcp, 0.0.0.0:53->53/udp, :::53->53/udp   dnsmasq

方法2:使用Docker Compose运行Dnsmasq

您还可以使用Docker Compose运行Dnsmasq容器。首先,为容器创建一个YAML文件:

vim docker-compose.yml

在文件中,添加以下行:

version: '2'

services:

  dns:

    restart: always

    image: strm/dnsmasq

    container_name: dnsmasq

    volumes:

      - /etc/dnsmasq/0.base.conf:/etc/dnsmasq.conf

    ports:

      - "53:53/udp"

    cap_add:

      - NET_ADMIN

要启动容器,请使用以下命令:

docker-compose up -d

验证容器是否已打开:

$ docker ps

3e1d1a3a7c0d   strm/dnsmasq       "dnsmasq -k"       8 seconds ago   Up 6 seconds    53/tcp, 0.0.0.0:53->53/udp, :::53->53/udp   dnsmasq

接下来,可测试Dnsmasq功能。

现在我们需要验证配置的Dnsmasq是否响应请求。为此,我们将在localhost上使用以下命令:

dig db.dnsmasq.computingforgeeks.com

样本输出:

在Linux平台Docker容器中运行和使用Dnsmasq的方法

另一个例子:

$ dig test.dnsmasq.computingforgeeks.com A +noall +answer

test.dnsmasq.computingforgeeks.com. 0 IN A 192.168.205.13

要测试远程主机上的功能,我们需要修改网络配置以将服务器用作其DNS。

可以使用以下命令:

sudo nmcli connection modify enp6s18 ipv4.dns 192.168.205.11

sudo nmcli connection down enp6s18; sudo nmcli connection up enp6s18

记住用网络接口替换enp6s18,用Dnsmasq主机的IP地址替换192.168.205.11。

现在验证Dnsmasq是否正常工作:

在Linux平台Docker容器中运行和使用Dnsmasq的方法

将Dnsmasq配置为DHCP服务器(可选)

您还可以将Dnsmasq配置为DHCP服务器,以动态或静态地为客户端分配所需的地址。

在这种情况下,您需要修改创建的文件:

sudo vim /etc/dnsmasq/0.base.conf

在文件中,添加:

默认网关IP地址。

DNS服务器IP地址(可能是Dnsmasq或其他DNS服务器)。

网络子网掩码。

DHCP地址范围。

时间服务器。

参见以下示例:

dhcp-range=192.168.205.25,192.168.205.50,24h

dhcp-option=option:router,192.168.205.1

dhcp-option=option:ntp-server,192.168.3.11

dhcp-option=option:dns-server,192.168.3.11

dhcp-option=option:netmask,255.255.255.0

保存所做的更改并重新启动容器:

docker restart dnsmasq

管理Dnsmasq容器

您可以使用以下命令启动、停止和删除容器:

停止:

docker stop dnsmasq

开始时间:

docker start dnsmasq

删除:

docker rm dnsmasq

还可以通过创建系统服务将Dnsmasq容器配置为在系统启动时自动启动。

创建服务文件:

sudo vim /etc/systemd/system/dnsmasq_container.service

在文件中,添加以下行:

[Unit]

Description=Dnsmasq container

[Service]

Restart=always

ExecStart=/usr/bin/docker start -a dnsmasq

ExecStop=/usr/bin/docker stop -t 2 dnsmasq

[Install]

WantedBy=local.target

重新加载系统守护程序:

sudo systemctl daemon-reload

现在启动并启用服务:

sudo systemctl start dnsmasq_container

sudo systemctl enable dnsmasq_container

验证服务是否正在运行:

$ systemctl status dnsmasq_container

会返回Active: active (running)的状态。这标志着本指南关于如何在Docker容器中运行和使用Dnsmasq的完成。

栏目相关文章