也许你在浏览网站文章时总是被弹出广告所打扰。有了那么多广告,如何屏蔽它们呢?在Docker中安装Pi-hole,并将Pi-hole用作全网络广告拦截器,提高网络性能。
在本教程中,你将学习如何在Docker容器中设置和运行Pi-hole来拦截广告和网站。听起来很激动人心吗?继续阅读了解更多!
先决条件
本教程将进行实际演示。如果你想跟着做,请确保你具备以下条件:
- 在Windows 10上安装了
- A Windows 10 PC – This tutorial uses Windows 10 OS Build 19042.1165.
的Docker(但任何受支持的操作系统都可以)。创建两个持久性Docker卷
在Docker容器中设置Pi-hole时,你首先需要创建一个Docker卷来存储Pi-hole应用程序和DNS配置。
打开PowerShell以管理员身份运行,然后运行以下命令以在Docker中创建两个卷(volume create
),分别命名为pihole_app
和dns_config
。您也可以根据您的喜好更改名称。
接下来,通过运行以下命令验证Docker卷是否已成功创建,该命令列出了在您的计算机上可用的所有Docker卷。
在下面,您会看到两个新创建的卷,分别命名为pihole_app
和dns_config
。

在Docker容器中使用环境变量运行Pi-hole
现在您有了两个持久性卷,可以准备使用Pi-hole的基本Docker镜像运行Docker容器。但首先,您需要记录您的本地IP地址。
运行以下命令获取您的本地IP地址。在正确运行单个Docker命令时,您的本地IP地址是必需的。
接下来,运行以下命令从Docker Hub拉取pihole/pihole
基础镜像。请使用下表中的值进行相应替换,该表解释了命令用途的每个标志。
Pi-hole Docker命令标志
Command Flags | Definition |
—name=pihole | Names a Docker container as pihole. There will be an error if a container with the same name already exists on your machine |
-e TZ=Asia/Manila | Environment variable for time zone. Asia/Manila was used for this tutorial, but you can input anything that has the same format listed in on a GitHub gist. |
-e WEBPASSWORD=password | Sets a password for the Pi-hole interface. |
-e SERVERIP=YourIPAddressHere | Set your IP address for the Docker container. You will use this again later for making Pi-hole work. |
-v pihole_app:/etc/pihole | Mounts the volume pihole_app and use subdirectory /etc/pihole for storing the Pi-hole files |
-v dns_config:/etc/dnsmasq.d | Mounts the volume dns_config and use subdirectory /etc/dnsmasq.d for storing DNS configurations as required. |
p 81:80 -p 53:53/tcp -p 53:53/udp | Maps the ports of host machine to the ports of the Docker container (port 81 in host machine maps to port 80 of Docker container) |
—restart=unless-stopped | Sets a restart policy so the Docker container always restarts unless it is manually stopped by the user. |
pihole/pihole | Tells the docker run command to use the official pihole/pihole base image from Docker hub. |
下面是命令从Docker Hub拉取pihole/pihole
基础镜像。一旦在您的机器上下载了pihole/pihole
镜像,命令会自动继续并按照您在命令中设置的参数进行。

在拉取pihole/pihole
基础镜像后,您将看到以下输出,这表明您可以从容器中立即运行Pi-hole仪表板。

访问Pi-hole仪表板Web界面
一旦您创建的Docker容器正在运行,您现在可以访问Pi-hole仪表板了。 Pi-hole仪表板是一个图形界面,允许您通过您自己的黑名单或社区维护的黑名单来配置要阻止的广告。
在浏览器中导航至http://localhost:81,因为您先前将主机机器的端口81
映射到了Docker容器的端口80
。这样做,您的网络浏览器将页面重定向到Pi-hole仪表板。
如果在运行先前的
docker
命令时设置了不同的端口,请更改端口以访问Pi-hole仪表板。例如,http://localhost:n,其中’n’代表端口号。
现在,请使用在“使用环境变量运行Pi-hole Docker容器”部分中运行的docker
命令设置的密码登录Pi-hole仪表板。对于本教程,密码是“password”(不带引号)。

如下所示,Pi-hole容器未主动阻止广告,并处于待机模式,等待所谓的“查询”或广告请求进行评估。

将主机的DNS服务器指向Pi-hole IP地址
在Pi-hole服务器运行时,如何在本地系统上开始阻止广告?您需要告诉本地系统将所有请求路由到Pi-hole IP地址,并阻止任何匹配的广告。继续阅读以了解详情!
1. 右键单击Windows系统托盘中的网络设置图标,选择打开网络与互联网设置以查看计算机中所有网络适配器的列表。

2. 接下来,右键单击您的网络适配器,并选择属性。您的网络适配器设置窗口将弹出。

3. 从Networking选项卡下的列表中选择Internet Protocol Version 4 (TCP/IPv4),然后单击属性按钮。

