透過 Docker 守護進程全域設定統一團隊開發環境
無論是在本機還是伺服器上使用 Docker,往往會在每個專案的 docker-compose.yml 裡重複貼上相同的設定。
- 把 DNS 固定為
1.1.1.1、8.8.8.8 - 設定日誌驅動為
json-file並加上max-size=10m - 設定代理、insecure registry、預設網路範圍等…
這些設定其實不需要在每個容器裡重複,而是可以透過「主機整體預設值」來管理,這樣更容易維護。
這個角色正是 Docker 守護進程全域設定(daemon.json)。
以下整理了:
- 需要建立哪個檔案
- 放在哪裡
- 如何撰寫
- 何時、誰會受益
1. Docker 守護進程設定方式
Docker 守護進程(dockerd)主要有兩種設定方式:
- JSON 設定檔(
daemon.json) ← 建議 - 在執行
dockerd時透過 CLI 旗標 傳遞選項
雖然可以混用,但 同一個選項同時在旗標與 daemon.json 中設定會導致守護進程無法啟動。例如同時設定 --log-driver 與 daemon.json 中的日誌驅動,Docker 會在啟動階段報錯並終止。
為了團隊或伺服器環境的一致性,通常建議:
“盡量把所有設定集中在
daemon.json,旗標只保留必要的最小設定”。
2. daemon.json 的位置
以下表格列出不同作業系統與安裝方式的預設位置:
| 環境 | 預設路徑 | 備註 |
|---|---|---|
| Linux(一般安裝) | /etc/docker/daemon.json |
最常見的情況 |
| Linux(snap 版) | /var/snap/docker/current/config/daemon.json |
Ubuntu snap 套件 |
| Windows Server / Docker Engine | C:\ProgramData\Docker\config\daemon.json |
可能需要管理員權限 |
| Docker Desktop(Mac / Windows) | ~/.docker/daemon.json |
Desktop 內部實際路徑 |
- 這個檔案預設可能不存在,若不存在請自行建立。
- 在團隊或伺服器標準化時,通常以 Linux 伺服器的
/etc/docker/daemon.json為基準說明。
3. 基本使用流程:
- 編寫/修改
daemon.json
{
"dns": ["1.1.1.1", "8.8.8.8"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- 先驗證設定檔是否正確
sudo dockerd --validate --config-file=/etc/docker/daemon.json
# 若顯示 configuration OK,表示設定無誤
- 重啟 Docker 守護進程
sudo systemctl restart docker
從此以後,所有新啟動的容器若未另行設定,將自動繼承這些全域設定。
4. 範例 1 – 全域固定 DNS
4.1 為什麼要全域固定 DNS?
若容器經常出現「無法解析外部 API」或「內部域名無法解析」等問題,往往是因為宿主機的 DNS 設定不一致。
- 團隊想統一使用 Cloudflare DNS(
1.1.1.1) - 公司內部 DNS 只能透過內部伺服器存取
此時,將 DNS 設定放在 daemon.json 而非每個 docker-compose.yml,會更方便。
4.2 設定範例(daemon.json)
{
"dns": ["1.1.1.1", "8.8.8.8"]
}
若已有 daemon.json,只需在根物件中加入 "dns": [...],注意逗號位置。
⚠️ 注意:DNS 設定會反映到容器內的
/etc/resolv.conf。已在執行的容器不會立即更新,僅新啟動的容器才會套用。
4.3 適用對象
- 有內部代理或內部 DNS 的公司開發者
- 多雲環境中需要強制使用特定 DNS 的平台團隊
- 在多 VPN 之間切換的個人開發者
5. 範例 2 – 日誌驅動與選項全域設定
容器日誌預設透過 json-file 驅動寫入 /var/lib/docker/containers/...。若在全域設定中調整,則可一次性為所有容器套用:
- 日誌格式
- 日誌儲存位置
- 日誌輪轉策略
5.1 基本 json-file + 輪轉
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
這樣設定後: - 每個容器的日誌檔案最大 10MB - 只保留 5 個檔案,超過者自動刪除
5.2 中央日誌收集驅動(如 Fluentd、journald 等)
平台或基礎設施團隊常需要將所有容器日誌送至中央日誌系統。
Fluentd 範例
{
"log-driver": "fluentd",
"log-opts": {
"fluentd-address": "localhost:24224",
"tag": "{{.Name}}"
}
}
journald 範例
{
"log-driver": "journald",
"log-opts": {
"tag": "{{.Name}}"
}
}
使用 journald 可將 Docker 日誌與系統日誌統一管理,透過 journalctl 進行查詢、過濾與保留策略設定。
5.3 與 Compose / docker run 的關係
- 全域
log-driver+log-opts:作為預設值 - 若容器在 Compose 的
logging:或docker run的--log-driver、--log-opt指定,僅該容器會覆寫全域設定
建議:
- 通用設定放在 daemon.json
- 特殊服務再單獨覆寫
6. 範例 3 – 代理、insecure registry 等全域網路設定
6.1 代理設定
若公司只能透過代理上網,建議在守護進程層面設定,避免每次都手動輸入環境變數:
{
"proxies": {
"http-proxy": "http://proxy.example.com:3128",
"https-proxy": "http://proxy.example.com:3128",
"no-proxy": "localhost,127.0.0.1,.corp.example.com"
}
}
此設定會在拉取映像或建構時自動使用代理。
6.2 insecure registry
若必須使用無 TLS 的內部 Registry,請小心使用:
{
"insecure-registries": ["my-registry.local:5000"]
}
僅在內部測試環境使用,避免安全風險。
7. 範例 4 – 基本網路範圍、儲存驅動等
7.1 自訂預設 bridge 網路範圍
為避免 VPN 或內部網路衝突,可設定:
{
"default-address-pools": [
{
"base": "10.20.0.0/16",
"size": 24
}
]
}
這樣 Docker 產生的新 bridge 網路會使用 10.20.x.0/24。
7.2 強制儲存驅動
若團隊統一使用 overlay2,可設定:
{
"storage-driver": "overlay2"
}
實際支援的儲存驅動取決於 OS/Kernel,請參考
dockerd文件與發行版指南。
8. 何時、誰會特別受益?
8.1 個人開發者
- 在多個側專案中使用相同 Docker 選項
- VPN、代理頻繁切換
- 本機日誌/磁碟管理繁瑣
→ 只需一個 daemon.json,即可統一環境並消除重複設定。
8.2 小型/中型開發團隊
- 成員間因本機 Docker 設定不同而產生「在我機器上能跑、在你機器上不行」的問題
- 想讓 CI 與本機環境的網路/日誌設定盡量一致
- 想強制使用公司標準 DNS、代理、Registry
→ 在 daemon.json 中定義團隊規範,並透過 Ansible、Chef、Terraform、Cloud‑Init 等工具分發,能更乾淨地維護。
8.3 平台團隊 / DevOps / SRE
- 在數十至數百個容器節點上
- 需要統一管理日誌、儲存、網路政策
- 需要以主機為基準標準化安全規則
→ daemon.json 成為「Docker 節點政策檔」的核心。
9. 故障排除小技巧
- 旗標與重複設定
- 檢查 systemd 單元檔(如
/lib/systemd/system/docker.service)是否已經傳遞相同旗標 - 同時在旗標與daemon.json中設定同一選項會導致守護進程失敗 - Docker Desktop 的 GUI
- Desktop 透過 UI 變更設定時,實際會寫入
~/.docker/daemon.json- 若手動編輯此檔,UI 可能覆蓋,建議統一使用其中一種方式
總結
- Docker 的全域預設值由
daemon.json管理。 - 位置:
- Linux:
/etc/docker/daemon.json - Windows:
C:\ProgramData\Docker\config\daemon.json - Docker Desktop:
~/.docker/daemon.json - 常見全域設定:
- DNS:
"dns": ["1.1.1.1", "8.8.8.8"] - 日誌驅動:
"log-driver": "json-file"、"log-opts": {...} - 代理、insecure registry、預設網路範圍、儲存驅動等
- 全域設定能為個人開發者帶來便利,為團隊與平台團隊帶來環境一致性與故障減少。
如果你在 docker-compose.yml 或 docker run 中重複使用相同選項,現在正是把它們搬到 daemon.json 的好時機。

目前沒有評論。