WSL Ubuntu Docker 代理自動配置教程
WSL Ubuntu Docker 代理自動配置教程
背景說明
在 WSL2 環境下使用 Docker 時,由于網絡環境限制,經常需要通過 Windows 主機上的代理來訪問 Docker Hub。但每次 Windows 重啟后,WSL 獲取到的主機 IP 地址可能會發生變化,導致 Docker 代理配置失效。
本教程將幫你配置一個自動化方案,讓 Docker 在每次 WSL 啟動時都能自動獲取最新的 Windows 主機 IP 并配置代理。
解決的問題
- ? IP 地址動態變化:自動獲取最新的 Windows 主機 IP
- ? 開機自動配置:WSL 啟動時自動設置 Docker 代理
- ? 避免重復執行:只在系統層面執行一次,不會每次打開終端都重復設置
- ? 時序問題:確保在 Docker 啟動前就配置好代理
前提條件
- WSL2 Ubuntu 系統
- Docker 已安裝并可正常運行
- Windows 上運行著代理服務(本教程以 7890 端口為例)
配置步驟
步驟 1:創建代理配置腳本
創建專門用于 systemd 服務的 Docker 代理配置腳本:
# 創建腳本文件
nano ~/setup_docker_proxy_systemd.sh
腳本內容:
#!/bin/bash# 專門給 systemd 服務使用的 Docker 代理配置腳本
# 此腳本以 root 身份運行,不需要使用 sudo# 獲取 Windows 宿主機 IP
HOST_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
PROXY_PORT=7890echo "Setting up Docker proxy with Windows host IP: $HOST_IP:$PROXY_PORT"# 檢查代理是否可用(可選,失敗不會阻止執行)
if ! timeout 2 nc -z $HOST_IP $PROXY_PORT 2>/dev/null; thenecho "Warning: Proxy server not reachable at $HOST_IP:$PROXY_PORT"
fi# 創建 Docker systemd 代理配置文件
mkdir -p /etc/systemd/system/docker.service.d# 動態生成代理配置文件
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://${HOST_IP}:${PROXY_PORT}"
Environment="HTTPS_PROXY=http://${HOST_IP}:${PROXY_PORT}"
Environment="NO_PROXY=localhost,127.0.0.1,::1,10.0.0.0/8,192.168.0.0/16,172.16.0.0/12"
EOF# 重新加載 systemd 配置
systemctl daemon-reloadecho "Docker proxy configuration updated for host IP: $HOST_IP:$PROXY_PORT"
給腳本添加執行權限:
chmod +x ~/setup_docker_proxy_systemd.sh
步驟 2:創建 systemd 服務
創建 systemd 服務配置文件:
# 創建服務文件
nano ~/docker-proxy-update.service
服務文件內容:
[Unit]
Description=Update Docker proxy with current Windows host IP
After=network.target
Before=docker.service[Service]
Type=oneshot
ExecStart=/home/user/setup_docker_proxy_systemd.sh
RemainAfterExit=yes
User=root[Install]
WantedBy=multi-user.target
注意:請將 /home/user/
替換為你的實際用戶主目錄路徑。
步驟 3:安裝并啟用服務
# 復制服務文件到系統目錄
sudo cp docker-proxy-update.service /etc/systemd/system/# 重新加載 systemd 配置
sudo systemctl daemon-reload# 啟用服務(開機自啟)
sudo systemctl enable docker-proxy-update.service# 啟動服務進行測試
sudo systemctl start docker-proxy-update.service
步驟 4:驗證配置
檢查服務狀態:
# 查看服務狀態
sudo systemctl status docker-proxy-update.service# 查看生成的配置文件
cat /etc/systemd/system/docker.service.d/http-proxy.conf# 驗證 Docker 環境變量
sudo systemctl show docker --property=Environment
重啟 Docker 服務以應用配置:
sudo systemctl restart docker
步驟 5:測試 Docker 代理
測試是否能正常拉取鏡像:
# 測試拉取小鏡像
sudo docker pull hello-world# 測試拉取稍大的鏡像
sudo docker pull nginx:alpine
如果能成功拉取,說明代理配置成功!
清理舊配置(可選)
如果之前在 .bashrc
中配置過 Docker 代理,建議清理掉避免沖突:
# 編輯 .bashrc
nano ~/.bashrc# 刪除或注釋掉類似以下的行:
# ~/setup_docker_proxy.sh
# (~/setup_docker_proxy.sh > /dev/null 2>&1 &)
工作原理
- 啟動時機:WSL 啟動 → systemd 啟動 →
docker-proxy-update.service
運行 - IP 獲取:服務從
/etc/resolv.conf
動態獲取最新的 Windows 主機 IP - 配置生成:自動生成
/etc/systemd/system/docker.service.d/http-proxy.conf
文件 - Docker 應用:Docker 服務啟動時自動讀取代理配置
文件結構
配置完成后,相關文件分布如下:
/home/user/
├── setup_docker_proxy_systemd.sh # 代理配置腳本
└── docker-proxy-update.service # 服務配置文件(備份)/etc/systemd/system/
├── docker-proxy-update.service # systemd 服務文件
└── docker.service.d/└── http-proxy.conf # Docker 代理配置文件
故障排除
問題 1:服務啟動失敗
# 查看詳細錯誤信息
sudo journalctl -u docker-proxy-update.service -f
問題 2:代理不生效
# 檢查代理服務器是否可達
nc -z $(cat /etc/resolv.conf | grep nameserver | awk '{print $2}') 7890# 手動重新運行配置腳本
sudo ~/setup_docker_proxy_systemd.sh# 重啟 Docker
sudo systemctl restart docker
問題 3:IP 地址變化后代理失效
由于服務只在啟動時運行一次,如果 Windows 重啟后 IP 變化,需要:
# 重新運行服務
sudo systemctl start docker-proxy-update.service# 或者重啟 WSL(推薦)
自定義配置
修改代理端口
如果你的代理端口不是 7890,修改腳本中的 PROXY_PORT
變量:
# 編輯腳本
nano ~/setup_docker_proxy_systemd.sh# 修改這一行
PROXY_PORT=你的端口號
添加更多 NO_PROXY 地址
如果需要排除更多地址不走代理,修改腳本中的 NO_PROXY
環境變量。
驗證清單
- 腳本文件已創建并有執行權限
- systemd 服務已安裝并啟用
- 服務運行狀態正常
- Docker 配置文件已生成
- Docker 能成功拉取鏡像
- 重啟 WSL 后代理仍然生效
總結
通過這個配置方案,你的 WSL Ubuntu Docker 將能夠:
- 自動適應 IP 變化:每次啟動都獲取最新的 Windows 主機 IP
- 開機即可用:無需手動配置,WSL 啟動后 Docker 代理自動生效
- 一次配置,長期使用:無需重復操作,穩定可靠
現在你可以愉快地使用 docker pull
命令,無論何時重啟都不用擔心代理配置問題了!