自宅のネットワークで広告やトラッカーを根こそぎブロックしたい——そんな方に試してほしいのが Pi-hole(パイホール) です。
Pi-hole は DNS レベルで広告ドメインへのアクセスをブロックするツールです。ブラウザの拡張機能とは異なり、スマホやスマートTV、ゲーム機などネットワーク上のすべての端末に効果があります。
この記事では Ubuntu 24.04 LTS 上に Pi-hole を Docker で構築し、実際に起動させたときの画面と数値を載せます。本記事では pihole/pihole:latest(Core v6.4.2 / FTL v6.6.2)を Docker 29.2.1 で実行した結果を使っています。
この記事のポイント
- Docker を使えば Ubuntu への Pi-hole 導入が
docker run一発で完了する - Pi-hole は起動直後から 84,973 ドメイン(StevenBlack/hosts リスト)を広告ドメインとしてブロック
- Web 管理画面でクエリログ・ブロック数・DNS 設定をブラウザから操作できる
- VPS や自宅サーバーに入れれば、ネットワーク全体の広告ブロッカーとして機能する
- Pi-hole v6 系ではパスワードは Docker ログから取得する(環境変数の扱いが変わった)
目次
- Pi-hole とは何か
- 前提環境と準備
- Docker のインストール
- Pi-hole を起動する
- Web 管理画面にアクセスする
- 管理画面の基本的な使い方
- 端末の DNS を Pi-hole に向ける
- ブロックリストを更新する
- よくあるエラーと解決策
- まとめ
Pi-hole とは何か
Pi-hole は DNS シンクホール(DNS Sinkhole)と呼ばれる仕組みで動作するネットワーク広告ブロッカーです。
通常、パソコンやスマホが「ads.example.com」にアクセスしようとすると、まず DNS サーバーに IP アドレスを問い合わせます。Pi-hole はその DNS サーバー役を担い、広告・トラッカードメインへの問い合わせには「存在しない(0.0.0.0)」と答えることでブロックします。

ブラウザの広告ブロック拡張機能と違い、Pi-hole は ネットワーク全体に効く のが最大の特徴です。スマホのアプリ広告、スマートTV のトラッキング、IoT 機器の余計な通信もまとめてブロックできます。
前提環境と準備
この記事で使用した環境は以下のとおりです。
| 項目 | バージョン / 内容 |
|---|---|
| OS | Ubuntu 24.04.4 LTS (Noble Numbat) |
| Docker | 29.2.1 |
| Pi-hole イメージ | pihole/pihole:latest(Core v6.4.2 / Web v6.5 / FTL v6.6.2) |
| 検証日 | 2026-06-13 |
| 実行環境 | Docker コンテナ(ubuntu:24.04 ベース + pihole/pihole イメージ) |
注意
Pi-hole は ポート 53(DNS) を使います。同じポートを使う別のサービス(systemd-resolved など)が動いている場合は、事前に停止が必要です。また、ポート 53 はルーターの設定で全端末に向ける必要があるため、VPS よりも自宅ルーターに接続できるサーバーでの運用が最も効果的です。
必要なものをまとめます。
- Ubuntu 24.04 LTS が動いているサーバー(自宅サーバー・VPS いずれも可)
- Docker がインストール済み(次のセクションで手順を説明します)
sudo権限を持つユーザー
Docker のインストール
Ubuntu 24.04 に Docker をインストールします。Ubuntu 公式リポジトリには docker.io パッケージがあります。
Hit:1 http://ports.ubuntu.com/ubuntu-ports noble InRelease
Reading package lists… Done
$ sudo apt install -y docker.io
Reading package lists… Done
The following NEW packages will be installed:
docker.io …
Setting up docker.io (26.1.3-0ubuntu1~24.04.1) …
$ sudo systemctl enable –now docker
$ sudo usermod -aG docker $USER
# ログアウト→再ログインして docker グループを有効化
$ docker –version
Docker version 29.2.1, build a5c7197
docker --version でバージョンが表示されれば Docker のインストール完了です。
補足
sudo usermod -aG docker $USER を実行した後は、一度ログアウトして再ログインしないと docker コマンドを sudo なしで使えません。再ログイン後に docker ps が正常に動けば設定完了です。
Pi-hole を起動する
Pi-hole の Docker イメージを取得して起動します。docker run 一行で完結するのが Docker 運用の便利なところです。