4. 使用以下配置IPv4属性:
- 选择选项使用以下IP地址设置静态IP地址。将静态IP分配给主机允许其他设备连接并使用广告拦截器。路由器的默认网关取决于您所在国家/地区ISP提供商的设置。
- 选择“使用以下 DNS 服务器地址”选项配置您的 DNS 服务器,并在“首选 DNS 服务器”字段中添加一个 DNS 服务器。在“使用环境变量运行 Pi-hole Docker 容器”部分下,输入您从前一个 `docker` 命令设置的 Docker 服务器 IP 地址。
- 在“备用 DNS 服务器”字段中添加类似 Google 服务器 8.8.8.8 的备用服务器,并单击“确定”。备用 DNS 服务器可用作 DNS 服务器,以防 Pi-hole Docker 容器因某种原因而关闭。您可以为备用 DNS 服务器指定您喜欢的其他值。

配置单个设备的 DNS
假设您的智能手机或任何其他设备连接到同一网络,则可以将该设备的 DNS 服务器指向与主机的 IP 地址相匹配。在本教程中,智能手机连接到同一网络。
1. 在智能手机的无线网络设置中,点击手动并输入主机机器的 IP 地址。您还可以在 Pi-hole 失效时添加备用 IP 地址。
智能手机上的无线网络设置界面各不相同。

2. 现在在您的智能手机的 Web 浏览器中访问一些广告丰富的网站。
对于这个例子,Daily Mail和New York Times的网站被反复访问了5-10分钟。Pi-hole仪表板上的实时浏览器管理员显示了从设备屏蔽的广告数量,如下所示。
条形图是在撰写本文时Pi-hole最新版本的最新添加。一些旧版本使用线性图。

通过路由器设置启用家庭网络范围的阻止
与在单个设备上配置DNS服务器不同,尝试在路由器设置中为所有设备配置DNS服务器。根据您的路由器,可能会或可能不会提供使用IP地址的设置。
对于这个演示,路由器不允许更改DNS服务器和DHCP的访问。因此,由于路由器的限制,本教程未完全探讨家庭网络。
在示例管理员视图中,您可以以与在单个设备上进行的方式相同的方式对DNS服务器IP进行编码。此演示使用锁定到ISP的Prolink PRS1841U-v2路由器。
DNS配置界面因路由器而异,但设置看起来像下面这样。

你也可以在路由器中禁用DHCP服务器,然后在Pi-hole中启用DHCP服务器。在Pi-hole社区的示例讨论“>示例讨论中有更详细的说明。
通过Pi-hole仪表板阻止网站
Pi-hole的默认安装默认阻止大约92,725个网站,但您还可以通过Pi-hole制作者提供的黑名单“>黑名单和其他Pi-hole粉丝分享的列表“>列表添加更多网站。
1. 将要阻止的网站保存在文本文件中,并使用您喜欢的名称。在此示例中,文件名为blocklist.txt。
2. 运行以下docker
命令,将blocklist.txt文件(cp blocklist.txt
)复制到Docker容器的卷中,文件名为blacklist.txt。将blacklist.txt文件保留在Docker卷上,以便Pi-hole将自动检测到它。
最后,再次导航到 Pi-hole 管理面板。点击左侧面板中的 工具 菜单,然后点击 更新 Gravity 链接。最后,点击 更新 以获取 Pi-hole 阻止的 URL 的更新列表。

A successful update will look like the one below.

通过控制台更新网站的屏蔽列表
也许您更喜欢通过控制台命令而不是导航到 Pi-hole 仪表板。如果是这样,您可以在 PowerShell 中运行 Docker 命令来屏蔽网站。运行下面的 docker exec
命令以创建与 pihole_app
Docker 容器的交互式终端会话,这允许运行命令。
一旦终端会话打开,请运行下面的命令以更新 Pi-hole 的 URL 黑名单。
不时重新运行
pihole -g
,以确保您的广告拦截器保持更新。
通过社区维护的 URL 黑名单屏蔽网站
一些 URL 是由其贡献者定期更新的,而有些则不是,因此上传来自旧列表的黑名单可能不会反映最新的更改。
利用 Pi-hole 的 Adlist 阻止列表组管理功能。在 Pi-hole 仪表板上,点击左侧面板的 组管理 → 广告列表 菜单,然后点击 添加 以选择要在 Pi-hole 中添加的 URL 列表。

结论
在本教程中,您学习了如何下载 Pi-Hole Docker 镜像,测试活动监听 Pi-hole Web 界面,测试外部设备连接到 Pi-hole。您还学习了如何阻止广告和网站,看到了 Pi-hole 仪表板在阻止它们时的实际效果。
有了这些知识,为什么不利用任何主机来阻止同一网络中其他连接的设备的广告呢?