簡單記一下如何 Ubuntu 設定 Docker 透過 HTTP Proxy 抓取映像檔,在無法直接連網環境的求生技巧。

做法也簡單,先建立 /etc/systemd/system/docker.service.d 目錄,sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf 寫入以下內容:

[Service]
Environment="HTTP_PROXY=http://your_proxy_ip:port"
Environment="HTTPS_PROXY=http://your_proxy_ip:port"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.local"

接著重新載入並重啟 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

若 HTTP Proxy 有置換成自己簽發的 CA 根憑證,記得透過以下程序加入系統信任區:(學到新指令 install,-D 可自動建立目錄、-m 0644 設定擁有者可讀寫,其他人唯讀,一次搞定)

sudo install -D -m 0644 proxy-root-ca.pem /usr/local/share/ca-certificates/proxy.root-ca.crt
sudo update-ca-certificates

補充記錄用 openssl 擷取及驗證 HTTP Proxy 憑證的小技巧:

# 先透過 Proxy 連 Google,用 showcerts 顯示憑證內容
openssl s_client -proxy your_proxy_ip:port -connect google.com:443 -showcerts </dev/null 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > proxy-root-ca.crt

如此 docker pull 時就能順利透過 HTTP Proxy 上網抓取映像檔囉~

【同場加映】若要該 Ubuntu 用 docker build 建置 .NET / ASP.NET Core Docker 容器,編譯時 NuGet Restore 需要設定 HTTP Proxy。以下是範例:

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src

ARG HTTP_PROXY

COPY my-app.csproj ./
# 只在本次 RUN 期間掛載檔案,使用 BuildKit 的 secret 功能,預設出現在 /run/secrets,不寫入 Image
RUN --mount=type=secret,id=proxy_ca,required=true \
    install -m 0644 /run/secrets/proxy_ca /usr/local/share/ca-certificates/proxy.root-ca.crt && \
    update-ca-certificates && \
    HTTP_PROXY="$HTTP_PROXY" \
    HTTPS_PROXY="$HTTP_PROXY" \
    http_proxy="$HTTP_PROXY" \
    https_proxy="$HTTP_PROXY" \
    dotnet restore

COPY . ./
RUN dotnet publish -c Release -o /app/publish --no-restore \
    /p:UseAppHost=false

FROM mcr.microsoft.com/dotnet/runtime:10.0 AS final
WORKDIR /app

# 如果容器運行期間也需要透過 Proxy 對外發送請求,加入以下這段設定
ARG HTTP_PROXY
ENV HTTP_PROXY="$HTTP_PROXY" \
    HTTPS_PROXY="$HTTP_PROXY" \
    http_proxy="$HTTP_PROXY" \
    https_proxy="$HTTP_PROXY"
COPY --from=build /usr/local/share/ca-certificates/proxy.root-ca.crt /usr/local/share/ca-certificates/proxy.root-ca.crt
RUN update-ca-certificates

COPY --from=build /app/publish ./
EXPOSE 12345

ENTRYPOINT ["dotnet", "my-app.dll"]

而建置參數為 docker build --add-host=host.docker.internal:host-gateway --build-arg HTTP_PROXY=http://host.docker.internal:8000 --secret id=proxy_ca,src=proxy.root-ca.crt .

補上說明:

  1. 憑證透過 BuildKit secret 傳遞,docker build --secret id=proxy_ca,src=rootCert.crt 將 proxy.root-ca.crt 暫時掛載為 BuildKit secret,在 Dockerfile 則透過 --mount=type=secret,id=proxy_ca 取得檔案。
    註:BuildKit 的 secret 功能是 Docker 為映像檔建置提供的敏感資料(例如私密憑證、API 金鑰、SSH 金鑰、資料庫密碼等)安全機制,其優點是不會寫入 Docker 映象檔或歷史記錄,比 ARG/ENV 更安全。
  2. 要讓 Docker 存取宿主機 IP,做法是用 --add-host=host.docker.internal:host-gateway 將 host.docker.internal 指向宿主機,HTTP Proxy Url 則以 --build-arg HTTP_PROXY=http://host.docker.internal:8000 參數方式傳入,在 Dockerfile 以變數 $HTTP_PROXY 取用。
  3. 複製 Root CA 憑證、update-ca-certificates、設定 HTTP_PROXY 等環境變數的方式與在 Ubuntu 宿主相同。
  4. 若執行時也要透過 HTTP Proxy 對外存取網站,則 runtime 時也要安裝憑證及設定 HTTP_PROXY 等環境變數。
  5. 建議 HTTP_PROXY 及 http_proxy 都要設定,許多 Linux 工具、系統級套件或 POSIX 標準程式習慣讀取大寫,而 Python 的 requests、Node.js、cURL 等或 Linux 內的網頁瀏覽工具預設會優先讀取小寫。

Configure Docker on Ubuntu to pull images through an HTTP proxy, trust a custom CA certificate, and verify proxy certificates with OpenSSL. Also learn to build .NET containers using proxy settings, BuildKit secrets, and host access without exposing sensitive certificates in image history.


Comments

Be the first to post a comment

Post a comment