> –name pihole \
> -p 53:53/udp -p 53:53/tcp \
> -p 80:80 \
> -e TZ=Asia/Tokyo \
> -e PIHOLE_DNS_=8.8.8.8;8.8.4.4 \
> -v pihole_etc:/etc/pihole \
> -v pihole_dnsmasq:/etc/dnsmasq.d \
> –dns 127.0.0.1 –dns 8.8.8.8 \
> pihole/pihole:latest
Unable to find image ‘pihole/pihole:latest’ locally
latest: Pulling from pihole/pihole
Status: Downloaded newer image for pihole/pihole:latest
356f5160a22b8a1c2d3e4f5…
各オプションの意味を説明します。
| オプション | 説明 |
|---|---|
-p 53:53/udp-p 53:53/tcp |
DNS サーバー用ポート。全端末からの DNS クエリをここで受ける |
-p 80:80 |
Web 管理画面用ポート。ブラウザからアクセスするために必要 |
-e TZ=Asia/Tokyo |
タイムゾーンを日本時間に設定(クエリログの時刻が日本時間になる) |
-e PIHOLE_DNS_=8.8.8.8;8.8.4.4 |
上流 DNS サーバー。Google DNS を指定(後から Web UI で変更可能) |
-v pihole_etc:/etc/pihole |
設定ファイルの永続化。コンテナを削除しても設定が残る |
手順1:パスワードを確認する(Pi-hole v6)
Pi-hole v6 では、WEBPASSWORD 環境変数を指定しなかった場合、ランダムなパスワードが自動生成されてコンテナログに表示されます。
[i] No password set in environment or config file, assigning random password: ZQoraGkh
このパスワード(上の例では ZQoraGkh)を Web 管理画面のログインに使います。パスワードを固定したい場合は、docker run に -e WEBPASSWORD=your_password を追加してください。
手順2:起動を確認する

Core version is v6.4.2 (Latest: v6.4.2)
Web version is v6.5 (Latest: v6.5)
FTL version is v6.6.2 (Latest: v6.6.2)
$ docker exec pihole pihole status
[✓] FTL is listening on port 53
[✓] UDP (IPv4)
[✓] TCP (IPv4)
[✓] UDP (IPv6)
[✓] TCP (IPv6)
[✓] Pi-hole blocking is enabled
「FTL is listening on port 53」と「Pi-hole blocking is enabled」が表示されれば、Pi-hole は正常に稼働しています。
Web 管理画面にアクセスする
ブラウザで http://サーバーのIPアドレス/admin/ にアクセスします。ローカルで動かしている場合は http://localhost/admin/ です。

ログイン画面(上図)が表示されたら、先ほど確認したパスワードを入力して「Log in (uses cookie)」ボタンをクリックします。
補足
Pi-hole v6 ではログインに HTTP Cookie を使います。ログイン画面に「uses cookie」と書いてあるのはそのためです。プライベートブラウズモードではセッションが切れやすいので、通常モードでアクセスすることをおすすめします。
管理画面の基本的な使い方
①ダッシュボードで統計を確認する
ログイン後に表示されるダッシュボードには、Pi-hole の稼働状態がリアルタイムで表示されます。


上図は起動から約5分後の実測データです。主要な指標は以下の4つです。
| 指標 | 実測値(起動5分後) | 説明 |
|---|---|---|
| Total Queries(総クエリ) | 22 | Pi-hole を経由した DNS 問い合わせの総数 |
| Queries Blocked(ブロック済み) | 0 | 広告ドメインとしてブロックした件数(新規インストール直後) |
| Domains on Lists(ブロックリスト) | 84,973 | StevenBlack/hosts から自動取得したブロック対象ドメイン数 |
| キャッシュ応答 | 15(68%) | キャッシュから直接応答した件数(繰り返しクエリを高速処理) |
正直、起動直後のブロック数が 0 なのは当然です——まだ DNS サーバーとして設定していないからです。端末の DNS を Pi-hole に向けると、徐々にブロック数が増えていきます。
②クエリログで何がブロックされているか確認する
左メニューの「Query Log」から、Pi-hole が処理した DNS クエリの一覧を確認できます。

実際の画面(上図)では、api.github.com や github.com への DNS クエリが記録されています。応答時間は A レコードで 0.2ms〜8.3µs と非常に高速です。緑のアイコンは「通常(ブロックなし)」、赤のアイコンは「ブロック済み」を示します。
③DNS 設定で上流 DNS サーバーを変更する
「Settings → DNS」から上流 DNS サーバーを変更できます。デフォルトは Google(8.8.8.8)ですが、プライバシーを重視するなら Quad9 や Cloudflare(1.1.1.1)への変更を検討してください。

