透過 Docker 守護進程全域設定統一團隊開發環境

無論是在本機還是伺服器上使用 Docker,往往會在每個專案的 docker-compose.yml 裡重複貼上相同的設定。

  • 把 DNS 固定為 1.1.1.18.8.8.8
  • 設定日誌驅動為 json-file 並加上 max-size=10m
  • 設定代理、insecure registry、預設網路範圍等…

這些設定其實不需要在每個容器裡重複,而是可以透過「主機整體預設值」來管理,這樣更容易維護。

這個角色正是 Docker 守護進程全域設定(daemon.json

以下整理了:

  • 需要建立哪個檔案
  • 放在哪裡
  • 如何撰寫
  • 何時、誰會受益

1. Docker 守護進程設定方式



Docker 守護進程(dockerd)主要有兩種設定方式:

  1. JSON 設定檔(daemon.json建議
  2. 在執行 dockerd 時透過 CLI 旗標 傳遞選項

雖然可以混用,但 同一個選項同時在旗標與 daemon.json 中設定會導致守護進程無法啟動。例如同時設定 --log-driverdaemon.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. 基本使用流程:



  1. 編寫/修改 daemon.json
{
  "dns": ["1.1.1.1", "8.8.8.8"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
  1. 先驗證設定檔是否正確
sudo dockerd --validate --config-file=/etc/docker/daemon.json
# 若顯示 configuration OK,表示設定無誤
  1. 重啟 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. 故障排除小技巧

  1. 旗標與重複設定 - 檢查 systemd 單元檔(如 /lib/systemd/system/docker.service)是否已經傳遞相同旗標 - 同時在旗標與 daemon.json 中設定同一選項會導致守護進程失敗
  2. 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.ymldocker run 中重複使用相同選項,現在正是把它們搬到 daemon.json 的好時機。

image of docker daemon json setting