使用瞭望塔?請參閱本自述文件底部有關守望台的註釋
自2023.01
起,如果您透過external.conf
檔案對 lighttpd 進行了任何修改,現在需要將該檔案對應到/etc/lighttpd/conf-enabled/whateverfile.conf
由於 Docker 和 libseccomp <2.5 的已知問題,您可能會在使用舊版libseccomp2
的主機系統(例如 Debian/Raspbian buster 或 Ubuntu 20.04,也許還有 CentOS 7)上執行2022.04
及更高版本時遇到問題。
第一個建議是升級您的主機作業系統,其中將包括更新的(和固定的)版本的libseccomp
。
如果您絕對無法做到這一點,一些用戶報告稱透過 debian 上的向後移植成功更新了libseccomp2
,或者透過 Ubuntu 上的更新進行了類似的操作。您可以自行承擔風險嘗試此解決方法(注意,您可能還會發現您需要最新的docker.io
(更多詳細資訊請參閱此處)
一些用戶報告了在2022.04
及更高版本上使用--privileged
標誌的問題。 TL;DR,不要使用該模式,並明確使用允許的上限(如果需要)
# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services :
pihole :
container_name : pihole
image : pihole/pihole:latest
# For DHCP it is recommended to remove these ports and instead add: network_mode: "host"
ports :
- " 53:53/tcp "
- " 53:53/udp "
- " 67:67/udp " # Only required if you are using Pi-hole as your DHCP server
- " 80:80/tcp "
environment :
TZ : ' America/Chicago '
# WEBPASSWORD: 'set a secure password here or it will be random'
# Volumes store your data between container upgrades
volumes :
- ' ./etc-pihole:/etc/pihole '
- ' ./etc-dnsmasq.d:/etc/dnsmasq.d '
# https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
cap_add :
- NET_ADMIN # Required if you are using Pi-hole as your DHCP server, else not needed
restart : unless-stopped
docker compose up -d
來建置並啟動 pi-hole (在舊系統上語法可能是docker-compose
)bridge
網路設置,請使用 Pi-hole Web UI 將 DNS 設定接口偵聽行為變更為「偵聽所有接口,允許所有來源」。 (這也可以透過將環境變數DNSMASQ_LISTENING
設定為all
來實現)這是一個等效的 docker run 腳本。
一個 Docker 項目,用於製作具有 Pi-hole 功能的輕量級 x86 和 ARM 容器。
該容器使用2個流行端口,端口53和端口80,因此可能與現有應用程式端口衝突。如果您沒有使用連接埠 53/80 的其他服務或 docker 容器(如果有,請繼續閱讀下面的反向代理範例),執行此容器所需的最少參數位於腳本 docker_run.sh 中
如果您使用的是具有 SELinux 強制政策的基於 Red Hat 的發行版,請新增:z
以與磁碟區對齊,如下所示:
-v "$(pwd)/etc-pihole:/etc/pihole:z"
-v "$(pwd)/etc-dnsmasq.d:/etc/dnsmasq.d:z"
建議使用磁碟區來跨容器重新建立保留資料以更新映像。 IP 尋找變數可能不適合所有人,請檢查它們的值並在必要時硬編碼 IP 和 IPv6。
您可以透過在呼叫docker_run.sh
時設定PIHOLE_BASE
環境變數來自訂儲存持久資料的位置(例如PIHOLE_BASE=/opt/pihole-storage ./docker_run.sh
)。如果未設定PIHOLE_BASE
,則當您呼叫腳本時,檔案將儲存在目前目錄中。
自動廣告清單更新- 自 3.0+ 版本以來, cron
被烘焙到容器中,並將獲取最新版本的清單並刷新日誌。設定您的 TZ環境變數以確保午夜日誌輪替與您所在時區的午夜同步。
有許多不同的方法可以在 Docker Pi-hole 容器內運行 DHCP,但它稍微高級一些,而且一種方法並不適合所有情況。我們的文件網站詳細介紹了 DHCP 和 Docker 的多種網路模式:Docker DHCP 和網路模式
如果您想在 docker 容器內自訂各種內容,還有其他環境變數:
多變的 | 預設 | 價值 | 描述 |
---|---|---|---|
TZ | 世界標準時間 | <Timezone> | 設定您的時區以確保日誌在當地午夜而不是 UTC 午夜輪換。 |
WEBPASSWORD | 隨機的 | <Admin password> | http://pi.hole/管理員密碼。運行docker logs pihole | grep random 找到你的隨機通道。 |
FTLCONF_LOCAL_IPV4 | 未設定 | <Host's IP> | 設定為伺服器的 LAN IP,由 Web 封鎖模式使用。 |
多變的 | 預設 | 價值 | 描述 |
---|---|---|---|
PIHOLE_DNS_ | 8.8.8.8;8.8.4.4 | IP 由; 分隔 | Pi-hole 轉送查詢的上游 DNS 伺服器,以分號分隔 (支援帶有 #[port number] 非標準連接埠)例如127.0.0.1#5053;8.8.8.8;8.8.4.4 (支援 Docker 服務名稱和鏈接,而不是 IP)例如 upstream0;upstream1 ,其中upstream0 和upstream1 是docker 服務的服務名稱或鏈接注意:此環境變數的存在假定這是上游 DNS 的唯一管理。透過 Web 介面新增的上游 DNS 將在容器重新啟動/重新建立時被覆蓋 |
DNSSEC | false | <"true"|"false"> | 啟用 DNSSEC 支持 |
DNS_BOGUS_PRIV | true | <"true"|"false"> | 切勿轉送私有範圍的反向查找 |
DNS_FQDN_REQUIRED | true | <"true"|"false"> | 切勿轉送非 FQDN |
REV_SERVER | false | <"true"|"false"> | 啟用 DNS 條件轉送以進行裝置名稱解析 |
REV_SERVER_DOMAIN | 未設定 | 網路網域 | 如果啟用條件轉發,請設定本機網路路由器的網域 |
REV_SERVER_TARGET | 未設定 | 路由器的IP | 如果啟用條件轉發,設定本地網路路由器的IP |
REV_SERVER_CIDR | 未設定 | 反向網域解析 | 如果啟用條件轉發,請設定反向 DNS 區域(例如192.168.0.0/24 ) |
DHCP_ACTIVE | false | <"true"|"false"> | 啟用 DHCP 伺服器。靜態 DHCP 租約可以使用自訂/etc/dnsmasq.d/04-pihole-static-dhcp.conf 進行配置 |
DHCP_START | 未設定 | <Start IP> | 由 DHCP 伺服器分發的 IP 位址範圍的開始(如果啟用了 DHCP 伺服器,則為強制項目)。 |
DHCP_END | 未設定 | <End IP> | DHCP 伺服器分發的 IP 位址範圍的結尾(如果啟用了 DHCP 伺服器,則為強制項目)。 |
DHCP_ROUTER | 未設定 | <Router's IP> | 由 DHCP 伺服器傳送的路由器(網關)IP 位址(如果啟用了 DHCP 伺服器,則為必填項)。 |
DHCP_LEASETIME | 24 | <hours> | DHCP 租用時間(以小時為單位)。 |
PIHOLE_DOMAIN | lan | <domain> | DHCP伺服器發送的網域名稱。 |
DHCP_IPv6 | false | <"true"|"false"> | 啟用 DHCP 伺服器 IPv6 支援 (SLAAC + RA)。 |
DHCP_rapid_commit | false | <"true"|"false"> | 啟用 DHCPv4 快速提交(快速位址分配)。 |
VIRTUAL_HOST | ${HOSTNAME} | <Custom Hostname> | 您的網站伺服器「虛擬主機」是什麼,透過此主機名稱/IP 存取管理允許您除了預設的「http://pi.hole/admin/」位址之外還可以更改白名單/黑名單 |
IPv6 | true | <"true"|"false"> | 為了實現 unraid 相容性,如果為 false,則從 DNS/Web 服務中刪除所有 IPv6 配置。 |
TEMPERATUREUNIT | c | <c|k|f> | 將首選溫度單位設定為c :攝氏度、 k :開氏度或f 華氏度單位。 |
WEBUIBOXEDLAYOUT | boxed | <boxed|traditional> | 使用盒裝佈局(在大螢幕上工作時很有幫助) |
QUERY_LOGGING | true | <"true"|"false"> | 是否啟用查詢日誌記錄。 |
WEBTHEME | default-light | <"default-dark"|"default-darker"|"default-light"|"default-auto"|"high-contrast"|"high-contrast-dark"|"lcars"> | 要使用的使用者介面主題。 |
WEBPASSWORD_FILE | 未設定 | <Docker secret path> | 使用 Docker 機密設定管理員密碼。如果設定了WEBPASSWORD ,則忽略WEBPASSWORD_FILE 。如果WEBPASSWORD 為空,且WEBPASSWORD_FILE 設定為有效的可讀檔案路徑,則WEBPASSWORD 將設定為WEBPASSWORD_FILE 的內容。 |
多變的 | 預設 | 價值 | 描述 |
---|---|---|---|
INTERFACE | 未設定 | <NIC> | 預設值適用於我們的基本範例 docker run 命令。如果您嘗試將 DHCP 與--net host 模式一起使用,那麼您可能必須自訂此選項或 DNSMASQ_LISTENING。 |
DNSMASQ_LISTENING | 未設定 | <local|all|single> | local 偵聽所有本機子網,除了本機之外, all 還允許偵聽 Internet 來源子網, single 僅偵聽指定的介面。 |
WEB_PORT | 未設定 | <PORT> | 這將破壞 Pi-hole 的「網頁被封鎖」功能,但它可能有助於進階設置,例如執行 Synology 或--net=host docker 參數的設定。本指南介紹如何使用 Linux 路由器 DNAT 規則恢復網頁被阻止的功能:替代 Synology 安裝方法 |
WEB_BIND_ADDR | 未設定 | <IP> | Lighttpd 的綁定位址。如果未設置,lighttpd 將綁定到每個接口,除非在主機網路模式下運行時它將使用FTLCONF_LOCAL_IPV4 代替。 |
SKIPGRAVITYONBOOT | 未設定 | <unset|1> | 使用此選項可以在啟動容器時跳過更新重力資料庫。預設情況下,未設定此環境變量,因此重力資料庫將在容器啟動時更新。將此環境變數設為 1(或任何值)將導致容器啟動時重力資料庫不會更新。 |
CORS_HOSTS | 未設定 | <FQDNs delimited by ,> | 允許 CORS 的域/子域的清單。不支援通配符。例如: CORS_HOSTS: domain.com,home.domain.com,www.domain.com 。 |
CUSTOM_CACHE_SIZE | 10000 | 數位 | 設定 dnsmasq 的快取大小。對於增加預設快取大小或將其設為 0 很有DNSSEC 。 |
FTL_CMD | no-daemon | no-daemon -- <dnsmasq option> | 自訂 dnsmasq 啟動的選項。例如no-daemon -- --dns-forward-max 300 以增加最大值。高負載設定上並發 DNS 查詢的數量。 |
FTLCONF_[SETTING] | 未設定 | 根據文件 | 使用 FTLDNS 設定頁面中所述的設定自訂 pihole-FTL.conf。例如,若要自訂 LOCAL_IPV4,請確保設定了FTLCONF_LOCAL_IPV4 環境變數。 |
多變的 | 預設 | 價值 | 描述 |
---|---|---|---|
DNSMASQ_USER | 未設定 | <pihole|root> | 允許更改 FTLDNS 運行的使用者。預設值: pihole ,某些系統(例如 Synology NAS)可能要求您將其變更為root (請參閱#963) |
PIHOLE_UID | 999 | 數位 | 覆寫影像的預設 pihole 使用者 ID 以符合主機使用者 ID 重要提示:id 不得已在容器內使用! |
PIHOLE_GID | 999 | 數位 | 覆寫影像的預設 pihole 群組 ID 以符合主機群組 ID 重要提示:id 不得已在容器內使用! |
WEB_UID | 33 | 數位 | 覆寫影像的預設 www-data 使用者 ID 以符合主機使用者 ID 重要提示:id 不得已在容器內使用! (如果您也使用 PIHOLE_UID,請確保它與 PIHOLE_UID 不同) |
WEB_GID | 33 | 數位 | 覆寫影像的預設 www-data 群組 ID 以符合主機群組 ID 重要提示:id 不得已在容器內使用! (如果您也使用 PIHOLE_GID,請確保它與 PIHOLE_GID 不同) |
WEBLOGS_STDOUT | 0 | 0|1 | 0 記錄到定義的文件,1 將存取和錯誤經驗重新導向到標準輸出 |
雖然這些可能仍然有效,但它們可能會在未來的版本中被刪除。在適用的情況下,會標示替代變數名稱。請查看上表以了解替代變數的用法
Docker 環境變數。 | 描述 | 替換為 |
---|---|---|
CONDITIONAL_FORWARDING | 啟用 DNS 條件轉送以進行裝置名稱解析 | REV_SERVER |
CONDITIONAL_FORWARDING_IP | 如果啟用條件轉發,設定本地網路路由器的IP | REV_SERVER_TARGET |
CONDITIONAL_FORWARDING_DOMAIN | 如果啟用條件轉發,請設定本機網路路由器的網域 | REV_SERVER_DOMAIN |
CONDITIONAL_FORWARDING_REVERSE | 如果啟用條件轉發,請設定本機網路路由器的反向 DNS(例如0.168.192.in-addr.arpa ) | REV_SERVER_CIDR |
DNS1 | 主要上游 DNS 提供者,預設為 google DNS | PIHOLE_DNS_ |
DNS2 | 第二上游 DNS 供應商,預設為 google DNS,如果只應使用一個 DNS, no | PIHOLE_DNS_ |
ServerIP | 設定為伺服器的 LAN IP,由 Web 封鎖模式和 lighttpd 綁定位址使用 | FTLCONF_LOCAL_IPV4 |
ServerIPv6 | 如果您將 v6 網路設定為伺服器的 LAN IPv6 以完全封鎖 IPv6 廣告 | FTLCONF_LOCAL_IPV6 |
FTLCONF_REPLY_ADDR4 | 設定為伺服器的 LAN IP,由 Web 封鎖模式和 lighttpd 綁定位址使用 | FTLCONF_LOCAL_IPV4 |
FTLCONF_REPLY_ADDR6 | 如果您將 v6 網路設定為伺服器的 LAN IPv6 以完全封鎖 IPv6 廣告 | FTLCONF_LOCAL_IPV6 |
若要以 docker run 格式使用這些環境變量,請使用下列樣式: -e DNS1=1.1.1.1
以下是 docker-compose / docker 運行的其他參數的概述。
Docker 參數 | 描述 |
---|---|
-p <port>:<port> 推薦 | 要公開的連接埠(53、80、67),Pi-holes HTTP 和 DNS 服務所需的最低連接埠 |
--restart=unless-stopped 受到推崇的 | 在啟動時或發生崩潰時自動(重新)啟動 Pi-hole |
-v $(pwd)/etc-pihole:/etc/pihole 受到推崇的 | Pi-hole 配置的磁碟區有助於在 docker 映像更新過程中保持更改 |
-v $(pwd)/etc-dnsmasq.d:/etc/dnsmasq.d 受到推崇的 | dnsmasq 配置的磁碟區有助於在 docker 映像更新中保留更改 |
--net=host 選修的 | 如果您不執行任何其他 Web 應用程序,則可以替代-p <port>:<port> 參數(不能與 -p 同時使用)。 DHCP 在 --net=host 下運作效果最佳,否則您的路由器必須支援 dhcp-relay 設定。 |
--cap-add=NET_ADMIN 受到推崇的 | 通常新增的 DHCP 功能,請參閱下面的「功能註釋」以了解其他功能。 |
--dns=127.0.0.1 選修的 | 將容器的解析設定設為 localhost,以便它可以從 Pi-hole 的 DNSMasq 解析 DHCP 主機名,可以修復容器重新啟動時的解析錯誤。 |
--dns=1.1.1.1 選修的 | 設定您選擇的備份伺服器,以防 DNSMasq 啟動出現問題 |
--env-file .env 選修的 | 用於儲存 docker 環境變數的文件,取代-e key=value 設定。這裡是為了方便 |
docker exec -it pihole_container_name pihole -a -p
- 然後在提示符號中輸入您的密碼-p 8080:80
。如果您使用的是舊版 IP 封鎖模式,則不應重新對應此連接埠。DEFAULT_HOST
env,並且您需要為 Pi-hole 的容器設定相符的VIRTUAL_HOST
。如果您遇到問題,請閱讀 nginxproxy/nginx-proxy 自述文件以取得更多資訊。bridge
將容器與主機網路隔離。這是一個更安全的設置,但需要將接口偵聽行為的 Pi-hole DNS 選項設置為「偵聽所有接口,允許所有來源」。Ubuntu (17.10+) 和 Fedora (33+) 的現代版本包括systemd-resolved
,預設配置為實作快取 DNS 存根解析器。這將阻止 pi-hole 偵聽連接埠 53 sudo sed -r -i.orig 's/#?DNSStubListener=yes/DNSStubListener=no/g' /etc/systemd/resolved.conf
這不會更改名稱伺服器設置,該設定指向存根解析器,從而阻止 DNS 解析。更改/etc/resolv.conf
符號連結以指向/run/systemd/resolve/resolv.conf
,連結會自動更新以遵循系統的netplan
: sudo sh -c 'rm /etc/resolv.conf && ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf'
進行這些更改後,您應該使用systemctl restart systemd-resolved
安裝 pi-hole 後,您需要設定客戶端以使用它(請參閱此處)。如果您使用上面的符號鏈接,您的 docker 主機將使用 DHCP 提供的任何服務,或您配置的任何靜態設定。如果您想要明確設定 docker 主機的名稱伺服器,您可以編輯/etc/netplan
中找到的 netplan,然後執行sudo netplan apply
。網路規劃範例:
network :
ethernets :
ens160 :
dhcp4 : true
dhcp4-overrides :
use-dns : false
nameservers :
addresses : [127.0.0.1]
version : 2
請注意,也可以完全停用systemd-resolved
。但是,這可能會導致 VPN 中的名稱解析出現問題(請參閱錯誤報告)。它還會停用 netplan 的功能,因為 systemd-resolved 被用作預設渲染器(請參閱man netplan
)。如果您選擇停用該服務,則需要手動設定名稱伺服器,例如透過建立新的/etc/resolv.conf
。
舊版 Ubuntu 版本(約 17.04)的使用者需要停用 dnsmasq。
@Rikj000 製作了一份指南來幫助用戶在 Dokku 上安裝 Pi-hole
下表解釋了主要的 docker 標籤。按一下此處查看標籤的完整清單。請參閱 GitHub 發行說明,以了解該發行版中包含的 Pi-hole Core、Web 和 FTL 的具體版本。
基於日期的(包括遞增的“補丁”版本)不涉及任何類型的語義版本號,而是使用日期來區分新版本和舊版本,僅此而已。發行說明將始終包含容器中更改的完整詳細信息,包括對核心 Pi-hole 組件的更改
標籤 | 描述 |
---|---|
latest | 始終最新版本 |
2022.04.0 | 基於日期的發布 |
2022.04.1 | 指定月份的第二次發布 |
dev | 與latest 類似,但針對開發分支(偶爾推送) |
*beta | 即將推出的版本的早期測試版 - 這裡是龍 |
nightly | 與dev 類似,但每天晚上都會推送並從核心 Pi-hole 元件(Pi-hole、web、FTL)的最新development 分支中提取 |
標準的 Pi-hole 自訂能力適用於此 docker,但也有 docker 的一些變化,例如使用 docker 磁碟區掛載來映射主機儲存的檔案配置到容器預設值上。但是,應避免將這些設定檔安裝為唯讀。如果您刪除了 Pi-hole 容器(這是典型的 Docker 升級模式),磁碟區對於保留配置也很重要。
不要嘗試升級 ( pihole -up
) 或重新配置 ( pihole -r
)。新的映像將被發布用於升級,透過用新的升級映像取代舊容器來進行升級是「docker方式」。長期存在的 docker 容器不是 docker 方式,因為它們的目標是可移植和可複製,為什麼不經常重新建立它們呢!只是為了證明你可以。
docker pull pihole/pihole
docker rm -f pihole
docker run <args> pihole/pihole
( <args>
是您首選的運行磁碟區和環境變數)為什麼這種升級方式好呢?有幾個原因:每個人都從同一個基礎鏡像開始,該鏡像已經過測試,知道它可以工作。推出更新時無需擔心從 A 升級到 B、從 B 升級到 C、或從 A 升級到 C,它降低了複雜性,並且每次都允許“全新開始”,同時保留卷的自定義設置。基本上我鼓勵您的容器採用 Phoenix 伺服器原則。
要重新配置 Pi-hole,您需要使用現有的容器環境變量,或者如果沒有滿足您需要的變量,請使用 Web UI 或 CLI 命令。
以下是 Pi-hole 文件中的一些相關 wiki 頁面。 Web 介面或命令列工具可用於實現對 pihole 的變更。
我們安裝所有 pihole 實用程序,以便內建 pihole 命令將透過docker exec <container> <command>
工作,如下所示:
docker exec pihole_container_name pihole updateGravity
docker exec pihole_container_name pihole -w spclient.wg.spotify.com
docker exec pihole_container_name pihole -wild example.com
如有需要,可自訂容器內的Web伺服器和DNS服務。當容器啟動或重新啟動時,或者如果您需要修改位於/etc/dnsmasq.d/01-pihole.conf
Pi-hole 配置,您批次掛載到/etc/dnsmasq.d/
任何設定檔將由 dnsmasq 載入/etc/dnsmasq.d/01-pihole.conf
。 docker 啟動腳本在啟動之前執行配置測試,因此它會告訴您 docker 日誌中的任何錯誤。
同樣,對於網頁伺服器,您可以在 /etc/lighttpd 中自訂配置
只要您的 docker 系統服務在啟動時自動啟動,並且您使用--restart=unless-stopped
運行容器,您的容器應該始終在啟動時啟動並在崩潰時重新啟動。如果您希望將 docker 容器作為 systemd 服務運行,請將檔案 pihole.service 新增至「/etc/systemd/system」;自訂容器名稱並從 docker 運行中刪除--restart=unless-stopped
。然後,在使用上面的 docker run 指令初始建立 docker 容器後,您可以使用「systemctl start pihole」或「systemctl stop pihole」(而不是docker start
/ docker stop
)來控制它。您也可以使用「systemctl enable pihole」使其在啟動時自動啟動(而不是--restart=unless-stopped
並確保 docker 服務在啟動時自動啟動)。
注意:初次運作後,您可能需要使用「docker stop pihole」手動停止 docker 容器,然後 systemctl 才能開始控制容器。
DNSMasq / FTLDNS 預計將有以下可用功能:
CAP_NET_BIND_SERVICE
:允許 FTLDNS 綁定到 1024 以下的 TCP/UDP 套接字(特別是連接埠 53 上的 DNS 服務)CAP_NET_RAW
:使用原始套接字和封包套接字(需要處理 DHCPv6 請求,並在租賃 IP 之前驗證 IP 未被使用)CAP_NET_ADMIN
:修改路由表和其他與網路相關的操作(特別是在鄰居表中插入條目以使用單播封包應答 DHCP 請求)CAP_SYS_NICE
:FTL 將自身設定為重要進程,以便在後者運作不足時獲得更多處理時間CAP_CHOWN
:我們需要能夠更改日誌檔案和資料庫的所有權,以防 FTL 作為與pihole
不同的使用者啟動該映像會自動將這些功能(如果可用)授予 FTLDNS 進程,即使以非 root 身分執行也是如此。
預設情況下,docker 不包含非特權容器的NET_ADMIN
功能,建議使用--cap-add=NET_ADMIN
明確將其新增至容器中。
但是,如果未使用 DHCP 和 IPv6 路由器通告,則可以安全地跳過它。對於最偏執的人來說,甚至應該可以明確刪除NET_RAW
功能以防止 FTLDNS 自動取得它。
我們注意到很多人使用 Watchtower 來維持 Pi-hole 容器的最新狀態。基於同樣的原因,我們不在裸機安裝上提供自動更新功能,您也不應該讓系統自動更新您的 Pi-hole 容器。特別是無人值守。儘管我們盡力確保不會出現任何問題,但有時確實會出現問題 - 您需要留出時間來手動拉取並更新到您希望運行的容器的版本。升級過程應遵循以下原則:
Pi-hole是你網路中不可或缺的一部分,不要因為半夜無人值守的更新而讓它崩潰。
當您懷疑與 docker 相關的問題時,請回報 GitHub 專案上的問題。 Pi-hole 或一般 docker 問題最好在我們的用戶論壇上得到解答。