上図では Google(ECS, DNSSEC)が選択されています。DNSSEC(DNS の改ざん防止機能)が有効なプリセットを使うと、セキュリティが向上します。
端末の DNS を Pi-hole に向ける
Pi-hole を実際に機能させるには、端末の DNS サーバーアドレスを Pi-hole のサーバー IP に変更する必要があります。
方法①:ルーターで一括設定(全端末に効く・推奨)
ルーターの管理画面にある「DNS サーバー設定」を Pi-hole の IP アドレスに変更します。こうするとルーター配下のすべての端末に自動的に Pi-hole が適用されます。
セカンダリ DNS サーバー: 8.8.8.8 ← Pi-hole が落ちたときの予備
方法②:特定のPCだけに設定(テスト用)
Ubuntu PC の場合は /etc/resolv.conf を編集、または NetworkManager の DNS 設定を変更します。
$ resolvectl status | grep -A3 eth0
Link 2 (eth0)
Current DNS Server: 192.168.1.100
注意
Pi-hole が停止すると DNS が解決できなくなり、インターネットに繋がらなくなります。セカンダリ DNS に 8.8.8.8 や 1.1.1.1 を設定しておくと、Pi-hole が落ちても繋がり続けます(ただしブロックは無効になります)。
ブロックリストを更新する
Pi-hole のブロックリスト(Gravity)は手動または定期的に更新できます。新しい広告ドメインへの対応を最新に保つために、定期更新をおすすめします。

[✓] DNS resolution is available
[i] Neutrino emissions detected…
[✓] Preparing new gravity database
[✓] Pulling blocklist source list into range
[i] Target: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
[✓] Parsed 84973 exact domains and 0 ABP-style domains
[i] Number of gravity domains: 84973 (84973 unique domains)
実際に実行すると、StevenBlack/hosts から 84,973 ドメインを取得してデータベースを更新します。更新は数十秒で完了します。
自動更新を設定するには、コンテナ内の crontab を使います(Pi-hole v6 はデフォルトで自動更新スケジュールが設定されています)。
よくあるエラーと解決策
エラー①:ポート 53 が使用中
Bind for 0.0.0.0:53 failed: port is already allocated
原因: Ubuntu の systemd-resolved がポート 53 を使っています。
解決策: systemd-resolved のポート 53 リッスンを無効にします。
# [Resolve] セクションに以下を追加
DNSStubListener=no
$ sudo systemctl restart systemd-resolved
$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
エラー②:Web 管理画面にアクセスできない
UFW(ファイアウォール)が有効な場合、ポート 80 を開放していないとアクセスできません。
$ sudo ufw allow 53/udp
$ sudo ufw allow 80/tcp
$ sudo ufw status
53/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
エラー③:Pi-hole v6 でパスワードが通らない
Pi-hole v6 では -e WEBPASSWORD=xxx の環境変数名が変更されました。v6 で確実にパスワードを設定するには以下の方法を使います。
[✓] New password set
または、起動時のコンテナログからランダムパスワードを確認します。
[i] No password set in environment or config file, assigning random password: ZQoraGkh
エラー④:ブロックしすぎて困ったサイトが開かない
誤ってブロックされているドメインは、管理画面の「Domains」メニューから個別に 許可リスト(Allowlist) に追加できます。
[✓] example.com has been added to the allowlist
$ docker exec pihole pihole allowlist
example.com
まとめ
Ubuntu 24.04 LTS に Docker を使って Pi-hole を構築する手順を説明しました。
- Pi-hole は
docker run一行で起動でき、Core v6.4.2 / FTL v6.6.2 で確認済み - 起動直後から StevenBlack/hosts の 84,973 ドメインをブロック対象として自動取得する
- Web 管理画面でクエリログ・DNS 設定・ブロックリストをブラウザから管理できる
- ルーターの DNS 設定を変更するだけで、家中の全端末に広告ブロックが効く
- Pi-hole v6 ではコンテナログからパスワードを確認するか、
pihole setpasswordで設定する
Pi-hole は VPS に入れても動きますが、ネットワーク全体に効かせるには家庭内の常時起動サーバーやルーターに近い機器への設置が最も効果的です。まずは自宅の古い PC や Raspberry Pi で試してみてください。
本格的に Linux サーバーを運用するなら、VPS を借りて手元の環境と使い分けるのもおすすめです。VPS おすすめ比較記事も参考にしてみてください。


コメント